show-rss/src/asses/db.go

84 lines
1.7 KiB
Go

package asses
import (
"context"
"show-rss/src/db"
"time"
"github.com/google/uuid"
)
func Next(ctx context.Context) (time.Time, error) {
if err := initDB(ctx); err != nil {
return time.Time{}, err
}
type Did struct {
Did time.Time
}
result, err := db.QueryOne[Did](ctx, `
SELECT executed_at AS "Did"
FROM "asses.executions"
ORDER BY executed_at DESC
LIMIT 1
`)
return result.Did, err
}
func Record(ctx context.Context) error {
if err := initDB(ctx); err != nil {
return err
}
return db.Exec(ctx, `INSERT INTO "asses.executions" (id, executed_at) VALUES ($1, $2)`, uuid.New().String(), time.Now())
}
type last struct {
T time.Time `json:"checked_at"`
Cksum string `json:"cksum"`
Modified time.Time `json:"modified"`
}
func checkLast(ctx context.Context, p string) (last, error) {
if err := initDB(ctx); err != nil {
return last{}, err
}
return db.QueryOne[last](ctx, `
SELECT checked_at, cksum, modified
FROM "asses.checks"
WHERE p=$1
`, p)
}
func checked(ctx context.Context, p, cksum string, modified time.Time) error {
if err := initDB(ctx); err != nil {
return err
}
return db.Exec(ctx, `
INSERT INTO "asses.checks"
(p, checked_at, cksum, modified)
VALUES ($1, $2, $3, $4)
ON CONFLICT DO UPDATE
SET checked_at=$2, cksum=$3, modified=$4
WHERE p=$1
`, p, time.Now(), cksum, modified)
}
func initDB(ctx context.Context) error {
return db.InitializeSchema(ctx, "asses", []string{
`CREATE TABLE "asses.executions" (
id TEXT PRIMARY KEY NOT NULL,
executed_at TIMESTAMP NOT NULL
)`,
`CREATE TABLE "asses.checks" (
p TEXT PRIMARY KEY NOT NULL,
checked_at TIMESTAMP NOT NULL,
cksum TEXT NOT NULL
)`,
`ALTER TABLE "asses.checks" ADD COLUMN "modified" TIMESTAMP`,
})
}