+45
-4
spindle/db/db.go
+45
-4
spindle/db/db.go
···
1
1
package db
2
2
3
3
import (
4
+
"context"
4
5
"database/sql"
5
6
"strings"
6
7
7
8
_ "github.com/mattn/go-sqlite3"
9
+
"tangled.org/core/log"
10
+
"tangled.org/core/orm"
8
11
)
9
12
10
13
type DB struct {
11
14
*sql.DB
12
15
}
13
16
14
-
func Make(dbPath string) (*DB, error) {
17
+
func Make(ctx context.Context, dbPath string) (*DB, error) {
15
18
// https://github.com/mattn/go-sqlite3#connection-string
16
19
opts := []string{
17
20
"_foreign_keys=1",
···
19
22
"_synchronous=NORMAL",
20
23
"_auto_vacuum=incremental",
21
24
}
25
+
26
+
logger := log.FromContext(ctx)
27
+
logger = log.SubLogger(logger, "db")
22
28
23
29
db, err := sql.Open("sqlite3", dbPath+"?"+strings.Join(opts, "&"))
24
30
if err != nil {
25
31
return nil, err
26
32
}
27
33
28
-
// NOTE: If any other migration is added here, you MUST
29
-
// copy the pattern in appview: use a single sql.Conn
30
-
// for every migration.
34
+
conn, err := db.Conn(ctx)
35
+
if err != nil {
36
+
return nil, err
37
+
}
38
+
defer conn.Close()
31
39
32
40
_, err = db.Exec(`
33
41
create table if not exists _jetstream (
···
75
83
if err != nil {
76
84
return nil, err
77
85
}
86
+
87
+
// run migrations
88
+
89
+
// NOTE: this won't migrate existing records
90
+
// they will be fetched again with tap instead
91
+
orm.RunMigration(conn, logger, "add-rkey-to-repos", func(tx *sql.Tx) error {
92
+
// archive legacy repos (just in case)
93
+
_, err = tx.Exec(`alter table repos rename to repos_old`)
94
+
if err != nil {
95
+
return err
96
+
}
97
+
98
+
_, err := tx.Exec(`
99
+
create table repos (
100
+
-- identifiers
101
+
id integer primary key autoincrement,
102
+
did text not null,
103
+
rkey text not null,
104
+
at_uri text generated always as ('at://' || did || '/' || 'sh.tangled.repo' || '/' || rkey) stored,
105
+
106
+
name text not null,
107
+
knot text not null,
108
+
109
+
addedAt text not null default (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
110
+
unique(did, rkey)
111
+
);
112
+
`)
113
+
if err != nil {
114
+
return err
115
+
}
116
+
117
+
return nil
118
+
})
78
119
79
120
return &DB{db}, nil
80
121
}
+1
-1
spindle/server.go
+1
-1
spindle/server.go
···
50
50
func New(ctx context.Context, cfg *config.Config, engines map[string]models.Engine) (*Spindle, error) {
51
51
logger := log.FromContext(ctx)
52
52
53
-
d, err := db.Make(cfg.Server.DBPath)
53
+
d, err := db.Make(ctx, cfg.Server.DBPath)
54
54
if err != nil {
55
55
return nil, fmt.Errorf("failed to setup db: %w", err)
56
56
}