hzl-cli 1.18.3 → 1.18.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +43 -0
- package/dist/db.js.map +1 -1
- package/dist/db.test.d.ts +2 -0
- package/dist/db.test.d.ts.map +1 -0
- package/dist/db.test.js +293 -0
- package/dist/db.test.js.map +1 -0
- package/package.json +1 -1
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAQlE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAQlE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AA6H5E,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC3B,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B,iBAAiB,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,QAAQ,CA+CnE;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEhD;AAeD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAK7D"}
|
package/dist/db.js
CHANGED
|
@@ -28,6 +28,48 @@ function checkAndMigrateSchema(cacheDb, eventsDb, projectionEngine) {
|
|
|
28
28
|
}
|
|
29
29
|
// Count events for progress indicator
|
|
30
30
|
const eventCount = eventsDb.prepare('SELECT COUNT(*) as count FROM events').get().count;
|
|
31
|
+
// No events: rebuild cache schema without replay
|
|
32
|
+
if (eventCount === 0) {
|
|
33
|
+
cacheDb.exec('BEGIN IMMEDIATE');
|
|
34
|
+
try {
|
|
35
|
+
// Drop all projection tables (preserves hzl_local_meta only)
|
|
36
|
+
cacheDb.exec('DROP TABLE IF EXISTS tasks_current');
|
|
37
|
+
cacheDb.exec('DROP TABLE IF EXISTS task_dependencies');
|
|
38
|
+
cacheDb.exec('DROP TABLE IF EXISTS task_tags');
|
|
39
|
+
cacheDb.exec('DROP TABLE IF EXISTS task_comments');
|
|
40
|
+
cacheDb.exec('DROP TABLE IF EXISTS task_checkpoints');
|
|
41
|
+
cacheDb.exec('DROP TABLE IF EXISTS task_search');
|
|
42
|
+
cacheDb.exec('DROP TABLE IF EXISTS projects');
|
|
43
|
+
// Drop projection metadata tables - these could contain stale cursor/state
|
|
44
|
+
// from a previous schema version that no longer matches rebuilt tables.
|
|
45
|
+
// Use DROP instead of DELETE in case old schema doesn't have these tables.
|
|
46
|
+
cacheDb.exec('DROP TABLE IF EXISTS projection_cursor');
|
|
47
|
+
cacheDb.exec('DROP TABLE IF EXISTS projection_state');
|
|
48
|
+
// Also drop indexes that reference these tables
|
|
49
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_project_status');
|
|
50
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_status');
|
|
51
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_priority');
|
|
52
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_claim_next');
|
|
53
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_stuck');
|
|
54
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_parent');
|
|
55
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_terminal_at');
|
|
56
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_deps_depends_on');
|
|
57
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_task_tags_tag');
|
|
58
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_task_comments_task');
|
|
59
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_task_checkpoints_task');
|
|
60
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_projects_protected');
|
|
61
|
+
// Recreate with new schema (no replay needed)
|
|
62
|
+
cacheDb.exec(CACHE_SCHEMA_V1);
|
|
63
|
+
// Update schema version
|
|
64
|
+
cacheDb.prepare("INSERT OR REPLACE INTO hzl_local_meta (key, value) VALUES ('schema_version', ?)").run(CURRENT_SCHEMA_VERSION.toString());
|
|
65
|
+
cacheDb.exec('COMMIT');
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
cacheDb.exec('ROLLBACK');
|
|
70
|
+
throw e;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
31
73
|
console.error(`Upgrading database schema (v${currentVersion} → v${CURRENT_SCHEMA_VERSION})...`);
|
|
32
74
|
console.error(` Replaying ${eventCount.toLocaleString()} events...`);
|
|
33
75
|
// Wrap entire rebuild in transaction for atomicity
|
|
@@ -48,6 +90,7 @@ function checkAndMigrateSchema(cacheDb, eventsDb, projectionEngine) {
|
|
|
48
90
|
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_claim_next');
|
|
49
91
|
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_stuck');
|
|
50
92
|
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_parent');
|
|
93
|
+
cacheDb.exec('DROP INDEX IF EXISTS idx_tasks_current_terminal_at');
|
|
51
94
|
cacheDb.exec('DROP INDEX IF EXISTS idx_deps_depends_on');
|
|
52
95
|
cacheDb.exec('DROP INDEX IF EXISTS idx_task_tags_tag');
|
|
53
96
|
cacheDb.exec('DROP INDEX IF EXISTS idx_task_comments_task');
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAkB,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,8CAA8C,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC;;;GAGG;AACH,SAAS,qBAAqB,CAC5B,OAA0B,EAC1B,QAA2B,EAC3B,gBAAkC;IAElC,0CAA0C;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CACzB,+DAA+D,CAChE,CAAC,GAAG,EAAmC,CAAC;IACzC,MAAM,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,IAAI,cAAc,IAAI,sBAAsB,EAAE,CAAC;QAC7C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sCAAsC;IACtC,MAAM,UAAU,GAAI,QAAQ,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.test.d.ts","sourceRoot":"","sources":["../src/db.test.ts"],"names":[],"mappings":""}
|
package/dist/db.test.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import os from 'os';
|
|
5
|
+
import Database from 'libsql';
|
|
6
|
+
import { EVENTS_SCHEMA_V2, CACHE_SCHEMA_V1, PRAGMAS } from 'hzl-core/db/schema.js';
|
|
7
|
+
import { initializeDbFromPath, closeDb } from './db.js';
|
|
8
|
+
describe('db.ts schema migration', () => {
|
|
9
|
+
let testDir;
|
|
10
|
+
let dbPath;
|
|
11
|
+
let cachePath;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'hzl-db-test-'));
|
|
14
|
+
dbPath = path.join(testDir, 'events.db');
|
|
15
|
+
cachePath = path.join(testDir, 'cache.db');
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
fs.rmSync(testDir, { recursive: true, force: true });
|
|
19
|
+
});
|
|
20
|
+
function getSchemaVersion(cacheDbPath) {
|
|
21
|
+
const db = new Database(cacheDbPath);
|
|
22
|
+
try {
|
|
23
|
+
const row = db.prepare("SELECT value FROM hzl_local_meta WHERE key = 'schema_version'").get();
|
|
24
|
+
return row ? parseInt(row.value, 10) : null;
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
db.close();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function getEventCount(eventsDbPath) {
|
|
31
|
+
const db = new Database(eventsDbPath);
|
|
32
|
+
try {
|
|
33
|
+
const row = db.prepare('SELECT COUNT(*) as count FROM events').get();
|
|
34
|
+
return row.count;
|
|
35
|
+
}
|
|
36
|
+
finally {
|
|
37
|
+
db.close();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function getColumns(cacheDbPath, table) {
|
|
41
|
+
const db = new Database(cacheDbPath);
|
|
42
|
+
try {
|
|
43
|
+
const rows = db.prepare(`SELECT name FROM pragma_table_info('${table}')`).all();
|
|
44
|
+
return rows.map(row => row.name);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
db.close();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
describe('fresh database (no events)', () => {
|
|
51
|
+
it('sets schema version without replaying events', () => {
|
|
52
|
+
// Capture stderr to verify no migration message
|
|
53
|
+
const stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
54
|
+
let services;
|
|
55
|
+
try {
|
|
56
|
+
services = initializeDbFromPath(dbPath);
|
|
57
|
+
// Schema version should be set to current (2)
|
|
58
|
+
expect(getSchemaVersion(cachePath)).toBe(2);
|
|
59
|
+
// Note: initializeDb creates the inbox project, so 1 event exists after init
|
|
60
|
+
// The point is that BEFORE any events existed (during checkAndMigrateSchema),
|
|
61
|
+
// no replay was triggered - this is verified by the absence of migration messages
|
|
62
|
+
expect(getEventCount(dbPath)).toBe(1); // inbox project creation event
|
|
63
|
+
// No migration message should be printed
|
|
64
|
+
const migrationCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Upgrading database schema'));
|
|
65
|
+
expect(migrationCalls).toHaveLength(0);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
if (services)
|
|
69
|
+
closeDb(services);
|
|
70
|
+
stderrSpy.mockRestore();
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
it('does not print "Replaying events" message for fresh database', () => {
|
|
74
|
+
const stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
75
|
+
let services;
|
|
76
|
+
try {
|
|
77
|
+
services = initializeDbFromPath(dbPath);
|
|
78
|
+
const replayCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Replaying'));
|
|
79
|
+
expect(replayCalls).toHaveLength(0);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
if (services)
|
|
83
|
+
closeDb(services);
|
|
84
|
+
stderrSpy.mockRestore();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('database with old cache schema and no events', () => {
|
|
89
|
+
it('rebuilds cache schema when no events exist (zero-event migration path)', () => {
|
|
90
|
+
// Create old cache schema without terminal_at column and no schema_version.
|
|
91
|
+
// Importantly, this old schema also lacks projection_cursor and projection_state
|
|
92
|
+
// tables - the migration must handle this gracefully using DROP TABLE IF EXISTS.
|
|
93
|
+
const eventsDb = new Database(dbPath);
|
|
94
|
+
const cacheDb = new Database(cachePath);
|
|
95
|
+
eventsDb.exec(PRAGMAS);
|
|
96
|
+
eventsDb.exec(EVENTS_SCHEMA_V2);
|
|
97
|
+
cacheDb.exec(PRAGMAS);
|
|
98
|
+
cacheDb.exec(`
|
|
99
|
+
CREATE TABLE hzl_local_meta (
|
|
100
|
+
key TEXT PRIMARY KEY,
|
|
101
|
+
value TEXT NOT NULL
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
CREATE TABLE tasks_current (
|
|
105
|
+
task_id TEXT PRIMARY KEY,
|
|
106
|
+
title TEXT NOT NULL,
|
|
107
|
+
project TEXT NOT NULL,
|
|
108
|
+
status TEXT NOT NULL,
|
|
109
|
+
parent_id TEXT,
|
|
110
|
+
description TEXT,
|
|
111
|
+
links TEXT NOT NULL DEFAULT '[]',
|
|
112
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
113
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
114
|
+
due_at TEXT,
|
|
115
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
116
|
+
claimed_at TEXT,
|
|
117
|
+
assignee TEXT,
|
|
118
|
+
progress INTEGER,
|
|
119
|
+
lease_until TEXT,
|
|
120
|
+
created_at TEXT NOT NULL,
|
|
121
|
+
updated_at TEXT NOT NULL,
|
|
122
|
+
last_event_id INTEGER NOT NULL
|
|
123
|
+
);
|
|
124
|
+
`);
|
|
125
|
+
eventsDb.close();
|
|
126
|
+
cacheDb.close();
|
|
127
|
+
// Capture stderr to verify zero-event path (no replay message)
|
|
128
|
+
const stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
129
|
+
let services;
|
|
130
|
+
try {
|
|
131
|
+
services = initializeDbFromPath(dbPath);
|
|
132
|
+
// Schema version should now be current
|
|
133
|
+
expect(getSchemaVersion(cachePath)).toBe(2);
|
|
134
|
+
// Cache schema should include terminal_at after rebuild
|
|
135
|
+
const columns = getColumns(cachePath, 'tasks_current');
|
|
136
|
+
expect(columns).toContain('terminal_at');
|
|
137
|
+
// Zero-event path should NOT print migration/replay messages
|
|
138
|
+
const migrationCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Upgrading database schema'));
|
|
139
|
+
const replayCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Replaying'));
|
|
140
|
+
expect(migrationCalls).toHaveLength(0);
|
|
141
|
+
expect(replayCalls).toHaveLength(0);
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
if (services)
|
|
145
|
+
closeDb(services);
|
|
146
|
+
stderrSpy.mockRestore();
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
it('clears stale projection metadata during zero-events schema rebuild', () => {
|
|
150
|
+
// Create cache with stale projection state from a previous schema version
|
|
151
|
+
const eventsDb = new Database(dbPath);
|
|
152
|
+
const cacheDb = new Database(cachePath);
|
|
153
|
+
eventsDb.exec(PRAGMAS);
|
|
154
|
+
eventsDb.exec(EVENTS_SCHEMA_V2);
|
|
155
|
+
cacheDb.exec(PRAGMAS);
|
|
156
|
+
// Old schema without terminal_at - will trigger migration
|
|
157
|
+
cacheDb.exec(`
|
|
158
|
+
CREATE TABLE hzl_local_meta (
|
|
159
|
+
key TEXT PRIMARY KEY,
|
|
160
|
+
value TEXT NOT NULL
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
CREATE TABLE projection_cursor (
|
|
164
|
+
key TEXT PRIMARY KEY,
|
|
165
|
+
value TEXT NOT NULL
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
CREATE TABLE projection_state (
|
|
169
|
+
name TEXT PRIMARY KEY,
|
|
170
|
+
last_event_id INTEGER NOT NULL DEFAULT 0,
|
|
171
|
+
updated_at TEXT NOT NULL
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
CREATE TABLE tasks_current (
|
|
175
|
+
task_id TEXT PRIMARY KEY,
|
|
176
|
+
title TEXT NOT NULL,
|
|
177
|
+
project TEXT NOT NULL,
|
|
178
|
+
status TEXT NOT NULL,
|
|
179
|
+
parent_id TEXT,
|
|
180
|
+
description TEXT,
|
|
181
|
+
links TEXT NOT NULL DEFAULT '[]',
|
|
182
|
+
tags TEXT NOT NULL DEFAULT '[]',
|
|
183
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
184
|
+
due_at TEXT,
|
|
185
|
+
metadata TEXT NOT NULL DEFAULT '{}',
|
|
186
|
+
claimed_at TEXT,
|
|
187
|
+
assignee TEXT,
|
|
188
|
+
progress INTEGER,
|
|
189
|
+
lease_until TEXT,
|
|
190
|
+
created_at TEXT NOT NULL,
|
|
191
|
+
updated_at TEXT NOT NULL,
|
|
192
|
+
last_event_id INTEGER NOT NULL
|
|
193
|
+
);
|
|
194
|
+
`);
|
|
195
|
+
// Insert stale projection metadata that would be invalid after rebuild
|
|
196
|
+
cacheDb.prepare("INSERT INTO projection_cursor (key, value) VALUES ('last_event_id', '999')").run();
|
|
197
|
+
cacheDb.prepare("INSERT INTO projection_state (name, last_event_id, updated_at) VALUES ('tasks_current', 999, '2024-01-01T00:00:00Z')").run();
|
|
198
|
+
cacheDb.prepare("INSERT INTO projection_state (name, last_event_id, updated_at) VALUES ('dependencies', 500, '2024-01-01T00:00:00Z')").run();
|
|
199
|
+
eventsDb.close();
|
|
200
|
+
cacheDb.close();
|
|
201
|
+
let services;
|
|
202
|
+
try {
|
|
203
|
+
services = initializeDbFromPath(dbPath);
|
|
204
|
+
// Verify stale projection metadata was cleared
|
|
205
|
+
const checkDb = new Database(cachePath);
|
|
206
|
+
try {
|
|
207
|
+
const cursorRows = checkDb.prepare('SELECT * FROM projection_cursor').all();
|
|
208
|
+
const stateRows = checkDb.prepare('SELECT * FROM projection_state').all();
|
|
209
|
+
expect(cursorRows.find(r => r.key === 'last_event_id' && r.value === '999')).toBeUndefined();
|
|
210
|
+
expect(stateRows.find(r => r.name === 'tasks_current' && r.last_event_id === 999)).toBeUndefined();
|
|
211
|
+
expect(stateRows.find(r => r.name === 'dependencies' && r.last_event_id === 500)).toBeUndefined();
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
checkDb.close();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
if (services)
|
|
219
|
+
closeDb(services);
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe('database with existing events but no schema version', () => {
|
|
224
|
+
it('runs migration when events exist and schema version is missing', () => {
|
|
225
|
+
// Create database with events but no schema_version (simulates pre-migration database)
|
|
226
|
+
const eventsDb = new Database(dbPath);
|
|
227
|
+
const cacheDb = new Database(cachePath);
|
|
228
|
+
eventsDb.exec(PRAGMAS);
|
|
229
|
+
eventsDb.exec(EVENTS_SCHEMA_V2);
|
|
230
|
+
cacheDb.exec(PRAGMAS);
|
|
231
|
+
cacheDb.exec(CACHE_SCHEMA_V1);
|
|
232
|
+
// Add a test event
|
|
233
|
+
eventsDb.prepare(`
|
|
234
|
+
INSERT INTO events (event_id, task_id, type, data, timestamp)
|
|
235
|
+
VALUES ('evt-1', 'task-1', 'TaskCreated', '{"title":"Test","project":"inbox","status":"ready"}', datetime('now'))
|
|
236
|
+
`).run();
|
|
237
|
+
eventsDb.close();
|
|
238
|
+
cacheDb.close();
|
|
239
|
+
// Capture stderr to verify migration message
|
|
240
|
+
const stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
241
|
+
let services;
|
|
242
|
+
try {
|
|
243
|
+
services = initializeDbFromPath(dbPath);
|
|
244
|
+
// Schema version should now be set
|
|
245
|
+
expect(getSchemaVersion(cachePath)).toBe(2);
|
|
246
|
+
// Migration message should have been printed
|
|
247
|
+
const migrationCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Upgrading database schema'));
|
|
248
|
+
expect(migrationCalls.length).toBeGreaterThan(0);
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
if (services)
|
|
252
|
+
closeDb(services);
|
|
253
|
+
stderrSpy.mockRestore();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe('database with current schema version', () => {
|
|
258
|
+
it('skips migration when schema version is already current', () => {
|
|
259
|
+
// Create database with current schema version already set
|
|
260
|
+
const eventsDb = new Database(dbPath);
|
|
261
|
+
const cacheDb = new Database(cachePath);
|
|
262
|
+
eventsDb.exec(PRAGMAS);
|
|
263
|
+
eventsDb.exec(EVENTS_SCHEMA_V2);
|
|
264
|
+
cacheDb.exec(PRAGMAS);
|
|
265
|
+
cacheDb.exec(CACHE_SCHEMA_V1);
|
|
266
|
+
// Set schema version to current (2)
|
|
267
|
+
cacheDb.prepare("INSERT INTO hzl_local_meta (key, value) VALUES ('schema_version', '2')").run();
|
|
268
|
+
// Add a test event
|
|
269
|
+
eventsDb.prepare(`
|
|
270
|
+
INSERT INTO events (event_id, task_id, type, data, timestamp)
|
|
271
|
+
VALUES ('evt-1', 'task-1', 'TaskCreated', '{"title":"Test","project":"inbox","status":"ready"}', datetime('now'))
|
|
272
|
+
`).run();
|
|
273
|
+
eventsDb.close();
|
|
274
|
+
cacheDb.close();
|
|
275
|
+
const stderrSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
276
|
+
let services;
|
|
277
|
+
try {
|
|
278
|
+
services = initializeDbFromPath(dbPath);
|
|
279
|
+
// Schema version should still be 2
|
|
280
|
+
expect(getSchemaVersion(cachePath)).toBe(2);
|
|
281
|
+
// No migration message should be printed
|
|
282
|
+
const migrationCalls = stderrSpy.mock.calls.filter(call => String(call[0]).includes('Upgrading database schema'));
|
|
283
|
+
expect(migrationCalls).toHaveLength(0);
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
if (services)
|
|
287
|
+
closeDb(services);
|
|
288
|
+
stderrSpy.mockRestore();
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=db.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.test.js","sourceRoot":"","sources":["../src/db.test.ts"],"names":[],"mappings":"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"}
|