package cmd import ( "context" "database/sql" "time" _ "modernc.org/sqlite" ) type DB struct { *sql.DB } type Cache DB var cacheAddr = "/tmp/turbomaps-er.db" func NewCache(ctx context.Context) Cache { ctx, can := context.WithTimeout(ctx, 5*time.Second) defer can() db, err := sql.Open("sqlite", cacheAddr) if err != nil { panic(err) } if err := db.PingContext(ctx); err != nil { panic(err) } return Cache(DB{DB: db}) } func (db Cache) Get(ctx context.Context, k string) ([]byte, error) { if err := db.init(ctx); err != nil { return nil, err } row := db.QueryRowContext(ctx, ` SELECT v FROM cache WHERE k=$1 `, k) var v []byte if err := row.Scan(&v); err != nil { return nil, err } return v, row.Err() } func (db Cache) Set(ctx context.Context, k string, v []byte) error { if err := db.init(ctx); err != nil { return err } _, err := db.ExecContext(ctx, ` INSERT INTO cache (k, v) VALUES ($1, $2) ON CONFLICT DO UPDATE SET v=$2 WHERE k=$1 `, k, v) return err } func (db Cache) init(ctx context.Context) error { _, err := db.ExecContext(ctx, ` CREATE TABLE IF NOT EXISTS cache(k TEXT PRIMARY KEY, v TEXT) `) return err }