/
database.go
72 lines (56 loc) · 1.87 KB
/
database.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package server
import (
"context"
"time"
"github.com/honeycombio/beeline-go/wrappers/hnysqlx"
// Register PostgreSQL driver bits
_ "github.com/lib/pq"
"github.com/jmoiron/sqlx"
"github.com/travis-ci/jupiter-brain"
)
type database interface {
SaveInstance(context.Context, *jupiterbrain.Instance) error
DestroyInstance(context.Context, string) error
FetchInstances(context.Context, *databaseQuery) ([]*jupiterbrain.Instance, error)
}
type databaseQuery struct {
MinAge time.Duration
}
type pgDatabase struct {
conn *hnysqlx.DB
}
func newPGDatabase(url string, maxOpenDatabaseConnections int) (*pgDatabase, error) {
conn, err := sqlx.Open("postgres", url)
if err != nil {
return nil, err
}
conn.DB.SetMaxOpenConns(maxOpenDatabaseConnections)
return &pgDatabase{
conn: hnysqlx.WrapDB(conn),
}, nil
}
func (db *pgDatabase) SaveInstance(ctx context.Context, inst *jupiterbrain.Instance) error {
_, err := db.conn.ExecContext(ctx, `INSERT INTO jupiter_brain.instances(id, created_at) VALUES ($1, $2)`, inst.ID, inst.CreatedAt)
return err
}
func (db *pgDatabase) FetchInstances(ctx context.Context, q *databaseQuery) ([]*jupiterbrain.Instance, error) {
instances := []*jupiterbrain.Instance{}
rows, err := db.conn.QueryxContext(ctx, `SELECT * FROM jupiter_brain.instances WHERE destroyed_at IS NULL AND ((now() AT TIME ZONE 'UTC') - created_at) >= $1::interval`, q.MinAge.String())
if err != nil {
return instances, err
}
defer func() { _ = rows.Close() }()
for rows.Next() {
instance := &jupiterbrain.Instance{}
err = rows.StructScan(instance)
if err != nil {
return instances, err
}
instances = append(instances, instance)
}
return instances, nil
}
func (db *pgDatabase) DestroyInstance(ctx context.Context, id string) error {
_, err := db.conn.ExecContext(ctx, `UPDATE jupiter_brain.instances SET destroyed_at = now() WHERE id = $1`, id)
return err
}