refactor feeds schema to db/schema.go
parent
57e77e5d4e
commit
83026a67d4
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -2,10 +2,8 @@ package feeds
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"show-rss/src/db"
|
"show-rss/src/db"
|
||||||
"strings"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
|
@ -203,24 +201,7 @@ func getEntry(ctx context.Context, id string) (Entry, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func initDB(ctx context.Context) 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 db.InitializeSchema(ctx, "feeds", []string{
|
||||||
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{
|
|
||||||
`CREATE TABLE "feed.entries" (
|
`CREATE TABLE "feed.entries" (
|
||||||
id TEXT PRIMARY KEY NOT NULL,
|
id TEXT PRIMARY KEY NOT NULL,
|
||||||
created_at TIMESTAMP NOT NULL,
|
created_at TIMESTAMP NOT NULL,
|
||||||
|
|
@ -247,17 +228,5 @@ func initDB(ctx context.Context) error {
|
||||||
executed_at TIMESTAMP,
|
executed_at TIMESTAMP,
|
||||||
FOREIGN KEY (entries_id, versions_created_at) REFERENCES "feed.versions" (entries_id, created_at)
|
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
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue