import type { SqliteDb } from './types' import schemaV1 from './schema-v1.sql?raw' import schemaV2 from './schema-v2.sql?raw' const CURRENT_VERSION = 2 function tryAlter(db: SqliteDb, sql: string): void { try { db.exec(sql) } catch (err) { const msg = err instanceof Error ? err.message : String(err) if (!msg.includes('duplicate column')) throw err } } function applyV2(db: SqliteDb): void { tryAlter(db, "ALTER TABLE chapters ADD COLUMN publish_status TEXT NOT NULL DEFAULT 'draft'") tryAlter(db, 'ALTER TABLE chapters ADD COLUMN pov_character_id TEXT DEFAULT NULL') tryAlter(db, "ALTER TABLE chapters ADD COLUMN summary TEXT DEFAULT ''") tryAlter(db, 'ALTER TABLE chapters ADD COLUMN story_time TEXT DEFAULT NULL') db.exec(schemaV2) } export function migrate(db: SqliteDb): void { db.exec(`CREATE TABLE IF NOT EXISTS schema_version ( version INTEGER PRIMARY KEY, applied_at TEXT NOT NULL DEFAULT (datetime('now')), description TEXT )`) const row = db.prepare('SELECT MAX(version) AS v FROM schema_version').get() as { v: number | null } let current = row?.v ?? 0 if (current >= CURRENT_VERSION) return if (current < 1) { db.exec(schemaV1) db.prepare('INSERT INTO schema_version (version, description) VALUES (?, ?)').run(1, 'initial schema') current = 1 } if (current < 2) { applyV2(db) db.prepare('INSERT INTO schema_version (version, description) VALUES (?, ?)').run(2, 'P2 schema') } }