aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2025-07-19 19:01:39 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2025-07-19 19:01:39 -0400
commitfaf35ef54885bc48b897508ce3cb40b868ff505b (patch)
tree5ff54c8a73567df3c139e0471f7882971fb0f91e
parent08434926f5eda975808f66b45b3a828458d5ba7e (diff)
Add key-val db table for metadata
-rw-r--r--pkg/data/db.go21
-rw-r--r--pkg/data/put.go14
-rw-r--r--pkg/data/update.go32
-rw-r--r--pkg/data/update_test.go2
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)