import type { Database } from "bun:sqlite"; import { serializeJson } from "./sqlite/json"; import { withSqliteBusyRetry } from "./sqlite/retry"; export interface StoredTickerRecord { symbol: string; metadata: string; } export class TickerStore { constructor(private readonly db: Database) {} getAll(): StoredTickerRecord[] { return withSqliteBusyRetry("load tickers", () => ( this.db .query( "SELECT symbol, metadata FROM tickers ORDER BY symbol", ) .all() )); } get(symbol: string): string | null { const row = withSqliteBusyRetry("load ticker", () => ( this.db .query<{ metadata: string }, [string]>( "SELECT metadata FROM tickers WHERE symbol = ?", ) .get(symbol) )); return row?.metadata ?? null; } save(symbol: string, metadata: unknown): void { withSqliteBusyRetry("save ticker", () => { this.db .query( `INSERT OR REPLACE INTO tickers (symbol, metadata, updated_at) VALUES (?, ?, ?)`, ) .run(symbol, serializeJson(metadata), Date.now()); }); } delete(symbol: string): void { withSqliteBusyRetry("delete ticker", () => { this.db.query("DELETE FROM tickers WHERE symbol = ?").run(symbol); }); } }