diff options
Diffstat (limited to 'pkg/data')
| -rw-r--r-- | pkg/data/db.go | 21 | ||||
| -rw-r--r-- | pkg/data/put.go | 14 | ||||
| -rw-r--r-- | pkg/data/update.go | 32 | ||||
| -rw-r--r-- | pkg/data/update_test.go | 2 |
4 files changed, 53 insertions, 16 deletions
diff --git a/pkg/data/db.go b/pkg/data/db.go index a8d1fe3..3c9f6d0 100644 --- a/pkg/data/db.go +++ b/pkg/data/db.go @@ -5,6 +5,7 @@ import ( "database/sql" "fmt" "strings" + "time" "github.com/jpappel/atlas/pkg/index" "github.com/jpappel/atlas/pkg/query" @@ -80,12 +81,12 @@ func createSchema(db *sql.DB) error { if err != nil { return err } - defer tx.Commit() _, err = tx.Exec(` - CREATE TABLE IF NOT EXISTS Indexes( - root TEXT NOT NULL, - followSym DATE + CREATE TABLE IF NOT EXISTS Info( + key TEXT PRIMARY KEY NOT NULL, + value TEXT NOT NULL, + updated INT NOT NULL )`) if err != nil { tx.Rollback() @@ -270,10 +271,18 @@ func createSchema(db *sql.DB) error { } if _, err = tx.Exec("PRAGMA OPTIMIZE"); err != nil { + tx.Rollback() + return err + } + + if _, err = tx.Exec("INSERT OR IGNORE INTO Info (key, value, updated) VALUES (?,?,?)", + "created", "", time.Now().UTC().Unix(), + ); err != nil { + tx.Rollback() return err } - return nil + return tx.Commit() } func (q Query) Close() error { @@ -314,7 +323,7 @@ func (q Query) Put(idx index.Index) error { // Update database with values from index, removes entries for deleted files func (q Query) Update(idx index.Index) error { ctx := context.TODO() - u := NewUpdateMany(q.db, idx.Documents) + u := UpdateMany{Db: q.db, PathDocs: idx.Documents} return u.Update(ctx) } diff --git a/pkg/data/put.go b/pkg/data/put.go index 98cb6ba..6631eb0 100644 --- a/pkg/data/put.go +++ b/pkg/data/put.go @@ -4,6 +4,7 @@ import ( "context" "database/sql" "fmt" + "time" "github.com/jpappel/atlas/pkg/index" ) @@ -66,6 +67,13 @@ func (p *Put) Insert(ctx context.Context) error { return err } + if _, err := p.tx.Exec("INSERT OR REPLACE INTO Info(key,value,updated) VALUES (?,?,?)", + "lastUpdate", "singlePut", time.Now().UTC().Unix(), + ); err != nil { + p.tx.Rollback() + return err + } + return p.tx.Commit() } @@ -86,6 +94,12 @@ func (p PutMany) Insert() error { return fmt.Errorf("failed to insert authors: %v", err) } + if _, err := p.db.ExecContext(p.ctx, "INSERT OR REPLACE INTO Info(key,value,updated) VALUES (?,?,?)", + "lastUpdate", "multiPut", time.Now().UTC().Unix(), + ); err != nil { + return err + } + return nil } diff --git a/pkg/data/update.go b/pkg/data/update.go index a606256..a8a4b3d 100644 --- a/pkg/data/update.go +++ b/pkg/data/update.go @@ -4,6 +4,8 @@ import ( "context" "database/sql" "fmt" + "log/slog" + "time" "github.com/jpappel/atlas/pkg/index" ) @@ -17,19 +19,15 @@ type Update struct { type UpdateMany struct { Docs map[int64]*index.Document - pathDocs map[string]*index.Document + PathDocs map[string]*index.Document tx *sql.Tx - db *sql.DB + Db *sql.DB } func NewUpdate(ctx context.Context, db *sql.DB, doc index.Document) Update { return Update{Doc: doc, db: db} } -func NewUpdateMany(db *sql.DB, docs map[string]*index.Document) UpdateMany { - return UpdateMany{pathDocs: docs, db: db} -} - // Replace a document if its filetime is newer than the one in the database. func (u *Update) Update(ctx context.Context) error { var err error @@ -59,37 +57,53 @@ func (u *Update) Update(ctx context.Context) error { return err } + if _, err := u.tx.Exec("INSERT OR REPLACE INTO Info(key,value,updated) VALUES (?,?,?)", + "lastUpdate", "singleUpdate", time.Now().UTC().Unix(), + ); err != nil { + return err + } + return u.tx.Commit() } func (u *UpdateMany) Update(ctx context.Context) error { var err error - u.tx, err = u.db.BeginTx(ctx, nil) + u.tx, err = u.Db.BeginTx(ctx, nil) if err != nil { return err } hasUpdates, err := u.documents() if !hasUpdates || err != nil { + slog.Debug("Error updating documents") u.tx.Rollback() return err } if err := u.tags(); err != nil { + slog.Debug("Error updating tags") u.tx.Rollback() return err } if err := u.links(); err != nil { + slog.Debug("Error updating links") u.tx.Rollback() return err } if err := u.authors(); err != nil { + slog.Debug("Error updating authors") u.tx.Rollback() return err } + if _, err := u.tx.Exec("INSERT OR REPLACE INTO Info(key,value,updated) VALUES (?,?,?)", + "lastUpdate", "multiUpdate", time.Now().UTC().Unix(), + ); err != nil { + return err + } + return u.tx.Commit() } @@ -159,7 +173,7 @@ func (u *UpdateMany) documents() (bool, error) { } defer tempInsertStmt.Close() - for path, doc := range u.pathDocs { + for path, doc := range u.PathDocs { filetime := sql.NullInt64{ Int64: doc.FileTime.Unix(), Valid: !doc.FileTime.IsZero(), @@ -223,7 +237,7 @@ func (u *UpdateMany) documents() (bool, error) { if err := updates.Scan(&id, &path); err != nil { return false, err } - u.Docs[id] = u.pathDocs[path] + u.Docs[id] = u.PathDocs[path] hasUpdate = true } diff --git a/pkg/data/update_test.go b/pkg/data/update_test.go index d6ef578..912ac00 100644 --- a/pkg/data/update_test.go +++ b/pkg/data/update_test.go @@ -240,7 +240,7 @@ func TestUpdateMany_Update(t *testing.T) { db := tt.newDb(t) defer db.Close() - u := data.NewUpdateMany(db, tt.docs) + u := data.UpdateMany{Db: db, PathDocs: tt.docs} gotErr := u.Update(t.Context()) if !errors.Is(gotErr, tt.wantErr) { t.Fatalf("recieved unexpected error: got %v want %v", gotErr, tt.wantErr) |
