An atproto PDS written in Go
at list 1.7 kB view raw
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}