Skip to content

Commit fdb7b50

Browse files
committed
Have all statments run on the same transaction
1 parent f00cfb1 commit fdb7b50

File tree

2 files changed

+48
-86
lines changed

2 files changed

+48
-86
lines changed

dump.go

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mysqldump
22

33
import (
44
"bytes"
5+
"context"
56
"database/sql"
67
"errors"
78
"fmt"
@@ -14,19 +15,17 @@ import (
1415
/*
1516
Data struct to configure dump behavior
1617
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
18+
Out: Stream to wite to
19+
Connection: Database connection to dump
20+
IgnoreTables: Mark sensitive tables to ignore
21+
LockTables: Lock all tables for the duration of the dump
2222
*/
2323
type Data struct {
24-
Out io.Writer
25-
Connection *sql.DB
26-
IgnoreTables []string
27-
MaxAllowedPacket int
28-
LockTables bool
29-
SingleTransaction bool
24+
Out io.Writer
25+
Connection *sql.DB
26+
IgnoreTables []string
27+
MaxAllowedPacket int
28+
LockTables bool
3029

3130
tx *sql.Tx
3231
headerTmpl *template.Template
@@ -131,10 +130,6 @@ func (data *Data) Dump() error {
131130
return err
132131
}
133132

134-
if err := data.headerTmpl.Execute(data.Out, meta); err != nil {
135-
return err
136-
}
137-
138133
if err := data.begin(); err != nil {
139134
return err
140135
}
@@ -144,6 +139,10 @@ func (data *Data) Dump() error {
144139
return err
145140
}
146141

142+
if err := data.headerTmpl.Execute(data.Out, meta); err != nil {
143+
return err
144+
}
145+
147146
tables, err := data.getTables()
148147
if err != nil {
149148
return err
@@ -183,7 +182,7 @@ func (data *Data) Dump() error {
183182
// MARK: - Private methods
184183

185184
func (data *Data) begin() (err error) {
186-
data.tx, err = data.Connection.BeginTx(nil, &sql.TxOptions{
185+
data.tx, err = data.Connection.BeginTx(context.Background(), &sql.TxOptions{
187186
Isolation: sql.LevelRepeatableRead,
188187
ReadOnly: true,
189188
})

dump_test.go

Lines changed: 33 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mysqldump
22

33
import (
44
"bytes"
5+
"database/sql"
56
"reflect"
67
"strings"
78
"testing"
@@ -10,8 +11,9 @@ import (
1011
"github.com/stretchr/testify/assert"
1112
)
1213

13-
func GetMockData() (data *Data, mock sqlmock.Sqlmock, err error) {
14-
db, mock, err := sqlmock.New()
14+
func getMockData() (data *Data, mock sqlmock.Sqlmock, err error) {
15+
var db *sql.DB
16+
db, mock, err = sqlmock.New()
1517
if err != nil {
1618
return
1719
}
@@ -25,7 +27,7 @@ func GetMockData() (data *Data, mock sqlmock.Sqlmock, err error) {
2527
}
2628

2729
func TestGetTablesOk(t *testing.T) {
28-
data, mock, err := GetMockData()
30+
data, mock, err := getMockData()
2931
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
3032
defer data.Close()
3133

@@ -45,20 +47,17 @@ func TestGetTablesOk(t *testing.T) {
4547
}
4648

4749
func TestIgnoreTablesOk(t *testing.T) {
48-
db, mock, err := sqlmock.New()
50+
data, mock, err := getMockData()
4951
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
50-
defer db.Close()
52+
defer data.Close()
5153

5254
rows := sqlmock.NewRows([]string{"Tables_in_Testdb"}).
5355
AddRow("Test_Table_1").
5456
AddRow("Test_Table_2")
5557

5658
mock.ExpectQuery("^SHOW TABLES$").WillReturnRows(rows)
5759

58-
data := Data{
59-
Connection: db,
60-
IgnoreTables: []string{"Test_Table_1"},
61-
}
60+
data.IgnoreTables = []string{"Test_Table_1"}
6261

6362
result, err := data.getTables()
6463
assert.NoError(t, err)
@@ -70,10 +69,9 @@ func TestIgnoreTablesOk(t *testing.T) {
7069
}
7170

7271
func TestGetTablesNil(t *testing.T) {
73-
db, mock, err := sqlmock.New()
72+
data, mock, err := getMockData()
7473
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
75-
76-
defer db.Close()
74+
defer data.Close()
7775

7876
rows := sqlmock.NewRows([]string{"Tables_in_Testdb"}).
7977
AddRow("Test_Table_1").
@@ -82,10 +80,6 @@ func TestGetTablesNil(t *testing.T) {
8280

8381
mock.ExpectQuery("^SHOW TABLES$").WillReturnRows(rows)
8482

85-
data := Data{
86-
Connection: db,
87-
}
88-
8983
result, err := data.getTables()
9084
assert.NoError(t, err)
9185

@@ -96,23 +90,18 @@ func TestGetTablesNil(t *testing.T) {
9690
}
9791

9892
func TestGetServerVersionOk(t *testing.T) {
99-
db, mock, err := sqlmock.New()
93+
data, mock, err := getMockData()
10094
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
101-
102-
defer db.Close()
95+
defer data.Close()
10396

10497
rows := sqlmock.NewRows([]string{"Version()"}).
10598
AddRow("test_version")
10699

107-
mock.ExpectBegin()
108100
mock.ExpectQuery("^SELECT version()").WillReturnRows(rows)
109101

110102
meta := metaData{}
111103

112-
tx, _ := db.Begin()
113-
assert.NoError(t, meta.updateServerVersion(&Data{
114-
tx: tx,
115-
}), "error was not expected while updating stats")
104+
assert.NoError(t, meta.updateServerVersion(data), "error was not expected while updating stats")
116105

117106
// we make sure that all expectations were met
118107
assert.NoError(t, mock.ExpectationsWereMet(), "there were unfulfilled expections")
@@ -121,19 +110,15 @@ func TestGetServerVersionOk(t *testing.T) {
121110
}
122111

123112
func TestCreateTableSQLOk(t *testing.T) {
124-
db, mock, err := sqlmock.New()
113+
data, mock, err := getMockData()
125114
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
126-
defer db.Close()
115+
defer data.Close()
127116

128117
rows := sqlmock.NewRows([]string{"Table", "Create Table"}).
129118
AddRow("Test_Table", "CREATE TABLE 'Test_Table' (`id` int(11) NOT NULL AUTO_INCREMENT,`s` char(60) DEFAULT NULL, PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=latin1")
130119

131120
mock.ExpectQuery("^SHOW CREATE TABLE `Test_Table`$").WillReturnRows(rows)
132121

133-
data := Data{
134-
Connection: db,
135-
}
136-
137122
table := data.createTable("Test_Table")
138123

139124
result, err := table.CreateSQL()
@@ -150,20 +135,16 @@ func TestCreateTableSQLOk(t *testing.T) {
150135
}
151136

152137
func TestCreateTableRowValues(t *testing.T) {
153-
db, mock, err := sqlmock.New()
138+
data, mock, err := getMockData()
154139
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
155-
defer db.Close()
140+
defer data.Close()
156141

157142
rows := sqlmock.NewRows([]string{"id", "email", "name"}).
158143
AddRow(1, "[email protected]", "Test Name 1").
159144
AddRow(2, "[email protected]", "Test Name 2")
160145

161146
mock.ExpectQuery("^SELECT (.+) FROM `test`$").WillReturnRows(rows)
162147

163-
data := Data{
164-
Connection: db,
165-
}
166-
167148
table := data.createTable("test")
168149

169150
assert.True(t, table.Next())
@@ -178,20 +159,17 @@ func TestCreateTableRowValues(t *testing.T) {
178159
}
179160

180161
func TestCreateTableValuesSteam(t *testing.T) {
181-
db, mock, err := sqlmock.New()
162+
data, mock, err := getMockData()
182163
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
183-
defer db.Close()
164+
defer data.Close()
184165

185166
rows := sqlmock.NewRows([]string{"id", "email", "name"}).
186167
AddRow(1, "[email protected]", "Test Name 1").
187168
AddRow(2, "[email protected]", "Test Name 2")
188169

189170
mock.ExpectQuery("^SELECT (.+) FROM `test`$").WillReturnRows(rows)
190171

191-
data := Data{
192-
Connection: db,
193-
MaxAllowedPacket: 4096,
194-
}
172+
data.MaxAllowedPacket = 4096
195173

196174
table := data.createTable("test")
197175

@@ -203,20 +181,17 @@ func TestCreateTableValuesSteam(t *testing.T) {
203181
}
204182

205183
func TestCreateTableValuesSteamSmallPackets(t *testing.T) {
206-
db, mock, err := sqlmock.New()
184+
data, mock, err := getMockData()
207185
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
208-
defer db.Close()
186+
defer data.Close()
209187

210188
rows := sqlmock.NewRows([]string{"id", "email", "name"}).
211189
AddRow(1, "[email protected]", "Test Name 1").
212190
AddRow(2, "[email protected]", "Test Name 2")
213191

214192
mock.ExpectQuery("^SELECT (.+) FROM `test`$").WillReturnRows(rows)
215193

216-
data := Data{
217-
Connection: db,
218-
MaxAllowedPacket: 64,
219-
}
194+
data.MaxAllowedPacket = 64
220195

221196
table := data.createTable("test")
222197

@@ -229,9 +204,9 @@ func TestCreateTableValuesSteamSmallPackets(t *testing.T) {
229204
}
230205

231206
func TestCreateTableAllValuesWithNil(t *testing.T) {
232-
db, mock, err := sqlmock.New()
207+
data, mock, err := getMockData()
233208
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
234-
defer db.Close()
209+
defer data.Close()
235210

236211
rows := sqlmock.NewRows([]string{"id", "email", "name"}).
237212
AddRow(1, nil, "Test Name 1").
@@ -240,10 +215,6 @@ func TestCreateTableAllValuesWithNil(t *testing.T) {
240215

241216
mock.ExpectQuery("^SELECT (.+) FROM `test`$").WillReturnRows(rows)
242217

243-
data := Data{
244-
Connection: db,
245-
}
246-
247218
table := data.createTable("test")
248219

249220
results := make([]string, 0)
@@ -262,10 +233,9 @@ func TestCreateTableAllValuesWithNil(t *testing.T) {
262233
}
263234

264235
func TestCreateTableOk(t *testing.T) {
265-
db, mock, err := sqlmock.New()
236+
data, mock, err := getMockData()
266237
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
267-
268-
defer db.Close()
238+
defer data.Close()
269239

270240
createTableRows := sqlmock.NewRows([]string{"Table", "Create Table"}).
271241
AddRow("Test_Table", "CREATE TABLE 'Test_Table' (`id` int(11) NOT NULL AUTO_INCREMENT,`s` char(60) DEFAULT NULL, PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=latin1")
@@ -278,11 +248,8 @@ func TestCreateTableOk(t *testing.T) {
278248
mock.ExpectQuery("^SELECT (.+) FROM `Test_Table`$").WillReturnRows(createTableValueRows)
279249

280250
var buf bytes.Buffer
281-
data := Data{
282-
Connection: db,
283-
Out: &buf,
284-
MaxAllowedPacket: 4096,
285-
}
251+
data.Out = &buf
252+
data.MaxAllowedPacket = 4096
286253

287254
assert.NoError(t, data.getTemplates())
288255

@@ -319,10 +286,9 @@ UNLOCK TABLES;
319286
}
320287

321288
func TestCreateTableOkSmallPackets(t *testing.T) {
322-
db, mock, err := sqlmock.New()
289+
data, mock, err := getMockData()
323290
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
324-
325-
defer db.Close()
291+
defer data.Close()
326292

327293
createTableRows := sqlmock.NewRows([]string{"Table", "Create Table"}).
328294
AddRow("Test_Table", "CREATE TABLE 'Test_Table' (`id` int(11) NOT NULL AUTO_INCREMENT,`s` char(60) DEFAULT NULL, PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=latin1")
@@ -335,11 +301,8 @@ func TestCreateTableOkSmallPackets(t *testing.T) {
335301
mock.ExpectQuery("^SELECT (.+) FROM `Test_Table`$").WillReturnRows(createTableValueRows)
336302

337303
var buf bytes.Buffer
338-
data := Data{
339-
Connection: db,
340-
Out: &buf,
341-
MaxAllowedPacket: 64,
342-
}
304+
data.Out = &buf
305+
data.MaxAllowedPacket = 64
343306

344307
assert.NoError(t, data.getTemplates())
345308

0 commit comments

Comments
 (0)