[evolution-data-server] Bug 774698 - [Camel] Do not drop leftover 'Deletes' table on open



commit 3b3c57722b7b7d734748829a95cb714cc7523354
Author: Milan Crha <mcrha redhat com>
Date:   Thu Nov 24 10:21:58 2016 +0100

    Bug 774698 - [Camel] Do not drop leftover 'Deletes' table on open

 src/camel/camel-db.c |   29 +++++++++++++++++------------
 1 files changed, 17 insertions(+), 12 deletions(-)
---
diff --git a/src/camel/camel-db.c b/src/camel/camel-db.c
index 54f6b22..6f0ce33 100644
--- a/src/camel/camel-db.c
+++ b/src/camel/camel-db.c
@@ -493,6 +493,7 @@ struct _CamelDBPrivate {
        GMutex transaction_lock;
        GThread *transaction_thread;
        guint32 transaction_level;
+       gboolean is_foldersdb;
 };
 
 G_DEFINE_TYPE (CamelDB, camel_db, G_TYPE_OBJECT)
@@ -1599,7 +1600,6 @@ gint
 camel_db_create_folders_table (CamelDB *cdb,
                                GError **error)
 {
-       gint ret;
        const gchar *query = "CREATE TABLE IF NOT EXISTS folders ( "
                "folder_name TEXT PRIMARY KEY, "
                "version REAL, "
@@ -1613,16 +1613,14 @@ camel_db_create_folders_table (CamelDB *cdb,
                "visible_count INTEGER, "
                "jnd_count INTEGER, "
                "bdata TEXT )";
-       camel_db_release_cache_memory ();
 
-       ret = camel_db_command (cdb, query, error);
+       g_return_val_if_fail (CAMEL_IS_DB (cdb), -1);
 
-       if (ret != -1) {
-               /* Drop 'Deletes' table, leftover from the previous versions. */
-               ret = camel_db_command (cdb, "DROP TABLE IF EXISTS 'Deletes'", error);
-       }
+       camel_db_release_cache_memory ();
 
-       return ret;
+       cdb->priv->is_foldersdb = TRUE;
+
+       return camel_db_command (cdb, query, error);
 }
 
 static gint
@@ -2882,17 +2880,24 @@ camel_db_maybe_run_maintenance (CamelDB *cdb,
                                GError **error)
 {
        GError *local_error = NULL;
-       guint64 page_count = 0, freelist_count = 0;
+       guint64 page_count = 0, page_size = 0, freelist_count = 0;
        gboolean success = FALSE;
 
-       g_return_val_if_fail (cdb != NULL, FALSE);
+       g_return_val_if_fail (CAMEL_IS_DB (cdb), FALSE);
+
+       if (cdb->priv->is_foldersdb) {
+               /* Drop 'Deletes' table, leftover from the previous versions. */
+               if (camel_db_command (cdb, "DROP TABLE IF EXISTS 'Deletes'", error) == -1)
+                       return FALSE;
+       }
 
        cdb_writer_lock (cdb);
 
        if (cdb_sql_exec (cdb->priv->db, "PRAGMA page_count;", get_number_cb, &page_count, NULL, 
&local_error) == SQLITE_OK &&
+           cdb_sql_exec (cdb->priv->db, "PRAGMA page_size;", get_number_cb, &page_size, NULL, &local_error) 
== SQLITE_OK &&
            cdb_sql_exec (cdb->priv->db, "PRAGMA freelist_count;", get_number_cb, &freelist_count, NULL, 
&local_error) == SQLITE_OK) {
-               /* Vacuum, if there's more than 5% of the free pages */
-               success = !page_count || !freelist_count || freelist_count * 1000 / page_count <= 50 ||
+               /* Vacuum, if there's more than 5% of the free pages, or when free pages use more than 10MB */
+               success = !page_count || !freelist_count || (freelist_count * page_size < 1024 * 1024 * 10 && 
freelist_count * 1000 / page_count <= 50) ||
                    cdb_sql_exec (cdb->priv->db, "vacuum;", NULL, NULL, NULL, &local_error) == SQLITE_OK;
        }
 


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