Files
granthi-review/src/lib/db.js
T

67 lines
2.0 KiB
JavaScript
Raw Normal View History

import { DatabaseSync } from 'node:sqlite';
import { mkdirSync } from 'node:fs';
import { dirname } from 'node:path';
const DDL = [
`CREATE TABLE IF NOT EXISTS reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
repo TEXT NOT NULL,
sha TEXT NOT NULL,
pr INTEGER,
event TEXT NOT NULL,
pusher TEXT,
authors TEXT,
trailers TEXT,
axes TEXT,
overall INTEGER,
grade TEXT,
verdict TEXT,
findings TEXT,
status_state TEXT,
error TEXT,
diff_bytes INTEGER,
truncated INTEGER DEFAULT 0,
model TEXT,
duration_ms INTEGER,
ts TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now'))
)`,
`CREATE INDEX IF NOT EXISTS idx_reviews_repo_ts ON reviews(repo, ts DESC)`,
`CREATE INDEX IF NOT EXISTS idx_reviews_sha ON reviews(sha)`
];
export function openDb(dbPath) {
mkdirSync(dirname(dbPath), { recursive: true });
const db = new DatabaseSync(dbPath);
for (const stmt of DDL) db.prepare(stmt).run();
return db;
}
export function insertReview(db, r) {
const stmt = db.prepare(`
INSERT INTO reviews (repo, sha, pr, event, pusher, authors, trailers, axes,
overall, grade, verdict, findings, status_state, error, diff_bytes,
truncated, model, duration_ms)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`);
const res = stmt.run(
r.repo, r.sha, r.pr ?? null, r.event, r.pusher ?? null,
JSON.stringify(r.authors ?? []), JSON.stringify(r.trailers ?? []),
r.axes ? JSON.stringify(r.axes) : null,
r.overall ?? null, r.grade ?? null, r.verdict ?? null,
r.findings ? JSON.stringify(r.findings) : null,
r.statusState ?? null, r.error ?? null, r.diffBytes ?? null,
r.truncated ? 1 : 0, r.model ?? null, r.durationMs ?? null
);
return res.lastInsertRowid;
}
export function listReviews(db, repo, limit = 50) {
return db.prepare(
'SELECT * FROM reviews WHERE repo = ? ORDER BY id DESC LIMIT ?'
).all(repo, limit);
}
export function allReviews(db, limit = 500) {
return db.prepare('SELECT * FROM reviews ORDER BY id DESC LIMIT ?').all(limit);
}