Skip to content

Commit 30a12c3

Browse files
committed
scanable and reflect
1 parent 083976f commit 30a12c3

File tree

2 files changed

+48
-30
lines changed

2 files changed

+48
-30
lines changed

dump.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -390,17 +390,13 @@ func (table *table) Init() error {
390390

391391
func reflectColumnType(tp *sql.ColumnType) reflect.Type {
392392
// reflect for scanable
393-
if st := tp.ScanType(); st != nil {
394-
if st.Kind() == reflect.Int ||
395-
st.Kind() == reflect.Int8 ||
396-
st.Kind() == reflect.Int16 ||
397-
st.Kind() == reflect.Int32 ||
398-
st.Kind() == reflect.Int64 {
399-
return reflect.TypeOf(sql.NullInt64{})
400-
} else if st.Kind() == reflect.Float32 ||
401-
st.Kind() == reflect.Float64 {
402-
return reflect.TypeOf(sql.NullFloat64{})
403-
}
393+
switch tp.ScanType().Kind() {
394+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
395+
return reflect.TypeOf(sql.NullInt64{})
396+
case reflect.Float32, reflect.Float64:
397+
return reflect.TypeOf(sql.NullFloat64{})
398+
case reflect.String:
399+
return reflect.TypeOf(sql.NullString{})
404400
}
405401

406402
// determine by name
@@ -416,7 +412,7 @@ func reflectColumnType(tp *sql.ColumnType) reflect.Type {
416412
}
417413

418414
// unknown datatype
419-
return reflect.TypeOf(sql.NullString{})
415+
return tp.ScanType()
420416
}
421417

422418
func (table *table) Next() bool {

mysqldump_test.go

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package mysqldump
33
import (
44
"bytes"
55
"io/ioutil"
6+
"reflect"
67
"strings"
78
"testing"
89

@@ -42,7 +43,7 @@ CREATE TABLE 'Test_Table' (~id~ int(11) NOT NULL AUTO_INCREMENT,~email~ char(60)
4243
4344
LOCK TABLES ~Test_Table~ WRITE;
4445
/*!40000 ALTER TABLE ~Test_Table~ DISABLE KEYS */;
45-
INSERT INTO ~Test_Table~ (~id~, ~email~, ~name~) VALUES ('1',NULL,'Test Name 1'),('2','[email protected]','Test Name 2');
46+
INSERT INTO ~Test_Table~ (~id~, ~email~, ~name~) VALUES (1,NULL,'Test Name 1'),(2,'[email protected]','Test Name 2');
4647
/*!40000 ALTER TABLE ~Test_Table~ ENABLE KEYS */;
4748
UNLOCK TABLES;
4849
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
@@ -57,28 +58,52 @@ UNLOCK TABLES;
5758
5859
`
5960

61+
func mockColumnRows() *sqlmock.Rows {
62+
var enum struct{}
63+
col1 := sqlmock.NewColumn("Field").OfType("VARCHAR", "").Nullable(true)
64+
col2 := sqlmock.NewColumn("Type").OfType("TEXT", "").Nullable(true)
65+
col3 := sqlmock.NewColumn("Null").OfType("VARCHAR", "").Nullable(true)
66+
col4 := sqlmock.NewColumn("Key").OfType("ENUM", &enum).Nullable(true)
67+
col5 := sqlmock.NewColumn("Default").OfType("TEXT", "").Nullable(true)
68+
col6 := sqlmock.NewColumn("Extra").OfType("VARCHAR", "").Nullable(true)
69+
return sqlmock.NewRowsWithColumnDefinition(col1, col2, col3, col4, col5, col6).
70+
AddRow("id", "int(11)", false, nil, 0, "").
71+
AddRow("email", "varchar(255)", true, nil, nil, "").
72+
AddRow("name", "varchar(255)", true, nil, nil, "").
73+
AddRow("hash", "varchar(255)", true, nil, nil, "VIRTUAL GENERATED")
74+
}
75+
76+
func c(name string, v interface{}) *sqlmock.Column {
77+
var t string
78+
switch reflect.ValueOf(v).Kind() {
79+
case reflect.String:
80+
t = "VARCHAR"
81+
case reflect.Int:
82+
t = "INT"
83+
case reflect.Bool:
84+
t = "BOOL"
85+
}
86+
return sqlmock.NewColumn(name).OfType(t, v).Nullable(true)
87+
}
88+
6089
func RunDump(t testing.TB, data *Data) {
6190
db, mock, err := sqlmock.New()
6291
assert.NoError(t, err, "an error was not expected when opening a stub database connection")
6392
defer db.Close()
6493

6594
data.Connection = db
66-
showTablesRows := sqlmock.NewRows([]string{"Tables_in_Testdb"}).
95+
showTablesRows := sqlmock.NewRowsWithColumnDefinition(c("Tables_in_Testdb", "")).
6796
AddRow("Test_Table")
6897

69-
showColumnsRows := sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}).
70-
AddRow("id", "int(11)", false, "", 0, "").
71-
AddRow("email", "varchar(255)", true, "", nil, "").
72-
AddRow("name", "varchar(255)", true, "", nil, "").
73-
AddRow("hash", "varchar(255)", true, "", nil, "VIRTUAL GENERATED")
98+
showColumnsRows := mockColumnRows()
7499

75-
serverVersionRows := sqlmock.NewRows([]string{"Version()"}).
100+
serverVersionRows := sqlmock.NewRowsWithColumnDefinition(c("Version()", "")).
76101
AddRow("test_version")
77102

78-
createTableRows := sqlmock.NewRows([]string{"Table", "Create Table"}).
103+
createTableRows := sqlmock.NewRowsWithColumnDefinition(c("Table", ""), c("Create Table", "")).
79104
AddRow("Test_Table", "CREATE TABLE 'Test_Table' (`id` int(11) NOT NULL AUTO_INCREMENT,`email` char(60) DEFAULT NULL, `name` char(60), PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=latin1")
80105

81-
createTableValueRows := sqlmock.NewRows([]string{"id", "email", "name"}).
106+
createTableValueRows := sqlmock.NewRowsWithColumnDefinition(c("id", 0), c("email", ""), c("name", "")).
82107
AddRow(1, nil, "Test Name 1").
83108
AddRow(2, "[email protected]", "Test Name 2")
84109

@@ -120,21 +145,18 @@ func TestNoLockOk(t *testing.T) {
120145
defer db.Close()
121146

122147
data.Connection = db
123-
showTablesRows := sqlmock.NewRows([]string{"Tables_in_Testdb"}).
148+
showTablesRows := sqlmock.NewRowsWithColumnDefinition(c("Tables_in_Testdb", "")).
124149
AddRow("Test_Table")
125150

126-
showColumnsRows := sqlmock.NewRows([]string{"Field", "Type", "Null", "Key", "Default", "Extra"}).
127-
AddRow("id", "int(11)", false, "", 0, "").
128-
AddRow("email", "varchar(255)", true, "", nil, "").
129-
AddRow("name", "varchar(255)", true, "", nil, "")
151+
showColumnsRows := mockColumnRows()
130152

131-
serverVersionRows := sqlmock.NewRows([]string{"Version()"}).
153+
serverVersionRows := sqlmock.NewRowsWithColumnDefinition(c("Version()", "")).
132154
AddRow("test_version")
133155

134-
createTableRows := sqlmock.NewRows([]string{"Table", "Create Table"}).
156+
createTableRows := sqlmock.NewRowsWithColumnDefinition(c("Table", ""), c("Create Table", "")).
135157
AddRow("Test_Table", "CREATE TABLE 'Test_Table' (`id` int(11) NOT NULL AUTO_INCREMENT,`email` char(60) DEFAULT NULL, `name` char(60), PRIMARY KEY (`id`))ENGINE=InnoDB DEFAULT CHARSET=latin1")
136158

137-
createTableValueRows := sqlmock.NewRows([]string{"id", "email", "name"}).
159+
createTableValueRows := sqlmock.NewRowsWithColumnDefinition(c("id", 0), c("email", ""), c("name", "")).
138160
AddRow(1, nil, "Test Name 1").
139161
AddRow(2, "[email protected]", "Test Name 2")
140162

0 commit comments

Comments
 (0)