refactor feeds schema to db/schema.go

main
Bel LaPointe 2025-04-28 20:32:03 -06:00
parent 57e77e5d4e
commit 83026a67d4
2 changed files with 42 additions and 33 deletions

40
src/db/schema.go Normal file
View File

@ -0,0 +1,40 @@
package db
import (
"context"
"fmt"
"strings"
"time"
)
func InitializeSchema(ctx context.Context, k string, mods []string) error {
if err := Exec(ctx, fmt.Sprintf(`CREATE TABLE IF NOT EXISTS "database_version.%s" (v NUMBER, t TIMESTAMP)`, k)); err != nil {
return fmt.Errorf(`failed to create "database_version.%s" table: %w`, k, err)
}
type DatabaseVersion struct {
V int `json:"v"`
T time.Time `json:"t"`
}
vs, err := Query[DatabaseVersion](ctx, fmt.Sprintf(`SELECT v, t FROM "database_version.%s" ORDER BY v DESC LIMIT 1`, k))
if err != nil {
return err
}
var v DatabaseVersion
if len(vs) > 0 {
v = vs[0]
}
mods = append([]string{""}, mods...)
for i := v.V + 1; i < len(mods); i++ {
q := mods[i]
q = strings.TrimSpace(q)
q = strings.TrimSuffix(q, ";")
q = fmt.Sprintf(`BEGIN; %s; INSERT INTO "database_version.%s" (v, t) VALUES (?, ?); COMMIT;`, q, k)
if err := Exec(ctx, q, i, time.Now()); err != nil {
return fmt.Errorf("[%s][%d] failed mod %s: %w", k, i, mods[i], err)
}
}
return nil
}

View File

@ -2,10 +2,8 @@ package feeds
import (
"context"
"fmt"
"io"
"show-rss/src/db"
"strings"
"time"
"github.com/google/uuid"
@ -203,24 +201,7 @@ func getEntry(ctx context.Context, id string) (Entry, error) {
}
func initDB(ctx context.Context) error {
if err := db.Exec(ctx, `CREATE TABLE IF NOT EXISTS database_version (v NUMBER, t TIMESTAMP)`); err != nil {
return fmt.Errorf("failed to create database_version table: %w", err)
}
type DatabaseVersion struct {
V int `json:"v"`
T time.Time `json:"t"`
}
vs, err := db.Query[DatabaseVersion](ctx, `SELECT v, t FROM database_version ORDER BY v DESC LIMIT 1`)
if err != nil {
return err
}
var v DatabaseVersion
if len(vs) > 0 {
v = vs[0]
}
mods := []string{
return db.InitializeSchema(ctx, "feeds", []string{
`CREATE TABLE "feed.entries" (
id TEXT PRIMARY KEY NOT NULL,
created_at TIMESTAMP NOT NULL,
@ -247,17 +228,5 @@ func initDB(ctx context.Context) error {
executed_at TIMESTAMP,
FOREIGN KEY (entries_id, versions_created_at) REFERENCES "feed.versions" (entries_id, created_at)
)`,
}
mods = append([]string{""}, mods...)
for i := v.V + 1; i < len(mods); i++ {
q := mods[i]
q = strings.TrimSpace(q)
q = strings.TrimSuffix(q, ";")
q = fmt.Sprintf("BEGIN; %s; INSERT INTO database_version (v, t) VALUES (?, ?); COMMIT;", q)
if err := db.Exec(ctx, q, i, time.Now()); err != nil {
return fmt.Errorf("[%d] failed mod %s: %w", i, mods[i], err)
}
}
return nil
})
}