Use ordered SQLite migrations (Refs #75)
CI / checks (push) Successful in 5m6s

This commit is contained in:
2026-10-10 00:01:18 -04:00
parent a0663e43b8
commit 8d1bb69591
56 changed files with 1085 additions and 736 deletions
-14
View File
@@ -3,9 +3,6 @@ import { createHash } from 'node:crypto';
import { db } from './db/index.js';
import { fleetSettings } from './settings.js';
import { runtimeLaunchSql } from './fleet/runtime-config.js';
import { ensureHostSchema } from './hosts/schema.js';
import { ensureGameFileSchema } from './game-files/schema.js';
import { ensureAuthSchema } from './auth/schema.js';
import { logResultMetadata } from './hosts/log-results.js';
import type { FleetSettings } from '../fleet-settings.js';
@@ -266,10 +263,6 @@ function versionReferences(): string {
}
return clauses.join(' AND ') || '1';
}
function initialize() {
ensureHostSchema(db());
ensureAuthSchema(db());
}
function withoutFileBodies(value: unknown): unknown {
if (Array.isArray(value)) return value.map(withoutFileBodies);
@@ -364,7 +357,6 @@ function selection(policy: Policy, settings = fleetSettings()) {
}
// better-sqlite3 accepts unused named bindings, keeping selection reusable.
export function retentionPreview(settings = fleetSettings()) {
initialize();
return policies().map((policy) => {
const query = selection(policy, settings);
const summary = db()
@@ -393,8 +385,6 @@ export function setRetentionControl(input: {
protected?: boolean;
resolve?: boolean;
}) {
initialize();
ensureGameFileSchema(db());
const policy =
policies().find((policy) => policy.category === input.category) ??
(['game-file', 'upload'].includes(input.category)
@@ -449,7 +439,6 @@ export function setRetentionControl(input: {
/** Each policy removes at most 500 eligible records per pass; dependencies are checked again under the transaction. */
export function pruneHistory(only?: string): number {
initialize();
if (only === 'observation') return pruneRoutineObservations();
let removed = only ? 0 : pruneRoutineObservations();
for (const policy of policies().filter(
@@ -594,7 +583,6 @@ function samplePolicies(s = fleetSettings()) {
];
}
export function sampleRetentionPreview(settings = fleetSettings()) {
initialize();
const result = samplePolicies(settings)
.filter((p) => p.category !== 'telemetry')
.map((p) => ({
@@ -634,7 +622,6 @@ export function sampleRetentionPreview(settings = fleetSettings()) {
return result;
}
export function pruneSampleHistory() {
initialize();
let removed = 0;
for (const p of samplePolicies().filter((p) => p.enabled))
removed += db()
@@ -663,7 +650,6 @@ export function pruneSampleHistory() {
export async function drainRetention(): Promise<number> {
let total = 0,
logCursor = 0;
initialize();
while (true) {
const removed = pruneHistory() + pruneSampleHistory();
total += removed;