62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
import { DatabaseSync } from 'node:sqlite';
|
|
|
|
const SCHEMA = `
|
|
CREATE TABLE IF NOT EXISTS sites (
|
|
siteKey TEXT PRIMARY KEY,
|
|
projectId TEXT NOT NULL,
|
|
domains TEXT NOT NULL,
|
|
active INTEGER NOT NULL DEFAULT 1,
|
|
offSince TEXT
|
|
);
|
|
CREATE TABLE IF NOT EXISTS events_raw (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
site TEXT NOT NULL,
|
|
ts INTEGER NOT NULL,
|
|
type TEXT NOT NULL,
|
|
path TEXT,
|
|
vp TEXT,
|
|
ref TEXT,
|
|
country TEXT,
|
|
device TEXT,
|
|
visitor TEXT,
|
|
sec INTEGER,
|
|
scroll INTEGER,
|
|
kind TEXT,
|
|
host TEXT
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_events_site_ts ON events_raw(site, ts);
|
|
CREATE TABLE IF NOT EXISTS clicks (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
site TEXT NOT NULL,
|
|
ts INTEGER NOT NULL,
|
|
path TEXT NOT NULL,
|
|
vp TEXT NOT NULL,
|
|
x REAL NOT NULL,
|
|
y REAL NOT NULL,
|
|
sel TEXT
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_clicks_site_path_vp_ts ON clicks(site, path, vp, ts);
|
|
CREATE TABLE IF NOT EXISTS daily (
|
|
site TEXT NOT NULL,
|
|
day TEXT NOT NULL,
|
|
dim TEXT NOT NULL,
|
|
key TEXT NOT NULL,
|
|
count INTEGER NOT NULL DEFAULT 0,
|
|
PRIMARY KEY (site, day, dim, key)
|
|
);
|
|
-- Merker für die Nachtverdichtung: Tage, die schon in daily stehen (macht runNightly idempotent).
|
|
CREATE TABLE IF NOT EXISTS agg_state (
|
|
site TEXT NOT NULL,
|
|
day TEXT NOT NULL,
|
|
PRIMARY KEY (site, day)
|
|
);
|
|
`;
|
|
|
|
export function openDb(path) {
|
|
const db = new DatabaseSync(path);
|
|
if (path !== ':memory:') db.exec('PRAGMA journal_mode = WAL');
|
|
db.exec('PRAGMA secure_delete = ON');
|
|
db.exec(SCHEMA);
|
|
return db;
|
|
}
|