1package db
2
3import (
4 "sync"
5
6 "gorm.io/gorm"
7 "gorm.io/gorm/clause"
8)
9
10type DB struct {
11 cli *gorm.DB
12 mu sync.Mutex
13}
14
15func NewDB(cli *gorm.DB) *DB {
16 return &DB{
17 cli: cli,
18 mu: sync.Mutex{},
19 }
20}
21
22func (db *DB) Create(value any, clauses []clause.Expression) *gorm.DB {
23 db.mu.Lock()
24 defer db.mu.Unlock()
25 return db.cli.Clauses(clauses...).Create(value)
26}
27
28func (db *DB) Save(value any, clauses []clause.Expression) *gorm.DB {
29 db.mu.Lock()
30 defer db.mu.Unlock()
31 return db.cli.Clauses(clauses...).Save(value)
32}
33
34func (db *DB) Exec(sql string, clauses []clause.Expression, values ...any) *gorm.DB {
35 db.mu.Lock()
36 defer db.mu.Unlock()
37 return db.cli.Clauses(clauses...).Exec(sql, values...)
38}
39
40func (db *DB) Raw(sql string, clauses []clause.Expression, values ...any) *gorm.DB {
41 return db.cli.Clauses(clauses...).Raw(sql, values...)
42}
43
44func (db *DB) AutoMigrate(models ...any) error {
45 return db.cli.AutoMigrate(models...)
46}
47
48func (db *DB) Delete(value any, clauses []clause.Expression) *gorm.DB {
49 db.mu.Lock()
50 defer db.mu.Unlock()
51 return db.cli.Clauses(clauses...).Delete(value)
52}
53
54func (db *DB) First(dest any, conds ...any) *gorm.DB {
55 return db.cli.First(dest, conds...)
56}
57
58// TODO: this isn't actually good. we can commit even if the db is locked here. this is probably okay for the time being, but need to figure
59// out a better solution. right now we only do this whenever we're importing a repo though so i'm mostly not worried, but it's still bad.
60// e.g. when we do apply writes we should also be using a transcation but we don't right now
61func (db *DB) BeginDangerously() *gorm.DB {
62 return db.cli.Begin()
63}
64
65func (db *DB) Lock() {
66 db.mu.Lock()
67}
68
69func (db *DB) Unlock() {
70 db.mu.Unlock()
71}