fix: port sqlite fts corruption containment

- remove unsafe standalone startup FTS rebuild behavior
- add integrity classification and degraded FTS handling in the OS database runtime
- add clean-db FTS repair script for rebuildable corruption recovery

Generated with Claude Code
This commit is contained in:
“BeeRad”
2026-04-14 22:05:54 +10:00
parent 581bd3341d
commit 91ce23309b
9 changed files with 789 additions and 80 deletions
+5 -12
View File
@@ -498,14 +498,11 @@ export class NodeService {
if (!search) return 0;
const ftsQuery = sanitizeFtsQuery(search);
const ftsExists = sqlite.isNodesFtsUsable() && sqlite.prepare(
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='nodes_fts'"
).get();
const { clauses, params } = this.buildNodeFilterClauses(filters);
if (ftsExists && ftsQuery) {
const whereClauses = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
if (sqlite.canUseFtsTable('nodes') && ftsQuery) {
try {
const whereClauses = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
const result = sqlite.query<{ total: number }>(`
WITH matched_nodes AS (
SELECT rowid
@@ -520,7 +517,7 @@ export class NodeService {
return Number(result.rows[0]?.total ?? 0);
} catch (error) {
sqlite.disableNodesFts('nodes_fts query failed during count search', error);
sqlite.disableFtsTable('nodes', 'nodes_fts query failed during count search', error);
}
}
@@ -549,11 +546,7 @@ export class NodeService {
): NodeSearchRow[] {
const ftsQuery = sanitizeFtsQuery(search);
if (!ftsQuery) return [];
const ftsExists = sqlite.isNodesFtsUsable() && sqlite.prepare(
"SELECT 1 FROM sqlite_master WHERE type='table' AND name='nodes_fts'"
).get();
if (!ftsExists) return [];
if (!sqlite.canUseFtsTable('nodes')) return [];
const { clauses, params } = this.buildNodeFilterClauses(filters);
const whereClauses = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
@@ -584,7 +577,7 @@ export class NodeService {
return result.rows;
} catch (error) {
sqlite.disableNodesFts('nodes_fts query failed during node search', error);
sqlite.disableFtsTable('nodes', 'nodes_fts query failed during node search', error);
return [];
}
}