Skip to content

Commit 27049e5

Browse files
Defer driver search to Open() (#93)
No longer dependent on initialisation order, and also allows explicit selection using option.
1 parent d30aac0 commit 27049e5

File tree

3 files changed

+37
-38
lines changed

3 files changed

+37
-38
lines changed

pgx_test.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,33 +16,29 @@ func init() {
1616
}
1717

1818
func TestAdapterPgx_specs(t *testing.T) {
19-
driverName = "pgx"
20-
adapter := MustOpen(dsn())
19+
adapter := MustOpen(dsn(), WithDriver("pgx"))
2120
defer adapter.Close()
2221

2322
repo := rel.New(adapter)
2423
AdapterSpecs(t, repo)
2524
}
2625

2726
func TestAdapterPgx_Transaction_commitError(t *testing.T) {
28-
driverName = "pgx"
29-
adapter := MustOpen(dsn())
27+
adapter := MustOpen(dsn(), WithDriver("pgx"))
3028
defer adapter.Close()
3129

3230
assert.NotNil(t, adapter.Commit(ctx))
3331
}
3432

3533
func TestAdapterPgx_Transaction_rollbackError(t *testing.T) {
36-
driverName = "pgx"
37-
adapter := MustOpen(dsn())
34+
adapter := MustOpen(dsn(), WithDriver("pgx"))
3835
defer adapter.Close()
3936

4037
assert.NotNil(t, adapter.Rollback(ctx))
4138
}
4239

4340
func TestAdapterPgx_Exec_error(t *testing.T) {
44-
driverName = "pgx"
45-
adapter := MustOpen(dsn())
41+
adapter := MustOpen(dsn(), WithDriver("pgx"))
4642
defer adapter.Close()
4743

4844
_, _, err := adapter.Exec(ctx, "error", nil)
@@ -51,7 +47,6 @@ func TestAdapterPgx_Exec_error(t *testing.T) {
5147

5248
func TestAdapterPgx_InvalidDriverPanic(t *testing.T) {
5349
assert.Panics(t, func() {
54-
driverName = "pgx/v4"
55-
MustOpen("postgres://test:test@localhost:1111/test?sslmode=disable&timezone=Asia/Jakarta")
50+
MustOpen("postgres://test:test@localhost:1111/test?sslmode=disable&timezone=Asia/Jakarta", WithDriver("pgx/v4"))
5651
})
5752
}

postgres.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package postgres
1616
import (
1717
"context"
1818
db "database/sql"
19+
"slices"
1920
"time"
2021

2122
"github.com/go-rel/rel"
@@ -31,8 +32,6 @@ type Postgres struct {
3132
// Name of database type this adapter implements.
3233
const Name string = "postgres"
3334

34-
var driverName string = "postgres"
35-
3635
// New postgres adapter using existing connection.
3736
func New(database *db.DB) rel.Adapter {
3837
var (
@@ -65,15 +64,37 @@ func New(database *db.DB) rel.Adapter {
6564
}
6665
}
6766

67+
type OpenOpt struct {
68+
driver string
69+
}
70+
71+
func WithDriver(driver string) OpenOpt {
72+
return OpenOpt{driver: driver}
73+
}
74+
6875
// Open postgres connection using dsn.
69-
func Open(dsn string) (rel.Adapter, error) {
76+
func Open(dsn string, opts ...OpenOpt) (rel.Adapter, error) {
77+
// Default to postgres driver
78+
driverName := "postgres"
79+
80+
// Identify if pgx driver is available and default to that instead.
81+
if slices.Contains(db.Drivers(), "pgx") {
82+
driverName = "pgx"
83+
}
84+
85+
for _, opts := range opts {
86+
if opts.driver != "" {
87+
driverName = opts.driver
88+
}
89+
}
90+
7091
database, err := db.Open(driverName, dsn)
7192
return New(database), err
7293
}
7394

7495
// MustOpen postgres connection using dsn.
75-
func MustOpen(dsn string) rel.Adapter {
76-
adapter, err := Open(dsn)
96+
func MustOpen(dsn string, opts ...OpenOpt) rel.Adapter {
97+
adapter, err := Open(dsn, opts...)
7798
if err != nil {
7899
panic(err)
79100
}
@@ -195,13 +216,3 @@ func columnMapper(column *rel.Column) (string, int, int) {
195216

196217
return typ, m, n
197218
}
198-
199-
func init() {
200-
// Identify if pgx driver is available and default to that instead.
201-
for _, drv := range db.Drivers() {
202-
if drv == "pgx" {
203-
driverName = "pgx"
204-
break
205-
}
206-
}
207-
}

postgres_test.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ func dsn() string {
2929
}
3030

3131
func TestAdapter_Name(t *testing.T) {
32-
driverName = "postgres"
33-
adapter := MustOpen(dsn())
32+
adapter := MustOpen(dsn(), WithDriver("postgres"))
3433
defer adapter.Close()
3534

3635
assert.Equal(t, Name, adapter.Name())
@@ -115,8 +114,7 @@ func TestAdapter_specs(t *testing.T) {
115114
return
116115
}
117116

118-
driverName = "postgres"
119-
adapter := MustOpen(dsn())
117+
adapter := MustOpen(dsn(), WithDriver("postgres"))
120118
defer adapter.Close()
121119

122120
repo := rel.New(adapter)
@@ -129,7 +127,6 @@ func TestAdapter_PrimaryReplica_specs(t *testing.T) {
129127
return
130128
}
131129

132-
driverName = "postgres"
133130
adapter := primaryreplica.New(
134131
MustOpen("postgres://rel:rel@localhost:25432/rel_test?sslmode=disable&timezone=Asia/Jakarta"),
135132
MustOpen("postgres://rel:rel@localhost:25433/rel_test?sslmode=disable&timezone=Asia/Jakarta"),
@@ -142,24 +139,21 @@ func TestAdapter_PrimaryReplica_specs(t *testing.T) {
142139
}
143140

144141
func TestAdapter_Transaction_commitError(t *testing.T) {
145-
driverName = "postgres"
146-
adapter := MustOpen(dsn())
142+
adapter := MustOpen(dsn(), WithDriver("postgres"))
147143
defer adapter.Close()
148144

149145
assert.NotNil(t, adapter.Commit(ctx))
150146
}
151147

152148
func TestAdapter_Transaction_rollbackError(t *testing.T) {
153-
driverName = "postgres"
154-
adapter := MustOpen(dsn())
149+
adapter := MustOpen(dsn(), WithDriver("postgres"))
155150
defer adapter.Close()
156151

157152
assert.NotNil(t, adapter.Rollback(ctx))
158153
}
159154

160155
func TestAdapter_Exec_error(t *testing.T) {
161-
driverName = "postgres"
162-
adapter, err := Open(dsn())
156+
adapter, err := Open(dsn(), WithDriver("postgres"))
163157
assert.Nil(t, err)
164158
defer adapter.Close()
165159

@@ -168,8 +162,7 @@ func TestAdapter_Exec_error(t *testing.T) {
168162
}
169163

170164
func TestAdapter_TableBuilder(t *testing.T) {
171-
driverName = "postgres"
172-
adapter := MustOpen(dsn())
165+
adapter := MustOpen(dsn(), WithDriver("postgres"))
173166
defer adapter.Close()
174167

175168
tests := []struct {

0 commit comments

Comments
 (0)