7
7
"os"
8
8
"path"
9
9
"strings"
10
+ "sync"
10
11
"text/template"
11
12
"time"
12
13
)
@@ -21,11 +22,14 @@ type dump struct {
21
22
DumpVersion string
22
23
ServerVersion string
23
24
CompleteTime string
24
- HeaderTmpl * template.Template
25
- TableTmpl * template.Template
26
- FooterTmpl * template.Template
27
- Connection * sql.DB
28
25
Out io.Writer
26
+ Connection * sql.DB
27
+
28
+ headerTmpl * template.Template
29
+ tableTmpl * template.Template
30
+ footerTmpl * template.Template
31
+ mux sync.Mutex
32
+ wg sync.WaitGroup
29
33
}
30
34
31
35
const version = "0.3.1"
@@ -38,7 +42,7 @@ const headerTmpl = `-- Go SQL Dump {{ .DumpVersion }}
38
42
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
39
43
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
40
44
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
41
- SET NAMES utf8mb4;
45
+ SET NAMES utf8mb4 ;
42
46
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
43
47
/*!40103 SET TIME_ZONE='+00:00' */;
44
48
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
@@ -52,9 +56,9 @@ const tableTmpl = `
52
56
-- Table structure for table {{ .Name }}
53
57
--
54
58
55
- DROP TABLE IF EXISTS ` + "` {{ .Name }}`" + ` ;
59
+ DROP TABLE IF EXISTS {{ .Name }};
56
60
/*!40101 SET @saved_cs_client = @@character_set_client */;
57
- SET character_set_client = utf8mb4;
61
+ SET character_set_client = utf8mb4 ;
58
62
{{ .SQL }};
59
63
/*!40101 SET character_set_client = @saved_cs_client */;
60
64
@@ -72,30 +76,40 @@ UNLOCK TABLES;
72
76
`
73
77
74
78
const footerTmpl = `
79
+ /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
80
+
81
+ /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
82
+ /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
83
+ /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
84
+ /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
85
+ /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
86
+ /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
87
+ /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
88
+
75
89
-- Dump completed on {{ .CompleteTime }}
76
90
`
77
91
78
92
func (data * dump ) getTemplates () (err error ) {
79
93
// Write dump to file
80
- data .HeaderTmpl , err = template .New ("mysqldumpHeader" ).Parse (headerTmpl )
94
+ data .headerTmpl , err = template .New ("mysqldumpHeader" ).Parse (headerTmpl )
81
95
if err != nil {
82
96
return
83
97
}
84
98
85
- data .TableTmpl , err = template .New ("mysqldumpTable" ).Parse (tableTmpl )
99
+ data .tableTmpl , err = template .New ("mysqldumpTable" ).Parse (tableTmpl )
86
100
if err != nil {
87
101
return
88
102
}
89
103
90
- data .FooterTmpl , err = template .New ("mysqldumpTable" ).Parse (footerTmpl )
104
+ data .footerTmpl , err = template .New ("mysqldumpTable" ).Parse (footerTmpl )
91
105
if err != nil {
92
106
return
93
107
}
94
108
return
95
109
}
96
110
97
111
func (data * dump ) dump () error {
98
- if err := data .HeaderTmpl .Execute (data .Out , data ); err != nil {
112
+ if err := data .headerTmpl .Execute (data .Out , data ); err != nil {
99
113
return err
100
114
}
101
115
@@ -106,20 +120,17 @@ func (data *dump) dump() error {
106
120
}
107
121
108
122
// Get sql for each table
123
+ data .wg .Add (len (tables ))
109
124
for _ , name := range tables {
110
125
if err := data .dumpTable (name ); err != nil {
111
126
return err
112
127
}
113
128
}
129
+ data .wg .Wait ()
114
130
115
131
// Set complete time
116
132
data .CompleteTime = time .Now ().String ()
117
-
118
- if err = data .FooterTmpl .Execute (data .Out , data ); err != nil {
119
- return err
120
- }
121
-
122
- return nil
133
+ return data .footerTmpl .Execute (data .Out , data )
123
134
}
124
135
125
136
func (data * dump ) dumpTable (name string ) error {
@@ -128,13 +139,18 @@ func (data *dump) dumpTable(name string) error {
128
139
return err
129
140
}
130
141
131
- if err = data .TableTmpl .Execute (data .Out , table ); err != nil {
132
- return err
133
- }
134
-
142
+ go data .writeTable (table )
135
143
return nil
136
144
}
137
145
146
+ func (data * dump ) writeTable (table * table ) error {
147
+ data .mux .Lock ()
148
+ err := data .tableTmpl .Execute (data .Out , table )
149
+ data .mux .Unlock ()
150
+ data .wg .Done ()
151
+ return err
152
+ }
153
+
138
154
// Dump creates a MySQL dump based on the options supplied through the dumper.
139
155
func (d * Dumper ) Dump () (string , error ) {
140
156
name := time .Now ().Format (d .format )
@@ -209,7 +225,7 @@ func getServerVersion(db *sql.DB) (string, error) {
209
225
210
226
func createTable (db * sql.DB , name string ) (* table , error ) {
211
227
var err error
212
- t := & table {Name : name }
228
+ t := & table {Name : "`" + name + "`" }
213
229
214
230
if t .SQL , err = createTableSQL (db , name ); err != nil {
215
231
return nil , err
0 commit comments