Files
Webklar-Kundenbereich/analytics/src/db.js
T

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;
}