Merge pull request #1695 from pi-hole/tweak/optimize_list_manipulation

Use UPSERT instead of special REPLACE INTO statements to update exist…
This commit is contained in:
DL6ER 2023-10-26 17:06:23 +02:00 committed by GitHub
commit fab6865bff
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 25 deletions

View File

@ -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);