Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 80749ff

Browse files
committed
storage/sql: allow specifying sql flavor specific migrations
Signed-off-by: Nandor Kracser <[email protected]>
1 parent 1160649 commit 80749ff

4 files changed

Lines changed: 28 additions & 9 deletions

File tree

storage/sql/config.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func (s *SQLite3) open(logger log.Logger) (*conn, error) {
6666
return sqlErr.ExtendedCode == sqlite3.ErrConstraintPrimaryKey
6767
}
6868

69-
c := &conn{db, flavorSQLite3, logger, errCheck}
69+
c := &conn{db, &flavorSQLite3, logger, errCheck}
7070
if _, err := c.migrate(); err != nil {
7171
return nil, fmt.Errorf("failed to perform migrations: %v", err)
7272
}
@@ -239,7 +239,7 @@ func (p *Postgres) open(logger log.Logger) (*conn, error) {
239239
return sqlErr.Code == pgErrUniqueViolation
240240
}
241241

242-
c := &conn{db, flavorPostgres, logger, errCheck}
242+
c := &conn{db, &flavorPostgres, logger, errCheck}
243243
if _, err := c.migrate(); err != nil {
244244
return nil, fmt.Errorf("failed to perform migrations: %v", err)
245245
}
@@ -344,7 +344,7 @@ func (s *MySQL) open(logger log.Logger) (*conn, error) {
344344
sqlErr.Number == mysqlErrDupEntryWithKeyName
345345
}
346346

347-
c := &conn{db, flavorMySQL, logger, errCheck}
347+
c := &conn{db, &flavorMySQL, logger, errCheck}
348348
if _, err := c.migrate(); err != nil {
349349
return nil, fmt.Errorf("failed to perform migrations: %v", err)
350350
}

storage/sql/migrate.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ func (c *conn) migrate() (int, error) {
1818

1919
i := 0
2020
done := false
21+
22+
var flavorMigrations []migration
23+
for _, m := range migrations {
24+
if m.flavor == nil || m.flavor == c.flavor {
25+
flavorMigrations = append(flavorMigrations, m)
26+
}
27+
}
28+
2129
for {
2230
err := c.ExecTx(func(tx *trans) error {
2331
// Within a transaction, perform a single migration.
@@ -31,13 +39,13 @@ func (c *conn) migrate() (int, error) {
3139
if num.Valid {
3240
n = int(num.Int64)
3341
}
34-
if n >= len(migrations) {
42+
if n >= len(flavorMigrations) {
3543
done = true
3644
return nil
3745
}
3846

3947
migrationNum := n + 1
40-
m := migrations[n]
48+
m := flavorMigrations[n]
4149
for i := range m.stmts {
4250
if _, err := tx.Exec(m.stmts[i]); err != nil {
4351
return fmt.Errorf("migration %d statement %d failed: %v", migrationNum, i+1, err)
@@ -64,7 +72,11 @@ func (c *conn) migrate() (int, error) {
6472

6573
type migration struct {
6674
stmts []string
67-
// TODO(ericchiang): consider adding additional fields like "forDrivers"
75+
76+
// If flavor is nil the migration will take place for all database backend flavors.
77+
// If specified, only for that corresponding flavor, in that case stmts can be written
78+
// in the specific SQL dialect.
79+
flavor *flavor
6880
}
6981

7082
// All SQL flavors share migration strategies.

storage/sql/migrate_test.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,15 @@ func TestMigrate(t *testing.T) {
3030
return sqlErr.ExtendedCode == sqlite3.ErrConstraintUnique
3131
}
3232

33-
c := &conn{db, flavorSQLite3, logger, errCheck}
34-
for _, want := range []int{len(migrations), 0} {
33+
var sqliteMigrations []migration
34+
for _, m := range migrations {
35+
if m.flavor == nil || m.flavor == &flavorSQLite3 {
36+
sqliteMigrations = append(sqliteMigrations, m)
37+
}
38+
}
39+
40+
c := &conn{db, &flavorSQLite3, logger, errCheck}
41+
for _, want := range []int{len(sqliteMigrations), 0} {
3542
got, err := c.migrate()
3643
if err != nil {
3744
t.Fatal(err)

storage/sql/sql.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func (c *conn) translateArgs(args []interface{}) []interface{} {
130130
// conn is the main database connection.
131131
type conn struct {
132132
db *sql.DB
133-
flavor flavor
133+
flavor *flavor
134134
logger log.Logger
135135
alreadyExistsCheck func(err error) bool
136136
}

0 commit comments

Comments
 (0)