From 3bfec245c728e8d5593bdfb36096036174dab26c Mon Sep 17 00:00:00 2001 From: Emanuel Almeida Date: Thu, 23 Apr 2026 00:56:07 +0100 Subject: [PATCH] perf(observabilidade): synchronous=NORMAL e upsertMany transaccional --- api/services/sessions/db.ts | 15 +++++++++++++++ api/tests/sessions-db.test.ts | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/api/services/sessions/db.ts b/api/services/sessions/db.ts index 6e55745..ae41e57 100644 --- a/api/services/sessions/db.ts +++ b/api/services/sessions/db.ts @@ -15,6 +15,7 @@ export interface ListFilters { export interface SessionsDb { upsertSession(meta: SessionMeta): void + upsertMany(metas: SessionMeta[]): void listSessions(filters: ListFilters): SessionMeta[] countSessions(filters: ListFilters): number getSession(id: string): SessionMeta | null @@ -104,6 +105,7 @@ export function openSessionsDb(dbPath: string): SessionsDb { mkdirSync(dirname(dbPath), { recursive: true }) const db = new Database(dbPath) db.pragma('journal_mode = WAL') + db.pragma('synchronous = NORMAL') db.exec(SCHEMA) const upsertStmt = db.prepare(` @@ -133,6 +135,16 @@ export function openSessionsDb(dbPath: string): SessionsDb { indexed_at = excluded.indexed_at `) + const upsertManyTxn = db.transaction((metas: SessionMeta[]) => { + for (const meta of metas) { + upsertStmt.run({ + ...meta, + tools_used: JSON.stringify(meta.tools_used), + skills_invoked: JSON.stringify(meta.skills_invoked), + }) + } + }) + return { upsertSession(meta) { upsertStmt.run({ @@ -141,6 +153,9 @@ export function openSessionsDb(dbPath: string): SessionsDb { skills_invoked: JSON.stringify(meta.skills_invoked), }) }, + upsertMany(metas) { + upsertManyTxn(metas) + }, listSessions(filters) { const { sql, params } = buildWhere(filters) const limit = filters.limit ?? 50 diff --git a/api/tests/sessions-db.test.ts b/api/tests/sessions-db.test.ts index 38e7a45..f32a520 100644 --- a/api/tests/sessions-db.test.ts +++ b/api/tests/sessions-db.test.ts @@ -68,4 +68,14 @@ describe('sessions db', () => { db.upsertSession(sampleMeta({ session_id: 'b', jsonl_path: '/tmp/b.jsonl' })) expect(db.countSessions({})).toBe(2) }) + + it('upsertMany insere batch em transacção', () => { + const db = openSessionsDb(dbPath) + db.upsertMany([ + sampleMeta({ session_id: 'x', jsonl_path: '/tmp/x.jsonl' }), + sampleMeta({ session_id: 'y', jsonl_path: '/tmp/y.jsonl' }), + sampleMeta({ session_id: 'z', jsonl_path: '/tmp/z.jsonl' }), + ]) + expect(db.countSessions({})).toBe(3) + }) })