Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 69d4745

Browse files
josephbuchmagravis
authored andcommittedJan 23, 2018
v2 (#4)
* v2 * driver changes * simplified registering
1 parent 222ddd7 commit 69d4745

File tree

2 files changed

+50
-79
lines changed

2 files changed

+50
-79
lines changed
 

‎postgres.go

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"github.com/lib/pq"
1414
)
1515

16-
var _ driver.Driver = (*Driver)(nil)
16+
var fileTemplate = []byte(``) // TODO
1717

1818
// Driver is the postgres driver for journey.
1919
type Driver struct {
@@ -23,21 +23,19 @@ type Driver struct {
2323
const tableName = "public.schema_migrations"
2424
const txDisabledOption = "disable_ddl_transaction"
2525

26-
// make sure our driver still implements the driver.Driver interface
27-
var _ driver.Driver = (*Driver)(nil)
28-
29-
// Initialize opens and verifies the database handle.
30-
func (driver *Driver) Initialize(url string) error {
26+
// Open opens and verifies the database handle.
27+
func Open(url string) (driver.Driver, error) {
28+
driver := &Driver{}
3129
db, err := sql.Open("postgres", url)
3230
if err != nil {
33-
return err
31+
return nil, err
3432
}
3533
if err := db.Ping(); err != nil {
36-
return err
34+
return nil, err
3735
}
3836
driver.db = db
3937

40-
return driver.ensureVersionTableExists()
38+
return driver, driver.ensureVersionTableExists()
4139
}
4240

4341
// SetDB replaces the current database handle.
@@ -77,46 +75,31 @@ func (driver *Driver) ensureVersionTableExists() error {
7775
return err
7876
}
7977

80-
// FilenameExtension returns "sql".
81-
func (driver *Driver) FilenameExtension() string {
82-
return "sql"
83-
}
84-
8578
// Migrate performs the migration of any one file.
86-
func (driver *Driver) Migrate(f file.File, pipe chan interface{}) {
87-
defer close(pipe)
88-
var err error
89-
pipe <- f
90-
91-
tx, err := driver.db.Begin()
79+
func (driver *Driver) Migrate(f file.File) (err error) {
80+
var tx *sql.Tx
81+
tx, err = driver.db.Begin()
9282
if err != nil {
93-
pipe <- err
94-
return
83+
return err
9584
}
9685
defer func() {
9786
if err != nil {
98-
if err := tx.Rollback(); err != nil {
99-
pipe <- err
100-
}
87+
tx.Rollback()
10188
}
102-
10389
}()
10490

10591
if f.Direction == direction.Up {
10692
if _, err = tx.Exec("INSERT INTO "+tableName+" (version) VALUES ($1)", f.Version); err != nil {
107-
pipe <- err
108-
return
93+
return err
10994
}
11095
} else if f.Direction == direction.Down {
11196
if _, err = tx.Exec("DELETE FROM "+tableName+" WHERE version=$1", f.Version); err != nil {
112-
pipe <- err
113-
return
97+
return err
11498
}
11599
}
116100

117101
if err = f.ReadContent(); err != nil {
118-
pipe <- err
119-
return
102+
return err
120103
}
121104

122105
if txDisabled(fileOptions(f.Content)) {
@@ -131,17 +114,12 @@ func (driver *Driver) Migrate(f file.File, pipe chan interface{}) {
131114
if err == nil && offset >= 0 {
132115
lineNo, columnNo := file.LineColumnFromOffset(f.Content, offset-1)
133116
errorPart := file.LinesBeforeAndAfter(f.Content, lineNo, 5, 5, true)
134-
pipe <- fmt.Errorf("%s %v: %s in line %v, column %v:\n\n%s", pqErr.Severity, pqErr.Code, pqErr.Message, lineNo, columnNo, string(errorPart))
135-
} else {
136-
pipe <- fmt.Errorf("%s %v: %s", pqErr.Severity, pqErr.Code, pqErr.Message)
117+
return fmt.Errorf("%s %v: %s in line %v, column %v:\n\n%s", pqErr.Severity, pqErr.Code, pqErr.Message, lineNo, columnNo, string(errorPart))
137118
}
138-
return
119+
return fmt.Errorf("%s %v: %s", pqErr.Severity, pqErr.Code, pqErr.Message)
139120
}
140121

141-
if err := tx.Commit(); err != nil {
142-
pipe <- err
143-
return
144-
}
122+
return tx.Commit()
145123
}
146124

147125
// Version returns the current migration version.
@@ -209,7 +187,6 @@ func init() {
209187
// According to the PostgreSQL documentation (section 32.1.1.2), postgres
210188
// library supports two URI schemes: postgresql:// and postgres://
211189
// https://www.postgresql.org/docs/current/static/libpq-connect.html#LIBPQ-CONNSTRING
212-
drv := Driver{}
213-
driver.RegisterDriver("postgres", &drv)
214-
driver.RegisterDriver("postgresql", &drv)
190+
driver.Register("postgres", "sql", fileTemplate, Open)
191+
driver.Register("postgresql", "sql", fileTemplate, Open)
215192
}

‎postgres_test.go

Lines changed: 30 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,16 @@ import (
77
"testing"
88

99
"github.com/db-journey/migrate/direction"
10+
"github.com/db-journey/migrate/driver"
1011
"github.com/db-journey/migrate/file"
11-
pipep "github.com/db-journey/migrate/pipe"
1212
)
1313

1414
// TestMigrate runs some additional tests on Migrate().
1515
// Basic testing is already done in migrate_test.go
1616
func TestMigrate(t *testing.T) {
17-
host := os.Getenv("POSTGRES_PORT_5432_TCP_ADDR")
18-
port := os.Getenv("POSTGRES_PORT_5432_TCP_PORT")
19-
driverURL := "postgres://postgres@" + host + ":" + port + "/template1?sslmode=disable"
17+
host := getenvDefault("POSTGRES_PORT_5432_TCP_ADDR", "localhost")
18+
port := getenvDefault("POSTGRES_PORT_5432_TCP_PORT", "5432")
19+
driverURL := "postgres://postgres:p@" + host + ":" + port + "/template1?sslmode=disable"
2020

2121
// prepare clean database
2222
connection, err := sql.Open("postgres", driverURL)
@@ -40,13 +40,9 @@ func TestMigrate(t *testing.T) {
4040
}
4141

4242
func migrate(t *testing.T, driverURL string) {
43-
d := &Driver{}
44-
if err := d.Initialize(driverURL); err != nil {
45-
t.Fatal(err)
46-
}
47-
48-
// testing idempotency: second call should be a no-op, since table already exists
49-
if err := d.Initialize(driverURL); err != nil {
43+
var err error
44+
var d driver.Driver
45+
if d, err = Open(driverURL); err != nil {
5046
t.Fatal(err)
5147
}
5248

@@ -112,11 +108,9 @@ func migrate(t *testing.T, driverURL string) {
112108
}
113109

114110
// should create table yolo
115-
pipe := pipep.New()
116-
go d.Migrate(files[0], pipe)
117-
errs := pipep.ReadErrors(pipe)
118-
if len(errs) > 0 {
119-
t.Fatal(errs)
111+
err = d.Migrate(files[0])
112+
if err != nil {
113+
t.Fatal(err)
120114
}
121115

122116
version, err := d.Version()
@@ -140,17 +134,15 @@ func migrate(t *testing.T, driverURL string) {
140134
}
141135

142136
// should alter type colors
143-
pipe = pipep.New()
144-
go d.Migrate(files[2], pipe)
145-
errs = pipep.ReadErrors(pipe)
146-
if len(errs) > 0 {
147-
t.Fatal(errs)
137+
err = d.Migrate(files[2])
138+
if err != nil {
139+
t.Fatal(err)
148140
}
149141

150142
colors := []string{}
151143
expectedColors := []string{"red", "blue", "green"}
152144

153-
rows, err := d.db.Query("SELECT unnest(enum_range(NULL::colors));")
145+
rows, err := d.(*Driver).db.Query("SELECT unnest(enum_range(NULL::colors));")
154146
if err != nil {
155147
t.Error(err)
156148
return
@@ -175,24 +167,18 @@ func migrate(t *testing.T, driverURL string) {
175167
t.Errorf("Expected colors enum to be %q, got %q\n", expectedColors, colors)
176168
}
177169

178-
pipe = pipep.New()
179-
go d.Migrate(files[3], pipe)
180-
errs = pipep.ReadErrors(pipe)
181-
if len(errs) > 0 {
182-
t.Fatal(errs)
170+
err = d.Migrate(files[3])
171+
if err != nil {
172+
t.Fatal(err)
183173
}
184174

185-
pipe = pipep.New()
186-
go d.Migrate(files[1], pipe)
187-
errs = pipep.ReadErrors(pipe)
188-
if len(errs) > 0 {
189-
t.Fatal(errs)
175+
err = d.Migrate(files[1])
176+
if err != nil {
177+
t.Fatal(err)
190178
}
191179

192-
pipe = pipep.New()
193-
go d.Migrate(files[4], pipe)
194-
errs = pipep.ReadErrors(pipe)
195-
if len(errs) == 0 {
180+
err = d.Migrate(files[4])
181+
if err == nil {
196182
t.Error("Expected test case to fail")
197183
}
198184

@@ -222,3 +208,11 @@ func dropTestTables(t *testing.T, db *sql.DB) {
222208
}
223209

224210
}
211+
212+
func getenvDefault(varname, defaultValue string) string {
213+
v := os.Getenv(varname)
214+
if v == "" {
215+
return defaultValue
216+
}
217+
return v
218+
}

0 commit comments

Comments
 (0)
Failed to load comments.