diff --git a/src/services/repository.js b/src/services/repository.js index 383ff7864..c96ffb794 100644 --- a/src/services/repository.js +++ b/src/services/repository.js @@ -103,7 +103,7 @@ async function updateEntity(entity) { } await sql.transactional(async () => { - await sql.replace(entityName, clone); + await sql.upsert(entityName, primaryKeyName, clone); const primaryKey = entity[primaryKeyName]; diff --git a/src/services/sql.js b/src/services/sql.js index 52334e5c7..27c121516 100644 --- a/src/services/sql.js +++ b/src/services/sql.js @@ -9,25 +9,48 @@ function setDbConnection(connection) { dbConnection = connection; } -async function insert(table_name, rec, replace = false) { +async function insert(tableName, rec, replace = false) { const keys = Object.keys(rec); if (keys.length === 0) { - log.error("Can't insert empty object into table " + table_name); + log.error("Can't insert empty object into table " + tableName); return; } const columns = keys.join(", "); const questionMarks = keys.map(p => "?").join(", "); - const query = "INSERT " + (replace ? "OR REPLACE" : "") + " INTO " + table_name + "(" + columns + ") VALUES (" + questionMarks + ")"; + const query = "INSERT " + (replace ? "OR REPLACE" : "") + " INTO " + tableName + "(" + columns + ") VALUES (" + questionMarks + ")"; const res = await execute(query, Object.values(rec)); return res.lastID; } -async function replace(table_name, rec) { - return await insert(table_name, rec, true); +async function replace(tableName, rec) { + return await insert(tableName, rec, true); +} + +async function upsert(tableName, primaryKey, rec) { + const keys = Object.keys(rec); + if (keys.length === 0) { + log.error("Can't upsert empty object into table " + tableName); + return; + } + + const columns = keys.join(", "); + + let i = 0; + + const questionMarks = keys.map(p => ":" + i++).join(", "); + + i = 0; + + const updateMarks = keys.map(key => `${key} = :${i++}`).join(", "); + + const query = `INSERT INTO ${tableName} (${columns}) VALUES (${questionMarks}) + ON CONFLICT (${primaryKey}) DO UPDATE SET ${updateMarks}`; + + await execute(query, Object.values(rec)); } async function beginTransaction() { @@ -213,5 +236,6 @@ module.exports = { getColumn, execute, executeScript, - transactional + transactional, + upsert }; \ No newline at end of file