diff --git a/adapters/kpgx/go.mod b/adapters/kpgx/go.mod index 1c575b9..060548c 100644 --- a/adapters/kpgx/go.mod +++ b/adapters/kpgx/go.mod @@ -13,7 +13,7 @@ require ( github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/jackc/pgconn v1.10.0 github.com/jackc/pgx/v4 v4.13.0 - github.com/lib/pq v1.10.4 + github.com/lib/pq v1.10.4 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opencontainers/runc v1.1.0 // indirect github.com/ory/dockertest v3.3.5+incompatible diff --git a/adapters/kpgx/kpgx.go b/adapters/kpgx/kpgx.go index 71a6ea8..d62e43d 100644 --- a/adapters/kpgx/kpgx.go +++ b/adapters/kpgx/kpgx.go @@ -6,10 +6,6 @@ import ( "github.com/jackc/pgx/v4/pgxpool" "github.com/vingarcia/ksql" "github.com/vingarcia/ksql/sqldialect" - - // This is imported here so the user don't - // have to worry about it when he uses it. - _ "github.com/lib/pq" ) // NewFromPgxPool builds a ksql.DB from a *pgxpool.Pool instance diff --git a/adapters/kpgx/kpgx_test.go b/adapters/kpgx/kpgx_test.go index a0a2a64..8942310 100644 --- a/adapters/kpgx/kpgx_test.go +++ b/adapters/kpgx/kpgx_test.go @@ -2,7 +2,6 @@ package kpgx import ( "context" - "database/sql" "fmt" "io" "log" @@ -17,11 +16,13 @@ import ( ) func TestAdapter(t *testing.T) { - postgresURL, closePostgres := startPostgresDB("ksql") + ctx := context.Background() + + postgresURL, closePostgres := startPostgresDB(ctx, "ksql") defer closePostgres() ksql.RunTestsForAdapter(t, "kpgx", sqldialect.PostgresDialect{}, postgresURL, func(t *testing.T) (ksql.DBAdapter, io.Closer) { - pool, err := pgxpool.Connect(context.TODO(), postgresURL) + pool, err := pgxpool.Connect(ctx, postgresURL) if err != nil { t.Fatal(err.Error()) } @@ -38,15 +39,15 @@ func (c closerAdapter) Close() error { return nil } -func startPostgresDB(dbName string) (databaseURL string, closer func()) { +func startPostgresDB(ctx context.Context, dbName string) (databaseURL string, closer func()) { // uses a sensible default on windows (tcp/http) and linux/osx (socket) - pool, err := dockertest.NewPool("") + dockerPool, err := dockertest.NewPool("") if err != nil { log.Fatalf("Could not connect to docker: %s", err) } // pulls an image, creates a container based on it and runs it - resource, err := pool.RunWithOptions( + resource, err := dockerPool.RunWithOptions( &dockertest.RunOptions{ Repository: "postgres", Tag: "14.0", @@ -74,15 +75,16 @@ func startPostgresDB(dbName string) (databaseURL string, closer func()) { resource.Expire(40) // Tell docker to hard kill the container in 40 seconds - var sqlDB *sql.DB + var sqlDB *pgxpool.Pool // exponential backoff-retry, because the application in the container might not be ready to accept connections yet - pool.MaxWait = 10 * time.Second - pool.Retry(func() error { - sqlDB, err = sql.Open("postgres", databaseUrl) + dockerPool.MaxWait = 10 * time.Second + dockerPool.Retry(func() error { + sqlDB, err = pgxpool.Connect(ctx, databaseUrl) if err != nil { return err } - return sqlDB.Ping() + + return sqlDB.Ping(ctx) }) if err != nil { log.Fatalf("Could not connect to docker: %s", err) @@ -90,7 +92,7 @@ func startPostgresDB(dbName string) (databaseURL string, closer func()) { sqlDB.Close() return databaseUrl, func() { - if err := pool.Purge(resource); err != nil { + if err := dockerPool.Purge(resource); err != nil { log.Fatalf("Could not purge resource: %s", err) } } diff --git a/adapters/kpgx5/go.mod b/adapters/kpgx5/go.mod index 1e4564a..85e1bac 100644 --- a/adapters/kpgx5/go.mod +++ b/adapters/kpgx5/go.mod @@ -12,7 +12,7 @@ require ( github.com/google/go-cmp v0.5.6 // indirect github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect github.com/jackc/pgx/v5 v5.3.1 - github.com/lib/pq v1.10.4 + github.com/lib/pq v1.10.4 // indirect github.com/opencontainers/image-spec v1.0.2 // indirect github.com/opencontainers/runc v1.1.0 // indirect github.com/ory/dockertest v3.3.5+incompatible diff --git a/adapters/kpgx5/kpgx.go b/adapters/kpgx5/kpgx.go index fbe8a20..c7fe4b2 100644 --- a/adapters/kpgx5/kpgx.go +++ b/adapters/kpgx5/kpgx.go @@ -6,10 +6,6 @@ import ( "github.com/jackc/pgx/v5/pgxpool" "github.com/vingarcia/ksql" "github.com/vingarcia/ksql/sqldialect" - - // This is imported here so the user don't - // have to worry about it when he uses it. - _ "github.com/lib/pq" ) // NewFromPgxPool builds a ksql.DB from a *pgxpool.Pool instance diff --git a/adapters/kpgx5/kpgx_test.go b/adapters/kpgx5/kpgx_test.go index 42a6c54..f0029b2 100644 --- a/adapters/kpgx5/kpgx_test.go +++ b/adapters/kpgx5/kpgx_test.go @@ -2,7 +2,6 @@ package kpgx import ( "context" - "database/sql" "fmt" "io" "log" @@ -17,11 +16,13 @@ import ( ) func TestAdapter(t *testing.T) { - postgresURL, closePostgres := startPostgresDB("ksql") + ctx := context.Background() + + postgresURL, closePostgres := startPostgresDB(ctx, "ksql") defer closePostgres() ksql.RunTestsForAdapter(t, "kpgx", sqldialect.PostgresDialect{}, postgresURL, func(t *testing.T) (ksql.DBAdapter, io.Closer) { - pool, err := pgxpool.New(context.TODO(), postgresURL) + pool, err := pgxpool.New(ctx, postgresURL) if err != nil { t.Fatal(err.Error()) } @@ -38,7 +39,7 @@ func (c closerAdapter) Close() error { return nil } -func startPostgresDB(dbName string) (databaseURL string, closer func()) { +func startPostgresDB(ctx context.Context, dbName string) (databaseURL string, closer func()) { // uses a sensible default on windows (tcp/http) and linux/osx (socket) pool, err := dockertest.NewPool("") if err != nil { @@ -74,15 +75,16 @@ func startPostgresDB(dbName string) (databaseURL string, closer func()) { resource.Expire(40) // Tell docker to hard kill the container in 40 seconds - var sqlDB *sql.DB + var sqlDB *pgxpool.Pool // exponential backoff-retry, because the application in the container might not be ready to accept connections yet pool.MaxWait = 10 * time.Second pool.Retry(func() error { - sqlDB, err = sql.Open("postgres", databaseUrl) + sqlDB, err = pgxpool.New(ctx, databaseUrl) if err != nil { return err } - return sqlDB.Ping() + + return sqlDB.Ping(ctx) }) if err != nil { log.Fatalf("Could not connect to docker: %s", err) diff --git a/test_adapters.go b/test_adapters.go index fdcb03f..c26f5fa 100644 --- a/test_adapters.go +++ b/test_adapters.go @@ -114,15 +114,14 @@ func QueryTest( for _, variation := range variations { t.Run(variation.desc, func(t *testing.T) { t.Run("using slice of structs", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } + defer closer.Close() t.Run("should return 0 results correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var users []user err := c.Query(ctx, &users, variation.queryPrefix+`FROM users WHERE id=1;`) @@ -136,9 +135,6 @@ func QueryTest( }) t.Run("should return a user correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('Bia', 0, '{"country":"BR"}')`) tt.AssertNoErr(t, err) @@ -154,9 +150,6 @@ func QueryTest( }) t.Run("should return multiple users correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('João Garcia', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) @@ -180,9 +173,6 @@ func QueryTest( }) t.Run("should query joined tables correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - // This test only makes sense with no query prefix if variation.queryPrefix != "" { return @@ -244,15 +234,14 @@ func QueryTest( }) t.Run("using slice of pointers to structs", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should return 0 results correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var users []*user err := c.Query(ctx, &users, variation.queryPrefix+`FROM users WHERE id=1;`) @@ -266,9 +255,6 @@ func QueryTest( }) t.Run("should return a user correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('Bia', 0, '{"country":"BR"}')`) tt.AssertNoErr(t, err) @@ -284,9 +270,6 @@ func QueryTest( }) t.Run("should return multiple users correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('João Garcia', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) @@ -315,9 +298,6 @@ func QueryTest( return } - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('João Ribeiro', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) var joao user @@ -366,15 +346,15 @@ func QueryTest( } t.Run("testing error cases", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should report error if input is not a pointer to a slice of structs", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age) VALUES ('Andréa Sá', 0)`) tt.AssertNoErr(t, err) @@ -397,9 +377,6 @@ func QueryTest( }) t.Run("should report error if the query is not valid", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var users []user err := c.Query(ctx, &users, `SELECT * FROM not a valid query`) @@ -407,9 +384,6 @@ func QueryTest( }) t.Run("should report error if the TagInfoCache returns an error", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // Provoque an error by sending an invalid struct: @@ -423,9 +397,6 @@ func QueryTest( }) t.Run("should report error if using nested struct and the query starts with SELECT", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var rows []struct { User user `tablename:"users"` @@ -437,9 +408,6 @@ func QueryTest( t.Run("should report error for nested structs with invalid types", func(t *testing.T) { t.Run("int", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var rows []struct { Foo int `tablename:"foo"` @@ -454,9 +422,6 @@ func QueryTest( }) t.Run("*struct", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var rows []struct { Foo *user `tablename:"foo"` @@ -472,9 +437,6 @@ func QueryTest( }) t.Run("should report error if nested struct is invalid", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var rows []struct { User user `tablename:"users"` @@ -563,9 +525,6 @@ func QueryTest( ctx, cancel := context.WithCancel(ctx) cancel() - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var users []user @@ -602,16 +561,16 @@ func QueryOneTest( }, } for _, variation := range variations { - err := createTables(dialect, connStr) - if err != nil { - t.Fatal("could not create test table!, reason:", err.Error()) - } - t.Run(variation.desc, func(t *testing.T) { - t.Run("should return RecordNotFoundErr when there are no results", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() + db, closer := newDBAdapter(t) + defer closer.Close() + err := createTables(ctx, db, dialect) + if err != nil { + t.Fatal("could not create test table!, reason:", err.Error()) + } + + t.Run("should return RecordNotFoundErr when there are no results", func(t *testing.T) { c := newTestDB(db, dialect) u := user{} err := c.QueryOne(ctx, &u, variation.queryPrefix+`FROM users WHERE id=1;`) @@ -619,9 +578,6 @@ func QueryOneTest( }) t.Run("should return a user correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('Bia', 0, '{"country":"BR"}')`) tt.AssertNoErr(t, err) @@ -638,9 +594,6 @@ func QueryOneTest( }) t.Run("should return only the first result on multiples matches", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('Andréa Sá', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) @@ -665,9 +618,6 @@ func QueryOneTest( return } - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('João Ribeiro', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) var joao user @@ -694,9 +644,6 @@ func QueryOneTest( }) t.Run("should handle column tags as case-insensitive as SQL does", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - _, err := db.ExecContext(ctx, `INSERT INTO users (name, age, address) VALUES ('Count Olivia', 0, '{"country":"US"}')`) tt.AssertNoErr(t, err) @@ -809,15 +756,15 @@ func InsertTest( t.Run("Insert", func(t *testing.T) { t.Run("success cases", func(t *testing.T) { t.Run("single primary key tables", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should insert one user correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u := user{ @@ -847,9 +794,6 @@ func InsertTest( // Using columns "id" and "name" as IDs: table := NewTable("users", "id", "name") - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u := user{ @@ -874,9 +818,6 @@ func InsertTest( }) t.Run("should work with anonymous structs", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Insert(ctx, usersTable, &struct { ID int `ksql:"id"` @@ -887,9 +828,6 @@ func InsertTest( }) t.Run("should work with preset IDs", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) usersByName := NewTable("users", "name") @@ -907,9 +845,6 @@ func InsertTest( }) t.Run("should work and retrieve the ID for structs with no attributes", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type tsUser struct { @@ -934,15 +869,15 @@ func InsertTest( }) t.Run("composite key tables", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should insert in composite key tables correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) table := NewTable("user_permissions", "id", "user_id", "perm_id") @@ -960,9 +895,6 @@ func InsertTest( }) t.Run("should accept partially provided values for composite key tables", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // Table defined with 3 values, but we'll provide only 2, @@ -996,9 +928,6 @@ func InsertTest( }) t.Run("when inserting a struct with no values but composite keys should still retrieve the IDs", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // Table defined with 3 values, but we'll provide only 2, @@ -1045,15 +974,15 @@ func InsertTest( }) t.Run("testing error cases", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should report error for invalid input types", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Insert(ctx, usersTable, "foo") @@ -1081,9 +1010,6 @@ func InsertTest( }) t.Run("should report error if for some reason the InsertMethod is invalid", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // This is an invalid value: @@ -1094,9 +1020,6 @@ func InsertTest( }) t.Run("should report error if it receives a nil pointer to a struct", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var u *user @@ -1105,9 +1028,6 @@ func InsertTest( }) t.Run("should report error if table contains an empty ID name", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Insert(ctx, NewTable("users", ""), &user{Name: "fake-name"}) @@ -1115,9 +1035,6 @@ func InsertTest( }) t.Run("should report error if ksql.Table.name is empty", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Insert(ctx, NewTable("", "id"), &user{Name: "fake-name"}) @@ -1125,9 +1042,6 @@ func InsertTest( }) t.Run("should not panic if a column doesn't exist in the database", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Insert(ctx, usersTable, &struct { @@ -1140,9 +1054,6 @@ func InsertTest( }) t.Run("should not panic if the ID column doesn't exist in the database", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) brokenTable := NewTable("users", "non_existing_id") @@ -1155,9 +1066,6 @@ func InsertTest( }) t.Run("should not panic if the ID column is missing in the struct", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Insert(ctx, usersTable, &struct { @@ -1174,9 +1082,6 @@ func InsertTest( }) t.Run("should report error context.Canceled the context has been canceled", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - ctx, cancel := context.WithCancel(ctx) cancel() @@ -1219,7 +1124,10 @@ func DeleteTest( ctx := context.Background() t.Run("Delete", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } @@ -1251,9 +1159,6 @@ func DeleteTest( for _, test := range tests { t.Run(test.desc, func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u1 := user{ @@ -1301,9 +1206,6 @@ func DeleteTest( t.Run("should delete from tables with composite primary keys correctly", func(t *testing.T) { t.Run("using structs", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // This permission should not be deleted, we'll use the id to check it: @@ -1336,9 +1238,6 @@ func DeleteTest( }) t.Run("using maps", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // This permission should not be deleted, we'll use the id to check it: @@ -1375,9 +1274,6 @@ func DeleteTest( }) t.Run("should return ErrRecordNotFound if no rows were deleted", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Delete(ctx, usersTable, 4200) @@ -1385,9 +1281,6 @@ func DeleteTest( }) t.Run("should report error if it receives a nil pointer to a struct", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var u *user @@ -1398,9 +1291,6 @@ func DeleteTest( t.Run("should report error if one of the ids is missing from the input", func(t *testing.T) { t.Run("single id", func(t *testing.T) { t.Run("struct with missing attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, NewTable("users", "id"), &struct { @@ -1411,9 +1301,6 @@ func DeleteTest( }) t.Run("struct with NULL attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, NewTable("users", "id"), &struct { @@ -1425,9 +1312,6 @@ func DeleteTest( }) t.Run("struct with zero attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, NewTable("users", "id"), &struct { @@ -1441,9 +1325,6 @@ func DeleteTest( t.Run("multiple ids", func(t *testing.T) { t.Run("struct with missing attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, &struct { @@ -1458,9 +1339,6 @@ func DeleteTest( }) t.Run("map with missing attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, map[string]interface{}{ @@ -1472,9 +1350,6 @@ func DeleteTest( }) t.Run("struct with NULL attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, &struct { @@ -1491,9 +1366,6 @@ func DeleteTest( }) t.Run("map with NULL attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, map[string]interface{}{ @@ -1506,9 +1378,6 @@ func DeleteTest( }) t.Run("struct with zero attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, &struct { @@ -1525,9 +1394,6 @@ func DeleteTest( }) t.Run("map with zero attr", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, userPermissionsTable, map[string]interface{}{ @@ -1542,9 +1408,6 @@ func DeleteTest( }) t.Run("should report error if table contains an empty ID name", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, NewTable("users", ""), &user{ID: 42, Name: "fake-name"}) @@ -1552,9 +1415,6 @@ func DeleteTest( }) t.Run("should report error if ksql.Table.name is empty", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Delete(ctx, NewTable("", "id"), &user{Name: "fake-name"}) @@ -1562,9 +1422,6 @@ func DeleteTest( }) t.Run("should report error context.Canceled the context has been canceled", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - ctx, cancel := context.WithCancel(ctx) cancel() @@ -1587,15 +1444,15 @@ func PatchTest( ctx := context.Background() t.Run("Patch", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("should update one user{} correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u := user{ @@ -1621,9 +1478,6 @@ func PatchTest( }) t.Run("should update one &user{} correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u := user{ @@ -1649,9 +1503,6 @@ func PatchTest( }) t.Run("should update tables with composite keys correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = createUserPermission(db, c.dialect, userPermission{ @@ -1685,9 +1536,6 @@ func PatchTest( }) t.Run("should ignore null pointers on partial updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type partialUser struct { @@ -1721,9 +1569,6 @@ func PatchTest( }) t.Run("should update valid pointers on partial updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type partialUser struct { @@ -1757,9 +1602,6 @@ func PatchTest( }) t.Run("should return ErrRecordNotFound when asked to update an inexistent user", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Patch(ctx, usersTable, user{ @@ -1770,9 +1612,6 @@ func PatchTest( }) t.Run("should report database errors correctly", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Patch(ctx, NewTable("non_existing_table"), user{ @@ -1783,9 +1622,6 @@ func PatchTest( }) t.Run("should report error if it receives a nil pointer to a struct", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) var u *user @@ -1794,9 +1630,6 @@ func PatchTest( }) t.Run("should report error if the struct has no fields to update", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err = c.Patch(ctx, usersTable, struct { @@ -1812,9 +1645,6 @@ func PatchTest( t.Run("should report error if the id is missing", func(t *testing.T) { t.Run("with a single primary key", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Patch(ctx, usersTable, &user{ @@ -1825,9 +1655,6 @@ func PatchTest( }) t.Run("with composite keys", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Patch(ctx, NewTable("user_permissions", "id", "user_id", "perm_id"), &userPermission{ @@ -1841,9 +1668,6 @@ func PatchTest( t.Run("should report error if the struct has no id", func(t *testing.T) { t.Run("with a single primary key", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Patch(ctx, usersTable, &struct { @@ -1856,9 +1680,6 @@ func PatchTest( }) t.Run("with composite keys", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) err := c.Patch(ctx, NewTable("user_permissions", "id", "user_id", "perm_id"), &struct { @@ -1874,9 +1695,6 @@ func PatchTest( }) t.Run("should report error context.Canceled the context has been canceled", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - ctx, cancel := context.WithCancel(ctx) cancel() @@ -1917,15 +1735,15 @@ func QueryChunksTest( } for _, variation := range variations { t.Run(variation.desc, func(t *testing.T) { + db, closer := newDBAdapter(t) + defer closer.Close() + t.Run("should query a single row correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{ @@ -1957,14 +1775,14 @@ func QueryChunksTest( }) t.Run("should query one chunk correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1", Address: address{Country: "US"}}) @@ -1998,14 +1816,14 @@ func QueryChunksTest( }) t.Run("should query chunks of 1 correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1", Address: address{Country: "US"}}) @@ -2039,14 +1857,14 @@ func QueryChunksTest( }) t.Run("should load partially filled chunks correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2078,16 +1896,12 @@ func QueryChunksTest( tt.AssertEqual(t, lengths, []int{2, 1}) }) - // xxx t.Run("should query joined tables correctly", func(t *testing.T) { // This test only makes sense with no query prefix if variation.queryPrefix != "" { return } - db, closer := newDBAdapter(t) - defer closer.Close() - joao := user{ Name: "Thiago Ribeiro", Age: 24, @@ -2150,14 +1964,14 @@ func QueryChunksTest( }) t.Run("should abort the first iteration when the callback returns an ErrAbortIteration", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2188,14 +2002,14 @@ func QueryChunksTest( }) t.Run("should abort the last iteration when the callback returns an ErrAbortIteration", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2230,14 +2044,14 @@ func QueryChunksTest( }) t.Run("should return error if the callback returns an error in the first iteration", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2268,14 +2082,14 @@ func QueryChunksTest( }) t.Run("should return error if the callback returns an error in the last iteration", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2430,14 +2244,14 @@ func TransactionTest( t.Run("Transaction", func(t *testing.T) { t.Run("should query a single row correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1"}) @@ -2456,14 +2270,14 @@ func TransactionTest( }) t.Run("should work normally in nested transactions", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u := user{ @@ -2492,14 +2306,14 @@ func TransactionTest( }) t.Run("should rollback when there are errors", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u1 := user{Name: "User1", Age: 42} @@ -2528,14 +2342,14 @@ func TransactionTest( }) t.Run("should rollback when the fn call panics", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) u1 := user{Name: "User1", Age: 42} @@ -2565,14 +2379,14 @@ func TransactionTest( }) t.Run("should handle rollback errors when the fn call panics", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) cMock := mockTxBeginner{ @@ -2599,14 +2413,14 @@ func TransactionTest( }) t.Run("should handle rollback errors when fn returns an error", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) cMock := mockTxBeginner{ @@ -2649,14 +2463,14 @@ func TransactionTest( }) t.Run("should report error if DBAdapter can't create transactions", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) c.db = mockDBAdapter{} @@ -2693,16 +2507,16 @@ func ModifiersTest( ctx := context.Background() t.Run("Modifiers", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } t.Run("timeNowUTC modifier", func(t *testing.T) { t.Run("should be set to time.Now().UTC() on insertion", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type tsUser struct { @@ -2733,9 +2547,6 @@ func ModifiersTest( }) t.Run("should be set to time.Now().UTC() on updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -2777,9 +2588,6 @@ func ModifiersTest( }) t.Run("should not alter the value on queries", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -2811,9 +2619,6 @@ func ModifiersTest( t.Run("timeNowUTC/skipUpdates modifier", func(t *testing.T) { t.Run("should be set to time.Now().UTC() on insertion", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type tsUser struct { @@ -2844,9 +2649,6 @@ func ModifiersTest( }) t.Run("should be ignored on updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -2884,9 +2686,6 @@ func ModifiersTest( }) t.Run("should not alter the value on queries", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -2918,9 +2717,6 @@ func ModifiersTest( t.Run("skipInserts modifier", func(t *testing.T) { t.Run("should ignore the field during insertions", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type tsUser struct { @@ -2948,9 +2744,6 @@ func ModifiersTest( }) t.Run("should have no effect on updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -2987,9 +2780,6 @@ func ModifiersTest( }) t.Run("should not alter the value on queries", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -3016,9 +2806,6 @@ func ModifiersTest( t.Run("skipUpdates modifier", func(t *testing.T) { t.Run("should set the field on insertion", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type tsUser struct { @@ -3042,9 +2829,6 @@ func ModifiersTest( }) t.Run("should be ignored on updates", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -3081,9 +2865,6 @@ func ModifiersTest( }) t.Run("should not alter the value on queries", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) type userWithNoTags struct { @@ -3110,9 +2891,6 @@ func ModifiersTest( t.Run("nullable modifier", func(t *testing.T) { t.Run("should prevent null fields from being ignored during insertions", func(t *testing.T) { - db, closer := newDBAdapter(t) - defer closer.Close() - c := newTestDB(db, dialect) // The default value of the column "nullable_field" @@ -3267,13 +3045,14 @@ func ScanRowsTest( t.Run("ScanRows", func(t *testing.T) { t.Run("should scan users correctly", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1", Age: 22}) _ = c.Insert(ctx, usersTable, &user{Name: "User2", Age: 14}) @@ -3294,11 +3073,12 @@ func ScanRowsTest( }) t.Run("should ignore extra columns from query", func(t *testing.T) { - err := createTables(dialect, connStr) - tt.AssertNoErr(t, err) - db, closer := newDBAdapter(t) defer closer.Close() + + err := createTables(ctx, db, dialect) + tt.AssertNoErr(t, err) + c := newTestDB(db, dialect) _ = c.Insert(ctx, usersTable, &user{Name: "User1", Age: 22}) @@ -3390,11 +3170,12 @@ func ScanRowsTest( for _, test := range tests { t.Run(test.desc, func(t *testing.T) { - err := createTables(dialect, connStr) - tt.AssertNoErr(t, err) - db, closer := newDBAdapter(t) defer closer.Close() + + err := createTables(ctx, db, dialect) + tt.AssertNoErr(t, err) + c := newTestDB(db, dialect) u := user{Name: "User22", Age: 22} @@ -3416,14 +3197,14 @@ func ScanRowsTest( }) t.Run("should report error for closed rows", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'") tt.AssertNoErr(t, err) @@ -3435,14 +3216,14 @@ func ScanRowsTest( }) t.Run("should report if record is not a pointer", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'") tt.AssertNoErr(t, err) defer rows.Close() @@ -3453,14 +3234,14 @@ func ScanRowsTest( }) t.Run("should report if record is not a pointer to struct", func(t *testing.T) { - err := createTables(dialect, connStr) + db, closer := newDBAdapter(t) + defer closer.Close() + + err := createTables(ctx, db, dialect) if err != nil { t.Fatal("could not create test table!, reason:", err.Error()) } - db, closer := newDBAdapter(t) - defer closer.Close() - rows, err := db.QueryContext(ctx, "SELECT * FROM users WHERE name='User2'") tt.AssertNoErr(t, err) defer rows.Close() @@ -3472,24 +3253,12 @@ func ScanRowsTest( }) } -func createTables(dialect sqldialect.Provider, connStr string) error { - driver := dialect.DriverName() +func createTables(ctx context.Context, db DBAdapter, dialect sqldialect.Provider) (err error) { + db.ExecContext(ctx, `DROP TABLE users`) - if connStr == "" { - return fmt.Errorf("unsupported dialect: '%s'", driver) - } - - db, err := sql.Open(driver, connStr) - if err != nil { - return err - } - defer db.Close() - - db.Exec(`DROP TABLE users`) - - switch driver { + switch dialect.DriverName() { case "sqlite3": - _, err = db.Exec(`CREATE TABLE users ( + _, err = db.ExecContext(ctx, `CREATE TABLE users ( id INTEGER PRIMARY KEY, age INTEGER, name TEXT, @@ -3499,7 +3268,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { nullable_field TEXT DEFAULT "not_null" )`) case "postgres": - _, err = db.Exec(`CREATE TABLE users ( + _, err = db.ExecContext(ctx, `CREATE TABLE users ( id serial PRIMARY KEY, age INT, name VARCHAR(50), @@ -3509,7 +3278,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { nullable_field VARCHAR(50) DEFAULT 'not_null' )`) case "mysql": - _, err = db.Exec(`CREATE TABLE users ( + _, err = db.ExecContext(ctx, `CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, age INT, name VARCHAR(50), @@ -3519,7 +3288,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { nullable_field VARCHAR(50) DEFAULT "not_null" )`) case "sqlserver": - _, err = db.Exec(`CREATE TABLE users ( + _, err = db.ExecContext(ctx, `CREATE TABLE users ( id INT IDENTITY(1,1) PRIMARY KEY, age INT, name VARCHAR(50), @@ -3533,29 +3302,29 @@ func createTables(dialect sqldialect.Provider, connStr string) error { return fmt.Errorf("failed to create new users table: %s", err.Error()) } - db.Exec(`DROP TABLE posts`) + db.ExecContext(ctx, `DROP TABLE posts`) - switch driver { + switch dialect.DriverName() { case "sqlite3": - _, err = db.Exec(`CREATE TABLE posts ( + _, err = db.ExecContext(ctx, `CREATE TABLE posts ( id INTEGER PRIMARY KEY, user_id INTEGER, title TEXT )`) case "postgres": - _, err = db.Exec(`CREATE TABLE posts ( + _, err = db.ExecContext(ctx, `CREATE TABLE posts ( id serial PRIMARY KEY, user_id INT, title VARCHAR(50) )`) case "mysql": - _, err = db.Exec(`CREATE TABLE posts ( + _, err = db.ExecContext(ctx, `CREATE TABLE posts ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, title VARCHAR(50) )`) case "sqlserver": - _, err = db.Exec(`CREATE TABLE posts ( + _, err = db.ExecContext(ctx, `CREATE TABLE posts ( id INT IDENTITY(1,1) PRIMARY KEY, user_id INT, title VARCHAR(50) @@ -3565,11 +3334,11 @@ func createTables(dialect sqldialect.Provider, connStr string) error { return fmt.Errorf("failed to create new posts table: %s", err.Error()) } - db.Exec(`DROP TABLE user_permissions`) + db.ExecContext(ctx, `DROP TABLE user_permissions`) - switch driver { + switch dialect.DriverName() { case "sqlite3": - _, err = db.Exec(`CREATE TABLE user_permissions ( + _, err = db.ExecContext(ctx, `CREATE TABLE user_permissions ( id INTEGER PRIMARY KEY, user_id INTEGER, perm_id INTEGER, @@ -3577,7 +3346,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { UNIQUE (user_id, perm_id) )`) case "postgres": - _, err = db.Exec(`CREATE TABLE user_permissions ( + _, err = db.ExecContext(ctx, `CREATE TABLE user_permissions ( id serial PRIMARY KEY, user_id INT, perm_id INT, @@ -3585,7 +3354,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { UNIQUE (user_id, perm_id) )`) case "mysql": - _, err = db.Exec(`CREATE TABLE user_permissions ( + _, err = db.ExecContext(ctx, `CREATE TABLE user_permissions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, perm_id INT, @@ -3593,7 +3362,7 @@ func createTables(dialect sqldialect.Provider, connStr string) error { UNIQUE KEY (user_id, perm_id) )`) case "sqlserver": - _, err = db.Exec(`CREATE TABLE user_permissions ( + _, err = db.ExecContext(ctx, `CREATE TABLE user_permissions ( id INT IDENTITY(1,1) PRIMARY KEY, user_id INT, perm_id INT,