blob: 4de3d4eba6e0a9c0353c3a4878f1916503802590 [file] [log] [blame]
lb5tr716ecf62019-08-05 17:33:29 -07001package model
2
3import (
4 "code.hackerspace.pl/hscloud/bgpwtf/cccampix/pgpencryptor/model/migrations"
5 "context"
6 "fmt"
7 migrate "github.com/golang-migrate/migrate/v4"
8 _ "github.com/golang-migrate/migrate/v4/database/cockroachdb"
9 "github.com/jmoiron/sqlx"
10 _ "github.com/lib/pq"
11 "strings"
12)
13
14type Model interface {
15 MigrateUp() error
16 PutKey(ctx context.Context, key *PgpKey) error
17 GetKey(ctx context.Context, keyID []byte) (*PgpKey, error)
18}
19
20type sqlModel struct {
21 db *sqlx.DB
22 dsn string
23}
24
25type PgpKey struct {
26 Fingerprint []byte
27 KeyData []byte
28 Okay bool
29}
30
31func Connect(ctx context.Context, driver, dsn string) (Model, error) {
32 if dsn == "" {
33 return nil, fmt.Errorf("dsn cannot be empty")
34 }
35 db, err := sqlx.ConnectContext(ctx, driver, dsn)
36 if err != nil {
37 return nil, fmt.Errorf("could not connect to database: %v", err)
38 }
39 return &sqlModel{
40 db: db,
41 dsn: dsn,
42 }, nil
43}
44
45func (m *sqlModel) MigrateUp() error {
46 dsn := "cockroach://" + strings.TrimPrefix(m.dsn, "postgres://")
47 mig, err := migrations.New(dsn)
48 if err != nil {
49 return err
50 }
51 err = mig.Up()
52 switch err {
53 case migrate.ErrNoChange:
54 return nil
55 default:
56 return err
57 }
58}