From 0477d25d4bdfc5f1932958c9777b9350a64b7084 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Roland=20H=C3=A4der?= <roland@mxchange.org>
Date: Thu, 6 Feb 2025 18:14:34 +0100
Subject: [PATCH] Continued: - delete all solved obfuscation patterns at once -
 only vacuum database if rows have been deleted

---
 fba/commands.py | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/fba/commands.py b/fba/commands.py
index 3aee14c..5a1d960 100644
--- a/fba/commands.py
+++ b/fba/commands.py
@@ -2050,32 +2050,40 @@ def check_obfuscations(args: argparse.Namespace) -> int:
     locking.acquire()
 
     # Init variables
-    deleted = 0
+    deleted = []
 
     database.cursor.execute("SELECT pattern FROM obfuscation ORDER BY pattern ASC")
     rows = database.cursor.fetchall()
 
     logger.info("Checking %d obfuscations ...", len(rows))
     for row in rows:
-        logger.debug("row[pattern]='%s'", row["pattern"])
+        logger.debug("row[pattern]='%s' - BEFORE!", row["pattern"])
         pattern = row["pattern"].replace("*", "_").replace("?", "_")
+        logger.debug("pattern='%s' - AFTER!", pattern)
 
         database.cursor.execute("SELECT domain FROM instances WHERE domain LIKE '" + pattern + "' LIMIT 1")
-        check = database.cursor.fetchone()
+        instance = database.cursor.fetchone()
 
-        logger.debug("check[]='%s'", type(check))
-        if check is not None:
-            logger.info("Deleting row[pattern]='%s', solved to check[domain]='%s' ...", row["pattern"], check["domain"])
-            database.cursor.execute("DELETE FROM instances WHERE domain=? LIMIT 1", [row["pattern"]])
-            deleted = deleted + 1
+        logger.debug("instance[]='%s'", type(instance))
+        if instance is not None:
+            logger.info("Deleting row[pattern]='%s', solved to instance[domain]='%s' ...", row["pattern"], instance["domain"])
+            deleted.append(row["pattern"])
 
-    logger.info("Deleted %d patterns ...", deleted)
+    logger.debug("deleted()=%d", len(deleted))
+    if len(deleted) > 0:
+        logger.info("Deleting %d pattern(s) ...", len(deleted))
+        delete_sql = ", ".join([f"\'{pattern}\'" for pattern in deleted])
 
-    logger.debug("Invoking commit() ...")
-    database.connection.commit()
+        logger.debug("delete_sql='%s'", delete_sql)
+        database.cursor.execute("DELETE FROM obfuscation WHERE pattern IN (%s)" % delete_sql)
 
-    logger.debug("Vaccum cleaning database ...")
-    database.cursor.execute("VACUUM")
+        logger.debug("Invoking commit() ...")
+        database.connection.commit()
+
+        logger.info("Vaccum cleaning database ...")
+        database.cursor.execute("VACUUM")
+    else:
+        logger.info("No pattern could be found as solved domain.")
 
     logger.debug("Success! - EXIT!")
     return 0
-- 
2.39.5