5
5
"errors"
6
6
"fmt"
7
7
"io"
8
- "os"
9
- "path"
10
8
"reflect"
11
9
"strings"
12
10
"sync"
@@ -20,12 +18,11 @@ type table struct {
20
18
Values string
21
19
}
22
20
23
- type dump struct {
24
- DumpVersion string
25
- ServerVersion string
26
- CompleteTime string
27
- Out io.Writer
28
- Connection * sql.DB
21
+ // Data struct to configure dump behavior
22
+ type Data struct {
23
+ Out io.Writer
24
+ Connection * sql.DB
25
+ IgnoreTables []string
29
26
30
27
headerTmpl * template.Template
31
28
tableTmpl * template.Template
@@ -34,6 +31,12 @@ type dump struct {
34
31
wg sync.WaitGroup
35
32
}
36
33
34
+ type metaData struct {
35
+ DumpVersion string
36
+ ServerVersion string
37
+ CompleteTime string
38
+ }
39
+
37
40
const version = "0.3.2"
38
41
39
42
const headerTmpl = `-- Go SQL Dump {{ .DumpVersion }}
@@ -90,32 +93,27 @@ const footerTmpl = `/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
90
93
-- Dump completed on {{ .CompleteTime }}
91
94
`
92
95
93
- func (data * dump ) getTemplates () (err error ) {
94
- // Write dump to file
95
- data .headerTmpl , err = template .New ("mysqldumpHeader" ).Parse (headerTmpl )
96
- if err != nil {
97
- return
96
+ // Dump data using struct
97
+ func (data * Data ) Dump () error {
98
+ meta := metaData {
99
+ DumpVersion : version ,
98
100
}
99
101
100
- data . tableTmpl , err = template . New ( "mysqldumpTable" ). Parse ( tableTmpl )
101
- if err != nil {
102
- return
102
+ // Get server version
103
+ if err := meta . updateServerVersion ( data . Connection ); err != nil {
104
+ return err
103
105
}
104
106
105
- data .footerTmpl , err = template .New ("mysqldumpTable" ).Parse (footerTmpl )
106
- if err != nil {
107
- return
107
+ if err := data .getTemplates (); err != nil {
108
+ return err
108
109
}
109
- return
110
- }
111
110
112
- func (data * dump ) dump () error {
113
- if err := data .headerTmpl .Execute (data .Out , data ); err != nil {
111
+ if err := data .headerTmpl .Execute (data .Out , meta ); err != nil {
114
112
return err
115
113
}
116
114
117
115
// Get tables
118
- tables , err := getTables ( data .Connection )
116
+ tables , err := data .getTables ( )
119
117
if err != nil {
120
118
return err
121
119
}
@@ -130,12 +128,16 @@ func (data *dump) dump() error {
130
128
data .wg .Wait ()
131
129
132
130
// Set complete time
133
- data .CompleteTime = time .Now ().String ()
134
- return data .footerTmpl .Execute (data .Out , data )
131
+ meta .CompleteTime = time .Now ().String ()
132
+ return data .footerTmpl .Execute (data .Out , meta )
135
133
}
136
134
137
- func (data * dump ) dumpTable (name string ) error {
138
- table , err := createTable (data .Connection , name )
135
+ // MARK: - Private methods
136
+
137
+ // MARK: writter methods
138
+
139
+ func (data * Data ) dumpTable (name string ) error {
140
+ table , err := data .createTable (name )
139
141
if err != nil {
140
142
return err
141
143
}
@@ -144,62 +146,40 @@ func (data *dump) dumpTable(name string) error {
144
146
return nil
145
147
}
146
148
147
- func (data * dump ) writeTable (table * table ) error {
149
+ func (data * Data ) writeTable (table * table ) error {
148
150
data .mux .Lock ()
149
151
err := data .tableTmpl .Execute (data .Out , table )
150
152
data .mux .Unlock ()
151
153
data .wg .Done ()
152
154
return err
153
155
}
154
156
155
- // Dump creates a MySQL dump based on the options supplied through the dumper.
156
- func (d * Dumper ) Dump () (string , error ) {
157
- name := time .Now ().Format (d .format )
158
- p := path .Join (d .dir , name + ".sql" )
159
-
160
- // Check dump directory
161
- if e , _ := exists (p ); e {
162
- return p , errors .New ("Dump '" + name + "' already exists." )
163
- }
164
-
165
- // Create .sql file
166
- f , err := os .Create (p )
157
+ // MARK: get methods
167
158
159
+ func (data * Data ) getTemplates () (err error ) {
160
+ // Write dump to file
161
+ data .headerTmpl , err = template .New ("mysqldumpHeader" ).Parse (headerTmpl )
168
162
if err != nil {
169
- return p , err
170
- }
171
-
172
- defer f .Close ()
173
-
174
- return p , Dump (d .db , f )
175
- }
176
-
177
- // Dump Creates a MYSQL dump from the connection to the stream.
178
- func Dump (db * sql.DB , out io.Writer ) error {
179
- var err error
180
- data := dump {
181
- DumpVersion : version ,
182
- Connection : db ,
183
- Out : out ,
163
+ return
184
164
}
185
165
186
- // Get server version
187
- if data . ServerVersion , err = getServerVersion ( db ); err != nil {
188
- return err
166
+ data . tableTmpl , err = template . New ( "mysqldumpTable" ). Parse ( tableTmpl )
167
+ if err != nil {
168
+ return
189
169
}
190
170
191
- if err := data .getTemplates (); err != nil {
192
- return err
171
+ data .footerTmpl , err = template .New ("mysqldumpTable" ).Parse (footerTmpl )
172
+ if err != nil {
173
+ return
193
174
}
194
-
195
- return data .dump ()
175
+ return
196
176
}
197
177
198
- func getTables ( db * sql. DB ) ([]string , error ) {
178
+ func ( data * Data ) getTables ( ) ([]string , error ) {
199
179
tables := make ([]string , 0 )
200
180
201
181
// Get table list
202
- rows , err := db .Query ("SHOW TABLES" )
182
+ rows , err := data . Connection .Query ("SHOW TABLES" )
203
183
if err != nil {
204
184
return tables , err
205
185
}
@@ -211,38 +191,50 @@ func getTables(db *sql.DB) ([]string, error) {
211
191
if err := rows .Scan (& table ); err != nil {
212
192
return tables , err
213
193
}
214
- tables = append (tables , table .String )
194
+ if table .Valid && ! data .isIgnoredTable (table .String ) {
195
+ tables = append (tables , table .String )
196
+ }
215
197
}
216
198
return tables , rows .Err ()
217
199
}
218
200
219
- func getServerVersion (db * sql.DB ) (string , error ) {
220
- var serverVersion sql.NullString
221
- if err := db .QueryRow ("SELECT version()" ).Scan (& serverVersion ); err != nil {
222
- return "" , err
201
+ func (data * Data ) isIgnoredTable (name string ) bool {
202
+ for _ , item := range data .IgnoreTables {
203
+ if item == name {
204
+ return true
205
+ }
223
206
}
224
- return serverVersion . String , nil
207
+ return false
225
208
}
226
209
227
- func createTable (db * sql.DB , name string ) (* table , error ) {
210
+ func (data * metaData ) updateServerVersion (db * sql.DB ) (err error ) {
211
+ var serverVersion sql.NullString
212
+ err = db .QueryRow ("SELECT version()" ).Scan (& serverVersion )
213
+ data .ServerVersion = serverVersion .String
214
+ return
215
+ }
216
+
217
+ // MARK: create methods
218
+
219
+ func (data * Data ) createTable (name string ) (* table , error ) {
228
220
var err error
229
221
t := & table {Name : "`" + name + "`" }
230
222
231
- if t .SQL , err = createTableSQL (db , name ); err != nil {
223
+ if t .SQL , err = data . createTableSQL (name ); err != nil {
232
224
return nil , err
233
225
}
234
226
235
- if t .Values , err = createTableValues (db , name ); err != nil {
227
+ if t .Values , err = data . createTableValues (name ); err != nil {
236
228
return nil , err
237
229
}
238
230
239
231
return t , nil
240
232
}
241
233
242
- func createTableSQL ( db * sql. DB , name string ) (string , error ) {
234
+ func ( data * Data ) createTableSQL ( name string ) (string , error ) {
243
235
// Get table creation SQL
244
236
var tableReturn , tableSQL sql.NullString
245
- err := db .QueryRow ("SHOW CREATE TABLE " + name ).Scan (& tableReturn , & tableSQL )
237
+ err := data . Connection .QueryRow ("SHOW CREATE TABLE " + name ).Scan (& tableReturn , & tableSQL )
246
238
247
239
if err != nil {
248
240
return "" , err
@@ -254,9 +246,9 @@ func createTableSQL(db *sql.DB, name string) (string, error) {
254
246
return tableSQL .String , nil
255
247
}
256
248
257
- func createTableValues ( db * sql. DB , name string ) (string , error ) {
249
+ func ( data * Data ) createTableValues ( name string ) (string , error ) {
258
250
// Get Data
259
- rows , err := db .Query ("SELECT * FROM " + name )
251
+ rows , err := data . Connection .Query ("SELECT * FROM " + name )
260
252
if err != nil {
261
253
return "" , err
262
254
}
0 commit comments