@@ -14,17 +14,21 @@ import (
14
14
/*
15
15
Data struct to configure dump behavior
16
16
17
- Out: Stream to wite to
18
- Connection: Database connection to dump
19
- IgnoreTables: Mark sensitive tables to ignore
17
+ Out: Stream to wite to
18
+ Connection: Database connection to dump
19
+ IgnoreTables: Mark sensitive tables to ignore
20
+ LockTables: Lock all tables for the duration of the dump
21
+ SingleTransaction: Do the entire dump in one transaction
20
22
*/
21
23
type Data struct {
22
- Out io.Writer
23
- Connection * sql.DB
24
- IgnoreTables []string
25
- MaxAllowedPacket int
26
- LockTables bool
27
-
24
+ Out io.Writer
25
+ Connection * sql.DB
26
+ IgnoreTables []string
27
+ MaxAllowedPacket int
28
+ LockTables bool
29
+ SingleTransaction bool
30
+
31
+ tx * sql.Tx
28
32
headerTmpl * template.Template
29
33
tableTmpl * template.Template
30
34
footerTmpl * template.Template
@@ -49,7 +53,7 @@ type metaData struct {
49
53
50
54
const (
51
55
// Version of this plugin for easy reference
52
- Version = "0.5 .0"
56
+ Version = "0.6 .0"
53
57
54
58
defaultMaxAllowedPacket = 4194304
55
59
)
@@ -123,15 +127,20 @@ func (data *Data) Dump() error {
123
127
data .MaxAllowedPacket = defaultMaxAllowedPacket
124
128
}
125
129
126
- if err := meta . updateServerVersion ( data .Connection ); err != nil {
130
+ if err := data .getTemplates ( ); err != nil {
127
131
return err
128
132
}
129
133
130
- if err := data .getTemplates ( ); err != nil {
134
+ if err := data .headerTmpl . Execute ( data . Out , meta ); err != nil {
131
135
return err
132
136
}
133
137
134
- if err := data .headerTmpl .Execute (data .Out , meta ); err != nil {
138
+ if err := data .begin (); err != nil {
139
+ return err
140
+ }
141
+ defer data .rollback ()
142
+
143
+ if err := meta .updateServerVersion (data ); err != nil {
135
144
return err
136
145
}
137
146
@@ -173,6 +182,18 @@ func (data *Data) Dump() error {
173
182
174
183
// MARK: - Private methods
175
184
185
+ func (data * Data ) begin () (err error ) {
186
+ data .tx , err = data .Connection .BeginTx (nil , & sql.TxOptions {
187
+ Isolation : sql .LevelRepeatableRead ,
188
+ ReadOnly : true ,
189
+ })
190
+ return
191
+ }
192
+
193
+ func (data * Data ) rollback () error {
194
+ return data .tx .Rollback ()
195
+ }
196
+
176
197
// MARK: writter methods
177
198
178
199
func (data * Data ) dumpTable (name string ) error {
@@ -214,7 +235,7 @@ func (data *Data) getTemplates() (err error) {
214
235
func (data * Data ) getTables () ([]string , error ) {
215
236
tables := make ([]string , 0 )
216
237
217
- rows , err := data .Connection .Query ("SHOW TABLES" )
238
+ rows , err := data .tx .Query ("SHOW TABLES" )
218
239
if err != nil {
219
240
return tables , err
220
241
}
@@ -241,10 +262,10 @@ func (data *Data) isIgnoredTable(name string) bool {
241
262
return false
242
263
}
243
264
244
- func (data * metaData ) updateServerVersion (db * sql. DB ) (err error ) {
265
+ func (meta * metaData ) updateServerVersion (data * Data ) (err error ) {
245
266
var serverVersion sql.NullString
246
- err = db .QueryRow ("SELECT version()" ).Scan (& serverVersion )
247
- data .ServerVersion = serverVersion .String
267
+ err = data . tx .QueryRow ("SELECT version()" ).Scan (& serverVersion )
268
+ meta .ServerVersion = serverVersion .String
248
269
return
249
270
}
250
271
@@ -263,7 +284,7 @@ func (table *table) NameEsc() string {
263
284
264
285
func (table * table ) CreateSQL () (string , error ) {
265
286
var tableReturn , tableSQL sql.NullString
266
- if err := table .data .Connection .QueryRow ("SHOW CREATE TABLE " + table .NameEsc ()).Scan (& tableReturn , & tableSQL ); err != nil {
287
+ if err := table .data .tx .QueryRow ("SHOW CREATE TABLE " + table .NameEsc ()).Scan (& tableReturn , & tableSQL ); err != nil {
267
288
return "" , err
268
289
}
269
290
@@ -280,7 +301,7 @@ func (table *table) Init() (err error) {
280
301
return errors .New ("can't init twice" )
281
302
}
282
303
283
- table .rows , err = table .data .Connection .Query ("SELECT * FROM " + table .NameEsc ())
304
+ table .rows , err = table .data .tx .Query ("SELECT * FROM " + table .NameEsc ())
284
305
if err != nil {
285
306
return err
286
307
}
0 commit comments