Skip to content

Commit c940071

Browse files
author
Alan Shaw
committed
refactor: always use pool
1 parent c29731d commit c940071

File tree

5 files changed

+18
-155
lines changed

5 files changed

+18
-155
lines changed

Diff for: batching.go

+2-16
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,8 @@ func (b *batch) Commit() error {
3838
}
3939

4040
func (b *batch) CommitContext(ctx context.Context) error {
41-
var res pgx.BatchResults
42-
var conn *pgx.Conn
43-
var err error
44-
45-
if b.ds.pool != nil {
46-
res = b.ds.pool.SendBatch(ctx, b.batch)
47-
defer res.Close()
48-
} else {
49-
conn, err = pgx.ConnectConfig(ctx, b.ds.connConf)
50-
if err != nil {
51-
return err
52-
}
53-
res = conn.SendBatch(ctx, b.batch)
54-
defer res.Close()
55-
defer conn.Close(ctx)
56-
}
41+
res := b.ds.pool.SendBatch(ctx, b.batch)
42+
defer res.Close()
5743

5844
for i := 0; i < b.batch.Len(); i++ {
5945
_, err := res.Exec()

Diff for: datastore.go

+13-114
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,27 @@ import (
66

77
ds "github.com/ipfs/go-datastore"
88
dsq "github.com/ipfs/go-datastore/query"
9-
"github.com/jackc/pgconn"
109
"github.com/jackc/pgx/v4"
1110
"github.com/jackc/pgx/v4/pgxpool"
1211
)
1312

1413
// Datastore is a PostgreSQL backed datastore.
1514
type Datastore struct {
16-
table string
17-
connConf *pgx.ConnConfig
18-
pool *pgxpool.Pool
19-
}
20-
21-
type rowQuerier interface {
22-
QueryRow(ctx context.Context, sql string, args ...interface{}) pgx.Row
23-
}
24-
25-
type execQuerier interface {
26-
Exec(ctx context.Context, sql string, arguments ...interface{}) (pgconn.CommandTag, error)
15+
table string
16+
pool *pgxpool.Pool
2717
}
2818

2919
// NewDatastore creates a new PostgreSQL datastore
30-
func NewDatastore(connString string, options ...Option) (*Datastore, error) {
20+
func NewDatastore(ctx context.Context, connString string, options ...Option) (*Datastore, error) {
3121
cfg := Options{}
3222
cfg.Apply(append([]Option{OptionDefaults}, options...)...)
3323

34-
connConf, err := pgx.ParseConfig(connString)
24+
pool, err := pgxpool.Connect(ctx, connString)
3525
if err != nil {
3626
return nil, err
3727
}
3828

39-
return &Datastore{table: cfg.Table, connConf: connConf, pool: cfg.Pool}, nil
29+
return &Datastore{table: cfg.Table, pool: pool}, nil
4030
}
4131

4232
// Close closes the underying PostgreSQL database.
@@ -55,24 +45,10 @@ func (d *Datastore) Delete(key ds.Key) error {
5545
// DeleteContext removes a row from the PostgreSQL database by the given key.
5646
func (d *Datastore) DeleteContext(ctx context.Context, key ds.Key) error {
5747
sql := fmt.Sprintf("DELETE FROM %s WHERE key = $1", d.table)
58-
59-
var eq execQuerier
60-
if d.pool != nil {
61-
eq = d.pool
62-
} else {
63-
c, err := pgx.ConnectConfig(ctx, d.connConf)
64-
if err != nil {
65-
return err
66-
}
67-
defer c.Close(ctx)
68-
eq = c
69-
}
70-
71-
_, err := eq.Exec(ctx, sql, key.String())
48+
_, err := d.pool.Exec(ctx, sql, key.String())
7249
if err != nil {
7350
return err
7451
}
75-
7652
return nil
7753
}
7854

@@ -84,20 +60,7 @@ func (d *Datastore) Get(key ds.Key) (value []byte, err error) {
8460
// GetContext retrieves a value from the PostgreSQL database by the given key.
8561
func (d *Datastore) GetContext(ctx context.Context, key ds.Key) (value []byte, err error) {
8662
sql := fmt.Sprintf("SELECT data FROM %s WHERE key = $1", d.table)
87-
88-
var rq rowQuerier
89-
if d.pool != nil {
90-
rq = d.pool
91-
} else {
92-
c, err := pgx.ConnectConfig(ctx, d.connConf)
93-
if err != nil {
94-
return nil, err
95-
}
96-
defer c.Close(ctx)
97-
rq = c
98-
}
99-
100-
row := rq.QueryRow(ctx, sql, key.String())
63+
row := d.pool.QueryRow(ctx, sql, key.String())
10164
var out []byte
10265
switch err := row.Scan(&out); err {
10366
case pgx.ErrNoRows:
@@ -117,20 +80,7 @@ func (d *Datastore) Has(key ds.Key) (bool, error) {
11780
// HasContext determines if a value for the given key exists in the PostgreSQL database.
11881
func (d *Datastore) HasContext(ctx context.Context, key ds.Key) (bool, error) {
11982
sql := fmt.Sprintf("SELECT exists(SELECT 1 FROM %s WHERE key = $1)", d.table)
120-
121-
var rq rowQuerier
122-
if d.pool != nil {
123-
rq = d.pool
124-
} else {
125-
c, err := pgx.ConnectConfig(ctx, d.connConf)
126-
if err != nil {
127-
return false, err
128-
}
129-
defer c.Close(ctx)
130-
rq = c
131-
}
132-
133-
row := rq.QueryRow(ctx, sql, key.String())
83+
row := d.pool.QueryRow(ctx, sql, key.String())
13484
var exists bool
13585
switch err := row.Scan(&exists); err {
13686
case pgx.ErrNoRows:
@@ -150,24 +100,10 @@ func (d *Datastore) Put(key ds.Key, value []byte) error {
150100
// PutContext "upserts" a row into the PostgreSQL database.
151101
func (d *Datastore) PutContext(ctx context.Context, key ds.Key, value []byte) error {
152102
sql := fmt.Sprintf("INSERT INTO %s (key, data) VALUES ($1, $2) ON CONFLICT (key) DO UPDATE SET data = $2", d.table)
153-
154-
var eq execQuerier
155-
if d.pool != nil {
156-
eq = d.pool
157-
} else {
158-
c, err := pgx.ConnectConfig(ctx, d.connConf)
159-
if err != nil {
160-
return err
161-
}
162-
defer c.Close(ctx)
163-
eq = c
164-
}
165-
166-
_, err := eq.Exec(ctx, sql, key.String(), value)
103+
_, err := d.pool.Exec(ctx, sql, key.String(), value)
167104
if err != nil {
168105
return err
169106
}
170-
171107
return nil
172108
}
173109

@@ -205,25 +141,9 @@ func (d *Datastore) QueryContext(ctx context.Context, q dsq.Query) (dsq.Results,
205141
}
206142
}
207143

208-
var conn *pgx.Conn
209-
var rows pgx.Rows
210-
var err error
211-
212-
if d.pool != nil {
213-
rows, err = d.pool.Query(ctx, sql)
214-
if err != nil {
215-
return nil, err
216-
}
217-
} else {
218-
conn, err = pgx.ConnectConfig(ctx, d.connConf)
219-
if err != nil {
220-
return nil, err
221-
}
222-
223-
rows, err = conn.Query(ctx, sql)
224-
if err != nil {
225-
return nil, err
226-
}
144+
rows, err := d.pool.Query(ctx, sql)
145+
if err != nil {
146+
return nil, err
227147
}
228148

229149
it := dsq.Iterator{
@@ -265,14 +185,6 @@ func (d *Datastore) QueryContext(ctx context.Context, q dsq.Query) (dsq.Results,
265185
},
266186
Close: func() error {
267187
rows.Close()
268-
269-
if d.pool == nil {
270-
err := conn.Close(ctx)
271-
if err != nil {
272-
return err
273-
}
274-
}
275-
276188
return nil
277189
},
278190
}
@@ -312,20 +224,7 @@ func (d *Datastore) GetSize(key ds.Key) (int, error) {
312224
// Returns -1 if not found or other error occurs.
313225
func (d *Datastore) GetSizeContext(ctx context.Context, key ds.Key) (int, error) {
314226
sql := fmt.Sprintf("SELECT octet_length(data) FROM %s WHERE key = $1", d.table)
315-
316-
var rq rowQuerier
317-
if d.pool != nil {
318-
rq = d.pool
319-
} else {
320-
c, err := pgx.ConnectConfig(ctx, d.connConf)
321-
if err != nil {
322-
return -1, err
323-
}
324-
defer c.Close(ctx)
325-
rq = c
326-
}
327-
328-
row := rq.QueryRow(ctx, sql, key.String())
227+
row := d.pool.QueryRow(ctx, sql, key.String())
329228
var size int
330229
switch err := row.Scan(&size); err {
331230
case pgx.ErrNoRows:

Diff for: datastore_test.go

+3-12
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99

1010
dstest "github.com/ipfs/go-datastore/test"
1111
"github.com/jackc/pgx/v4"
12-
"github.com/jackc/pgx/v4/pgxpool"
1312
)
1413

1514
var initOnce sync.Once
@@ -58,7 +57,7 @@ func initPG(t *testing.T) {
5857
//
5958
// d, close := newDS(t)
6059
// defer close()
61-
func newDS(t *testing.T, withPool bool) (*Datastore, func()) {
60+
func newDS(t *testing.T) (*Datastore, func()) {
6261
initPG(t)
6362
connString := fmt.Sprintf(
6463
"postgres://%s:%s@%s/%s?sslmode=disable",
@@ -79,23 +78,15 @@ func newDS(t *testing.T, withPool bool) (*Datastore, func()) {
7978
if err != nil {
8079
t.Fatal(err)
8180
}
82-
opts := []Option{}
83-
if withPool {
84-
pool, err := pgxpool.Connect(context.Background(), connString)
85-
if err != nil {
86-
t.Fatal(err)
87-
}
88-
opts = append(opts, Pool(pool))
89-
}
90-
d, err := NewDatastore(connString, opts...)
81+
d, err := NewDatastore(context.Background(), connString)
9182
return d, func() {
9283
_, _ = conn.Exec(context.Background(), "DROP TABLE IF EXISTS blocks")
9384
_ = conn.Close(context.Background())
9485
}
9586
}
9687

9788
func TestSuite(t *testing.T) {
98-
d, done := newDS(t, true)
89+
d, done := newDS(t)
9990
defer done()
10091
dstest.SubtestAll(t, d)
10192
}

Diff for: go.mod

-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,5 @@ go 1.14
44

55
require (
66
github.com/ipfs/go-datastore v0.4.4
7-
github.com/jackc/pgconn v1.5.0
87
github.com/jackc/pgx/v4 v4.6.0
98
)

Diff for: options.go

-12
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@ package pgds
22

33
import (
44
"fmt"
5-
6-
"github.com/jackc/pgx/v4/pgxpool"
75
)
86

97
// Options are Datastore options
108
type Options struct {
119
Table string
12-
Pool *pgxpool.Pool
1310
}
1411

1512
// Option is the Datastore option type.
@@ -42,12 +39,3 @@ func Table(t string) Option {
4239
return nil
4340
}
4441
}
45-
46-
// Pool configures the connection pool the datastore should use.
47-
// Defaults to no pool.
48-
func Pool(p *pgxpool.Pool) Option {
49-
return func(o *Options) error {
50-
o.Pool = p
51-
return nil
52-
}
53-
}

0 commit comments

Comments
 (0)