···23import (
4 "context"
5- "sync"
67 "gorm.io/gorm"
8 "gorm.io/gorm/clause"
···1011type DB struct {
12 cli *gorm.DB
13- mu sync.Mutex
14}
1516func NewDB(cli *gorm.DB) *DB {
17 return &DB{
18 cli: cli,
19- mu: sync.Mutex{},
20 }
21}
2223func (db *DB) Create(ctx context.Context, value any, clauses []clause.Expression) *gorm.DB {
24- db.mu.Lock()
25- defer db.mu.Unlock()
26 return db.cli.WithContext(ctx).Clauses(clauses...).Create(value)
27}
2829func (db *DB) Save(ctx context.Context, value any, clauses []clause.Expression) *gorm.DB {
30- db.mu.Lock()
31- defer db.mu.Unlock()
32 return db.cli.WithContext(ctx).Clauses(clauses...).Save(value)
33}
3435func (db *DB) Exec(ctx context.Context, sql string, clauses []clause.Expression, values ...any) *gorm.DB {
36- db.mu.Lock()
37- defer db.mu.Unlock()
38 return db.cli.WithContext(ctx).Clauses(clauses...).Exec(sql, values...)
39}
40···47}
4849func (db *DB) Delete(ctx context.Context, value any, clauses []clause.Expression) *gorm.DB {
50- db.mu.Lock()
51- defer db.mu.Unlock()
52 return db.cli.WithContext(ctx).Clauses(clauses...).Delete(value)
53}
54···56 return db.cli.WithContext(ctx).First(dest, conds...)
57}
5859-// 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
60-// 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.
61-// e.g. when we do apply writes we should also be using a transcation but we don't right now
62-func (db *DB) BeginDangerously(ctx context.Context) *gorm.DB {
63 return db.cli.WithContext(ctx).Begin()
64}
6566-func (db *DB) Lock() {
67- db.mu.Lock()
68-}
69-70-func (db *DB) Unlock() {
71- db.mu.Unlock()
72}
···2122func (s *Server) handleDescribeRepo(e echo.Context) error {
23 ctx := e.Request().Context()
02425 did := e.QueryParam("repo")
26 repo, err := s.getRepoActorByDid(ctx, did)
···29 return helpers.InputError(e, to.StringPtr("RepoNotFound"))
30 }
3132- s.logger.Error("error looking up repo", "error", err)
33 return helpers.ServerError(e, nil)
34 }
35···3738 diddoc, err := s.passport.FetchDoc(e.Request().Context(), repo.Repo.Did)
39 if err != nil {
40- s.logger.Error("error fetching diddoc", "error", err)
41 return helpers.ServerError(e, nil)
42 }
43···6768 var records []models.Record
69 if err := s.db.Raw(ctx, "SELECT DISTINCT(nsid) FROM records WHERE did = ?", nil, repo.Repo.Did).Scan(&records).Error; err != nil {
70- s.logger.Error("error getting collections", "error", err)
71 return helpers.ServerError(e, nil)
72 }
73
···2122func (s *Server) handleDescribeRepo(e echo.Context) error {
23 ctx := e.Request().Context()
24+ logger := s.logger.With("name", "handleDescribeRepo")
2526 did := e.QueryParam("repo")
27 repo, err := s.getRepoActorByDid(ctx, did)
···30 return helpers.InputError(e, to.StringPtr("RepoNotFound"))
31 }
3233+ logger.Error("error looking up repo", "error", err)
34 return helpers.ServerError(e, nil)
35 }
36···3839 diddoc, err := s.passport.FetchDoc(e.Request().Context(), repo.Repo.Did)
40 if err != nil {
41+ logger.Error("error fetching diddoc", "error", err)
42 return helpers.ServerError(e, nil)
43 }
44···6869 var records []models.Record
70 if err := s.db.Raw(ctx, "SELECT DISTINCT(nsid) FROM records WHERE did = ?", nil, repo.Repo.Did).Scan(&records).Error; err != nil {
71+ logger.Error("error getting collections", "error", err)
72 return helpers.ServerError(e, nil)
73 }
74
+2-1
server/handle_repo_list_missing_blobs.go
···2324func (s *Server) handleListMissingBlobs(e echo.Context) error {
25 ctx := e.Request().Context()
02627 urepo := e.Get("repo").(*models.RepoActor)
28···3839 var records []models.Record
40 if err := s.db.Raw(ctx, "SELECT * FROM records WHERE did = ?", nil, urepo.Repo.Did).Scan(&records).Error; err != nil {
41- s.logger.Error("failed to get records for listMissingBlobs", "error", err)
42 return helpers.ServerError(e, nil)
43 }
44
···2324func (s *Server) handleListMissingBlobs(e echo.Context) error {
25 ctx := e.Request().Context()
26+ logger := s.logger.With("name", "handleListMissingBlos")
2728 urepo := e.Get("repo").(*models.RepoActor)
29···3940 var records []models.Record
41 if err := s.db.Raw(ctx, "SELECT * FROM records WHERE did = ?", nil, urepo.Repo.Did).Scan(&records).Error; err != nil {
42+ logger.Error("failed to get records for listMissingBlobs", "error", err)
43 return helpers.ServerError(e, nil)
44 }
45
+3-2
server/handle_repo_list_records.go
···4748func (s *Server) handleListRecords(e echo.Context) error {
49 ctx := e.Request().Context()
05051 var req ComAtprotoRepoListRecordsRequest
52 if err := e.Bind(&req); err != nil {
53- s.logger.Error("could not bind list records request", "error", err)
54 return helpers.ServerError(e, nil)
55 }
56···9697 var records []models.Record
98 if err := s.db.Raw(ctx, "SELECT * FROM records WHERE did = ? AND nsid = ? "+cursorquery+" ORDER BY created_at "+sort+" limit ?", nil, params...).Scan(&records).Error; err != nil {
99- s.logger.Error("error getting records", "error", err)
100 return helpers.ServerError(e, nil)
101 }
102
···4748func (s *Server) handleListRecords(e echo.Context) error {
49 ctx := e.Request().Context()
50+ logger := s.logger.With("name", "handleListRecords")
5152 var req ComAtprotoRepoListRecordsRequest
53 if err := e.Bind(&req); err != nil {
54+ logger.Error("could not bind list records request", "error", err)
55 return helpers.ServerError(e, nil)
56 }
57···9798 var records []models.Record
99 if err := s.db.Raw(ctx, "SELECT * FROM records WHERE did = ? AND nsid = ? "+cursorquery+" ORDER BY created_at "+sort+" limit ?", nil, params...).Scan(&records).Error; err != nil {
100+ logger.Error("error getting records", "error", err)
101 return helpers.ServerError(e, nil)
102 }
103