From 87272c2178db5eb188bb28afbc8b92c2de3d0f1d Mon Sep 17 00:00:00 2001 From: DL6ER Date: Mon, 23 Oct 2023 22:35:14 +0200 Subject: [PATCH] Use UPSERT instead of special REPLACE INTO statements to update existing group, adlist, domainlist, and client rows in the gravity database Signed-off-by: DL6ER --- src/database/gravity-db.c | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/database/gravity-db.c b/src/database/gravity-db.c index 34cc819b..db4e5e1e 100644 --- a/src/database/gravity-db.c +++ b/src/database/gravity-db.c @@ -1643,43 +1643,28 @@ bool gravityDB_addToTable(const enum gravity_list_type listtype, tablerow *row, } else { // Create new or replace existing entry, no error if existing - // We have to use a subquery here to avoid violating FOREIGN KEY - // constraints (REPLACE recreates (= new ID) entries instead of updating them) + // We UPSERT here to avoid violating FOREIGN KEY constraints if(listtype == GRAVITY_GROUPS) if(row->name == NULL) { // Name is not to be changed - querystr = "REPLACE INTO \"group\" (name,enabled,description,id,date_added) " - "VALUES (:item,:enabled,:comment," - "(SELECT id FROM \"group\" WHERE name = :item)," - "(SELECT date_added FROM \"group\" WHERE name = :item));"; + querystr = "INSERT INTO \"group\" (name,enabled,description) VALUES (:item,:enabled,:description) " + "ON CONFLICT(name) DO UPDATE SET enabled = :enabled, description = :description;"; } else { - querystr = "UPDATE \"group\" SET " - "name = :name, enabled = :enabled, description = :comment " + querystr = "UPDATE \"group\" SET name = :name, enabled = :enabled, description = :comment " "WHERE name = :item"; } else if(listtype == GRAVITY_ADLISTS) - querystr = "REPLACE INTO adlist (address,enabled,comment,type,id,date_added,date_updated,number,invalid_domains,status,abp_entries) " - "VALUES (:item,:enabled,:comment,:type," - "(SELECT id FROM adlist WHERE address = :item)," - "(SELECT date_added FROM adlist WHERE address = :item)," - "(SELECT date_updated FROM adlist WHERE address = :item)," - "(SELECT number FROM adlist WHERE address = :item)," - "(SELECT invalid_domains FROM adlist WHERE address = :item)," - "(SELECT status FROM adlist WHERE address = :item)," - "(SELECT abp_entries FROM adlist WHERE address = :item));"; + querystr = "INSERT INTO adlist (address,enabled,comment,type) VALUES (:item,:enabled,:comment,:type) "\ + "ON CONFLICT(address) DO UPDATE SET enabled = :enabled, comment = :comment, type = :type;"; else if(listtype == GRAVITY_CLIENTS) - querystr = "REPLACE INTO client (ip,comment,id,date_added) " - "VALUES (:item,:comment," - "(SELECT id FROM client WHERE ip = :item)," - "(SELECT date_added FROM client WHERE ip = :item));"; + querystr = "INSERT INTO client (ip,comment) VALUES (:item,:comment) "\ + "ON CONFLICT(ip) DO UPDATE SET comment = :comment;"; else // domainlist - querystr = "REPLACE INTO domainlist (domain,type,enabled,comment,id,date_added) " - "VALUES (:item,:type,:enabled,:comment," - "(SELECT id FROM domainlist WHERE domain = :item AND type = :oldtype)," - "(SELECT date_added FROM domainlist WHERE domain = :item AND type = :oldtype));"; + querystr = "INSERT INTO domainlist (domain,type,enabled,comment) VALUES (:item,:type,:enabled,:comment) "\ + "ON CONFLICT(domain) DO UPDATE SET type = :type, enabled = :enabled, comment = :comment;"; } int rc = sqlite3_prepare_v2(gravity_db, querystr, -1, &stmt, NULL);