diff --git a/server/models/documents.js b/server/models/documents.js index 0de83bcd560b915d4e77bff676f2f2516c3ba489..e51071a1a086cf1fd9fec35c4eedfd17a11b8055 100644 --- a/server/models/documents.js +++ b/server/models/documents.js @@ -69,11 +69,8 @@ const Document = { addDocuments: async function (workspace, additions = []) { const VectorDb = getVectorDbClass(); if (additions.length === 0) return; + const insertParams = []; - const db = await this.db(); - const stmt = await db.prepare( - `INSERT INTO ${this.tablename} (docId, filename, docpath, workspaceId, metadata) VALUES (?,?,?,?,?)` - ); for (const path of additions) { const data = await fileData(path); if (!data) continue; @@ -96,7 +93,8 @@ const Document = { console.error("Failed to vectorize", path); continue; } - stmt.run([ + + insertParams.push([ docId, newDoc.filename, newDoc.docpath, @@ -104,19 +102,31 @@ const Document = { newDoc.metadata, ]); } + + const db = await this.db(); + const stmt = await db.prepare( + `INSERT INTO ${this.tablename} (docId, filename, docpath, workspaceId, metadata) VALUES (?,?,?,?,?)` + ); + + await db.exec("BEGIN TRANSACTION"); + try { + for (const params of insertParams) { + await stmt.run(params); + } + await db.exec("COMMIT"); + } catch { + await db.exec("ROLLBACK"); + } + stmt.finalize(); db.close(); - return; }, removeDocuments: async function (workspace, removals = []) { const VectorDb = getVectorDbClass(); - + const deleteParams = []; if (removals.length === 0) return; - const db = await this.db(); - const stmt = await db.prepare( - `DELETE FROM ${this.tablename} WHERE docpath = ? AND workspaceId = ?` - ); + for (const path of removals) { const document = await this.firstWhere( `docPath = '${path}' AND workspaceId = ${workspace.id}` @@ -126,8 +136,24 @@ const Document = { workspace.slug, document.docId ); - stmt.run([path, workspace.id]); + deleteParams.push([path, workspace.id]); } + + const db = await this.db(); + const stmt = await db.prepare( + `DELETE FROM ${this.tablename} WHERE docpath = ? AND workspaceId = ?` + ); + + await db.exec("BEGIN TRANSACTION"); + try { + for (const params of deleteParams) { + await stmt.run(params); + } + await db.exec("COMMIT"); + } catch { + await db.exec("ROLLBACK"); + } + stmt.finalize(); db.close(); return true; diff --git a/server/models/vectors.js b/server/models/vectors.js index e568097be8eb84273a432c0daec41ec4a944ac01..d91512a1592669ef1e60a8c01d0d20bdc4a19dc7 100644 --- a/server/models/vectors.js +++ b/server/models/vectors.js @@ -58,7 +58,14 @@ const DocumentVectors = { [] ); - stmt.run(values); + await db.exec("BEGIN TRANSACTION"); + try { + await stmt.run(values); + await db.exec("COMMIT"); + } catch { + await db.exec("ROLLBACK"); + } + stmt.finalize(); db.close(); diff --git a/server/models/workspaceUsers.js b/server/models/workspaceUsers.js index 8dacbac113ad7efd9fbeb19df926a86b3ffbb4b8..74b4fab26a674db8279e11407acf5d77375d7948 100644 --- a/server/models/workspaceUsers.js +++ b/server/models/workspaceUsers.js @@ -46,8 +46,14 @@ const WorkspaceUser = { `INSERT INTO ${this.tablename} (user_id, workspace_id) VALUES (?,?)` ); - for (const workspaceId of workspaceIds) { - stmt.run([userId, workspaceId]); + await db.exec("BEGIN TRANSACTION"); + try { + for (const workspaceId of workspaceIds) { + await stmt.run([userId, workspaceId]); + } + await db.exec("COMMIT"); + } catch { + await db.exec("ROLLBACK"); } stmt.finalize(); @@ -61,8 +67,14 @@ const WorkspaceUser = { `INSERT INTO ${this.tablename} (user_id, workspace_id) VALUES (?,?)` ); - for (const userId of userIds) { - stmt.run([userId, workspaceId]); + await db.exec("BEGIN TRANSACTION"); + try { + for (const userId of userIds) { + await stmt.run([userId, workspaceId]); + } + await db.exec("COMMIT"); + } catch { + await db.exec("ROLLBACK"); } stmt.finalize();