import type Database from 'better-sqlite3'; export function ensureAutoscalingSchema(handle: Database.Database): void { handle.exec(` CREATE TABLE IF NOT EXISTS autoscaling_policies ( id TEXT PRIMARY KEY, game TEXT NOT NULL, map_slug TEXT NOT NULL, revision INTEGER NOT NULL DEFAULT 1, settings TEXT NOT NULL, mode TEXT NOT NULL DEFAULT 'off', next_action_at INTEGER NOT NULL DEFAULT 0, paused_reason TEXT, owns_map INTEGER NOT NULL DEFAULT 0, updated_at TEXT NOT NULL, UNIQUE(game,map_slug) ); CREATE TABLE IF NOT EXISTS autoscaling_members ( policy_id TEXT NOT NULL REFERENCES autoscaling_policies(id), server TEXT NOT NULL, identity TEXT NOT NULL, observation TEXT NOT NULL, adopted INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(policy_id,server) ); CREATE TABLE IF NOT EXISTS autoscaling_decisions ( id TEXT PRIMARY KEY, policy_id TEXT NOT NULL REFERENCES autoscaling_policies(id), revision INTEGER NOT NULL, evaluated_at INTEGER NOT NULL, last_seen_at INTEGER NOT NULL, fingerprint TEXT NOT NULL, decision TEXT NOT NULL, evidence TEXT NOT NULL, operation_id TEXT UNIQUE REFERENCES server_deployments(id), resolved INTEGER NOT NULL DEFAULT 1 ); CREATE UNIQUE INDEX IF NOT EXISTS autoscaling_one_intent ON autoscaling_decisions(policy_id) WHERE resolved=0; CREATE INDEX IF NOT EXISTS autoscaling_history ON autoscaling_decisions(policy_id,evaluated_at DESC); CREATE INDEX IF NOT EXISTS autoscaling_decision_retention ON autoscaling_decisions(last_seen_at) WHERE resolved=1; CREATE TABLE IF NOT EXISTS autoscaling_samples ( policy_id TEXT NOT NULL REFERENCES autoscaling_policies(id), sampled_at INTEGER NOT NULL, mode TEXT NOT NULL, occupied INTEGER NOT NULL, empty INTEGER NOT NULL, unknown INTEGER NOT NULL, deficit INTEGER NOT NULL, PRIMARY KEY(policy_id,sampled_at) ); CREATE TABLE IF NOT EXISTS autoscaling_authorizations ( operation_id TEXT PRIMARY KEY, policy_id TEXT NOT NULL, revision INTEGER NOT NULL, expires_at INTEGER NOT NULL, claimed_at INTEGER, revoked_at INTEGER ); CREATE INDEX IF NOT EXISTS autoscaling_sample_retention ON autoscaling_samples(sampled_at); `); }