[geary: 54/66] Don't wait for GC reap to clean search table after old message cleanup



commit cce66cba8f3880629fd8aed390050477db57a75e
Author: Chris Heywood <15127-creywood users noreply gitlab gnome org>
Date:   Mon May 11 18:52:06 2020 +1000

    Don't wait for GC reap to clean search table after old message cleanup

 src/engine/imap-db/imap-db-folder.vala | 53 +++++++++++++++++++++++++---------
 1 file changed, 39 insertions(+), 14 deletions(-)
---
diff --git a/src/engine/imap-db/imap-db-folder.vala b/src/engine/imap-db/imap-db-folder.vala
index 80a96c88d..1ae905c4a 100644
--- a/src/engine/imap-db/imap-db-folder.vala
+++ b/src/engine/imap-db/imap-db-folder.vala
@@ -886,7 +886,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
     public async Gee.Collection<Geary.EmailIdentifier>? detach_emails_before_timestamp(DateTime cutoff,
         GLib.Cancellable? cancellable) throws Error {
         debug("Detaching emails before %s for folder ID %", cutoff.to_string(), this.folder_id.to_string());
-        Gee.Collection<Geary.EmailIdentifier>? deleted_email_ids = null;
+        Gee.ArrayList<ImapDB.EmailIdentifier>? deleted_email_ids = null;
         Gee.ArrayList<string> deleted_primary_keys = null;
 
         yield db.exec_transaction_async(Db.TransactionType.RO, (cx) => {
@@ -913,7 +913,7 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
 
             while (!results.finished) {
                 if (deleted_email_ids == null) {
-                    deleted_email_ids = new Gee.ArrayList<Geary.EmailIdentifier>();
+                    deleted_email_ids = new Gee.ArrayList<ImapDB.EmailIdentifier>();
                     deleted_primary_keys = new Gee.ArrayList<string>();
                 }
 
@@ -935,25 +935,50 @@ private class Geary.ImapDB.Folder : BaseObject, Geary.ReferenceSemantics {
             while (delete_index < deleted_primary_keys.size) {
                 int batch_counter = 0;
 
-                yield db.exec_transaction_async(Db.TransactionType.WO, (cx) => {
-                    StringBuilder ids_sql_sublist = new StringBuilder();
-                    while (delete_index < deleted_primary_keys.size
-                           && batch_counter < OLD_MSG_DETACH_BATCH_SIZE) {
-                        if (batch_counter > 0)
-                            ids_sql_sublist.append(",");
-                        ids_sql_sublist.append(
-                            deleted_primary_keys.get(delete_index)
-                        );
-                        delete_index++;
-                        batch_counter++;
+                StringBuilder message_location_ids_sql_sublist = new StringBuilder();
+                StringBuilder message_ids_sql_sublist = new StringBuilder();
+                while (delete_index < deleted_primary_keys.size
+                       && batch_counter < OLD_MSG_DETACH_BATCH_SIZE) {
+                    if (batch_counter > 0) {
+                        message_location_ids_sql_sublist.append(",");
+                        message_ids_sql_sublist.append(",");
                     }
+                    message_location_ids_sql_sublist.append(
+                        deleted_primary_keys.get(delete_index)
+                    );
+                    message_ids_sql_sublist.append(
+                        deleted_email_ids.get(delete_index).message_id.to_string()
+                    );
+                    delete_index++;
+                    batch_counter++;
+                }
+
+                yield db.exec_transaction_async(Db.TransactionType.WO, (cx) => {
+
 
                     StringBuilder sql = new StringBuilder();
                     sql.append("""
                         DELETE FROM MessageLocationTable
                         WHERE id IN (
                     """);
-                    sql.append(ids_sql_sublist.str);
+                    sql.append(message_location_ids_sql_sublist.str);
+                    sql.append(")");
+                    Db.Statement stmt = cx.prepare(sql.str);
+
+                    stmt.exec(cancellable);
+
+                    return Db.TransactionOutcome.COMMIT;
+
+                }, cancellable);
+
+                yield db.exec_transaction_async(Db.TransactionType.WO, (cx) => {
+
+                    StringBuilder sql = new StringBuilder();
+                    sql.append("""
+                        DELETE FROM MessageSearchTable
+                        WHERE docid IN (
+                    """);
+                    sql.append(message_ids_sql_sublist.str);
                     sql.append(")");
                     Db.Statement stmt = cx.prepare(sql.str);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]