Skip to content

Commit 8ede715

Browse files
committedJun 25, 2022
Small fixes & cleanups
1 parent 89fd916 commit 8ede715

File tree

9 files changed

+637
-16
lines changed

9 files changed

+637
-16
lines changed
 

‎dbump.go

+8-16
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,6 @@ type Migration struct {
6969
Revert string // Revert query
7070
}
7171

72-
// MigrationFn gives ability to use Go functions as migrations.
73-
type MigrationFn func(ctx context.Context, conn Conn) error
74-
75-
// Conn represents a connection to the database.
76-
type Conn interface {
77-
Exec(ctx context.Context, query string, args ...interface{}) error
78-
}
79-
8072
// MigratorMode to change migration flow.
8173
type MigratorMode int
8274

@@ -89,7 +81,7 @@ const (
8981
modeMaxPossible
9082
)
9183

92-
// AsLocklessMigrator makes given migrator to not take a lock in database.
84+
// AsLocklessMigrator makes given migrator to not take a lock on database.
9385
func AsLocklessMigrator(m Migrator) Migrator {
9486
return &locklessMigrator{m}
9587
}
@@ -126,7 +118,7 @@ func (m *mig) run(ctx context.Context) error {
126118
if err != nil {
127119
return fmt.Errorf("load: %w", err)
128120
}
129-
return m.runMigration(ctx, migrations)
121+
return m.runMigrations(ctx, migrations)
130122
}
131123

132124
func (m *mig) load() ([]*Migration, error) {
@@ -152,7 +144,7 @@ func (m *mig) load() ([]*Migration, error) {
152144
return ms, nil
153145
}
154146

155-
func (m *mig) runMigration(ctx context.Context, ms []*Migration) (err error) {
147+
func (m *mig) runMigrations(ctx context.Context, ms []*Migration) (err error) {
156148
if err := m.Init(ctx); err != nil {
157149
return fmt.Errorf("init: %w", err)
158150
}
@@ -174,11 +166,11 @@ func (m *mig) runMigration(ctx context.Context, ms []*Migration) (err error) {
174166
}
175167
}()
176168

177-
err = m.runMigrationLocked(ctx, ms)
169+
err = m.runMigrationsLocked(ctx, ms)
178170
return err
179171
}
180172

181-
func (m *mig) runMigrationLocked(ctx context.Context, ms []*Migration) error {
173+
func (m *mig) runMigrationsLocked(ctx context.Context, ms []*Migration) error {
182174
curr, target, err := m.getCurrAndTargetVersions(ctx, len(ms))
183175
if err != nil {
184176
return err
@@ -330,9 +322,9 @@ func (llm *locklessMigrator) SetVersion(ctx context.Context, version int) error
330322
return llm.m.SetVersion(ctx, version)
331323
}
332324

333-
func (llm *locklessMigrator) Begin(ctx context.Context) error { return llm.Begin(ctx) }
334-
func (llm *locklessMigrator) Commit(ctx context.Context) error { return llm.Commit(ctx) }
335-
func (llm *locklessMigrator) Rollback(ctx context.Context) error { return llm.Rollback(ctx) }
325+
func (llm *locklessMigrator) Begin(ctx context.Context) error { return llm.m.Begin(ctx) }
326+
func (llm *locklessMigrator) Commit(ctx context.Context) error { return llm.m.Commit(ctx) }
327+
func (llm *locklessMigrator) Rollback(ctx context.Context) error { return llm.m.Rollback(ctx) }
336328

337329
func (llm *locklessMigrator) Exec(ctx context.Context, query string, args ...interface{}) error {
338330
return llm.m.Exec(ctx, query, args...)

‎dbump_ch/clickhouse.go

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package dbump_ch
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
)
7+
8+
// MigratorClickHouse to migrate ClickHouse.
9+
type MigratorClickHouse struct {
10+
db *sql.DB
11+
versionTable string
12+
}
13+
14+
// NewMigratorClickHouse instantiates new MigratorClickHouse.
15+
func NewMigratorClickHouse(db *sql.DB) *MigratorClickHouse {
16+
return &MigratorClickHouse{
17+
db: db,
18+
versionTable: "_dbump_schema_version",
19+
}
20+
}
21+
22+
// LockDB is a method for Migrator interface.
23+
func (ch *MigratorClickHouse) LockDB(ctx context.Context) error {
24+
// TODO: currently no-op
25+
return nil
26+
}
27+
28+
// UnlockDB is a method for Migrator interface.
29+
func (ch *MigratorClickHouse) UnlockDB(ctx context.Context) error {
30+
// TODO: currently no-op
31+
return nil
32+
}
33+
34+
// Version is a method for Migrator interface.
35+
func (ch *MigratorClickHouse) Version(ctx context.Context) (version int, err error) {
36+
row := ch.db.QueryRowContext(ctx, "SELECT version FROM "+ch.versionTable)
37+
err = row.Scan(&version)
38+
return version, err
39+
}
40+
41+
// SetVersion is a method for Migrator interface.
42+
func (ch *MigratorClickHouse) SetVersion(ctx context.Context, version int) error {
43+
_, err := ch.db.ExecContext(ctx, "UPDATE "+ch.versionTable+" SET version = $1", version)
44+
return err
45+
}
46+
47+
// Exec is a method for Migrator interface.
48+
func (ch *MigratorClickHouse) Exec(ctx context.Context, query string, args ...interface{}) error {
49+
_, err := ch.db.ExecContext(ctx, query)
50+
return err
51+
}

‎dbump_ch/go.mod

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module github.com/cristalhq/dbump/dbump_ch
2+
3+
go 1.16
4+
5+
require (
6+
github.com/cristalhq/dbump v0.1.1
7+
)

‎dbump_ch/go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
github.com/cristalhq/dbump v0.1.1 h1:cRbnpydrF19ML0wNO2pGsY6qwEVH/rtwnN64VwZpy9M=
2+
github.com/cristalhq/dbump v0.1.1/go.mod h1:rAjULuStbuNPCLrJT62Eu7Sp/2gVt/4URUvsnPK1yFA=

‎dbump_mysql/go.mod

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module github.com/cristalhq/dbump/dbump_mysql
2+
3+
go 1.16
4+
5+
require (
6+
github.com/cristalhq/dbump v0.1.1
7+
github.com/lib/pq v1.10.5
8+
)

‎dbump_mysql/go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
github.com/cristalhq/dbump v0.1.1 h1:cRbnpydrF19ML0wNO2pGsY6qwEVH/rtwnN64VwZpy9M=
2+
github.com/cristalhq/dbump v0.1.1/go.mod h1:rAjULuStbuNPCLrJT62Eu7Sp/2gVt/4URUvsnPK1yFA=
3+
github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
4+
github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=

‎dbump_mysql/mysql.go

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package dbump_mysql
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"fmt"
7+
)
8+
9+
// to prevent multiple migrations running at the same time
10+
const lockNum int64 = 777_777_777
11+
12+
// Migrator to migrate MySQL.
13+
type Migrator struct {
14+
db *sql.DB
15+
versionTable string
16+
}
17+
18+
// NewMigrator instantiates new Migrator.
19+
func NewMigrator(db *sql.DB) *Migrator {
20+
return &Migrator{
21+
db: db,
22+
versionTable: "_dbump_schema_version",
23+
}
24+
}
25+
26+
// Init migrator.
27+
func (pg *Migrator) Init(ctx context.Context) error {
28+
query := fmt.Sprintf(`CREATE TABLE IF NOT EXISTS %s (
29+
version BIGINT NOT NULL PRIMARY KEY,
30+
created_at TIMESTAMP NOT NULL
31+
);`, pg.versionTable)
32+
_, err := pg.db.ExecContext(ctx, query)
33+
return err
34+
}
35+
36+
// LockDB is a method for Migrator interface.
37+
func (my *Migrator) LockDB(ctx context.Context) error {
38+
_, err := my.db.ExecContext(ctx, `SELECT GET_LOCK(?, 10)`, lockNum)
39+
return err
40+
}
41+
42+
// UnlockDB is a method for Migrator interface.
43+
func (my *Migrator) UnlockDB(ctx context.Context) error {
44+
_, err := my.db.ExecContext(ctx, "SELECT RELEASE_LOCK(?)", lockNum)
45+
return err
46+
}
47+
48+
// Version is a method for Migrator interface.
49+
func (my *Migrator) Version(ctx context.Context) (version int, err error) {
50+
row := my.db.QueryRowContext(ctx, "SELECT version FROM "+my.versionTable)
51+
err = row.Scan(&version)
52+
return version, err
53+
}
54+
55+
// SetVersion is a method for Migrator interface.
56+
func (my *Migrator) SetVersion(ctx context.Context, version int) error {
57+
_, err := my.db.ExecContext(ctx, "UPDATE "+my.versionTable+" SET version = $1", version)
58+
return err
59+
}
60+
61+
// Exec is a method for Migrator interface.
62+
func (my *Migrator) Exec(ctx context.Context, query string, args ...interface{}) error {
63+
_, err := my.db.ExecContext(ctx, query)
64+
return err
65+
}

‎dbump_mysql/mysql_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dbump_mysql_test
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"testing"
7+
)

0 commit comments

Comments
 (0)