-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathdb.go
126 lines (111 loc) · 3.22 KB
/
db.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
package git
import (
"log/slog"
"time"
"github.com/jmoiron/sqlx"
_ "modernc.org/sqlite"
)
// PatchRequest is a database model for patches submitted to a Repo.
type PatchRequest struct {
ID int64 `db:"id"`
Pubkey string `db:"pubkey"`
RepoID int64 `db:"repo_id"`
Name string `db:"name"`
Text string `db:"text"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
// Patch is a database model for a single entry in a patchset.
// This usually corresponds to a git commit.
type Patch struct {
ID int64 `db:"id"`
Pubkey string `db:"pubkey"`
PatchRequestID int64 `db:"patch_request_id"`
AuthorName string `db:"author_name"`
AuthorEmail string `db:"author_email"`
Title string `db:"title"`
Body string `db:"body"`
CommitSha string `db:"commit_sha"`
CommitDate time.Time `db:"commit_date"`
Review bool `db:"review"`
RawText string `db:"raw_text"`
CreatedAt time.Time `db:"created_at"`
}
// Comment is a database model for a non-patch comment within a PatchRequest.
type Comment struct {
ID int64 `db:"id"`
Pubkey string `db:"pubkey"`
PatchRequestID int64 `db:"patch_request_id"`
Text string `db:"text"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
type GitDB interface {
}
// DB is the interface for a pico/git database.
type DB struct {
*sqlx.DB
logger *slog.Logger
}
var schema = `
CREATE TABLE IF NOT EXISTS patch_requests (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pubkey TEXT NOT NULL,
repo_id TEXT NOT NULL,
name TEXT NOT NULL,
text TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL
);
CREATE TABLE IF NOT EXISTS patches (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pubkey TEXT NOT NULL,
patch_request_id INTEGER NOT NULL,
author_name TEXT NOT NULL,
author_email TEXT NOT NULL,
title TEXT NOT NULL,
body TEXT NOT NULL,
commit_sha TEXT NOT NULL,
commit_date DATETIME NOT NULL,
review BOOLEAN NOT NULL DEFAULT false,
raw_text TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT pr_id_fk
FOREIGN KEY(patch_request_id) REFERENCES patch_requests(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CREATE TABLE IF NOT EXISTS comments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pubkey TEXT NOT NULL,
patch_request_id INTEGER NOT NULL,
text TEXT NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL,
CONSTRAINT pr_id_fk
FOREIGN KEY(patch_request_id) REFERENCES patch_requests(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
`
// Open opens a database connection.
func Open(dsn string, logger *slog.Logger) (*DB, error) {
db, err := sqlx.Connect("sqlite", dsn)
if err != nil {
return nil, err
}
d := &DB{
DB: db,
logger: logger,
}
return d, nil
}
func (d *DB) Migrate() {
// exec the schema or fail; multi-statement Exec behavior varies between
// database drivers; pq will exec them all, sqlite3 won't, ymmv
d.DB.MustExec(schema)
}
// Close implements db.DB.
func (d *DB) Close() error {
return d.DB.Close()
}