[epiphany/gnome-3-32] gsb-storage: recreate database if statement execution fails



commit b9dfc9bfc61246e12d9fe51f179467dcce936a52
Author: Michael Catanzaro <mcatanzaro igalia com>
Date:   Thu Mar 21 15:02:42 2019 +0000

    gsb-storage: recreate database if statement execution fails
    
    Lots of users are reporting gsb database corruption. We don't know
    what's going wrong, but at least we can attempt recovery when this
    happens instead of letting it fail again and again.
    
    Fixes #57
    
    
    (cherry picked from commit 2475b4f019c5f5af346100be4dc957ec9a51a45f)

 lib/safe-browsing/ephy-gsb-storage.c | 50 ++++++++++++++++++++++++++++--------
 1 file changed, 40 insertions(+), 10 deletions(-)
---
diff --git a/lib/safe-browsing/ephy-gsb-storage.c b/lib/safe-browsing/ephy-gsb-storage.c
index a45c894f2..29c938a15 100644
--- a/lib/safe-browsing/ephy-gsb-storage.c
+++ b/lib/safe-browsing/ephy-gsb-storage.c
@@ -378,6 +378,17 @@ ephy_gsb_storage_open_db (EphyGSBStorage *self)
   return TRUE;
 }
 
+static void
+ephy_gsb_storage_clear_db (EphyGSBStorage *self)
+{
+  g_assert (EPHY_IS_GSB_STORAGE (self));
+  g_assert (EPHY_IS_SQLITE_CONNECTION (self->db));
+
+  ephy_sqlite_connection_close (self->db);
+  ephy_sqlite_connection_delete_database (self->db);
+  g_clear_object (&self->db);
+}
+
 static gboolean
 ephy_gsb_storage_init_db (EphyGSBStorage *self)
 {
@@ -394,15 +405,21 @@ ephy_gsb_storage_init_db (EphyGSBStorage *self)
             ephy_gsb_storage_init_hash_prefix_table (self) &&
             ephy_gsb_storage_init_hash_full_table (self);
 
-  if (!success) {
-    ephy_sqlite_connection_close (self->db);
-    ephy_sqlite_connection_delete_database (self->db);
-    g_clear_object (&self->db);
-  }
+  if (!success)
+    ephy_gsb_storage_clear_db (self);
 
   return success;
 }
 
+static gboolean
+ephy_gsb_storage_recreate_db (EphyGSBStorage *self)
+{
+  g_assert (EPHY_IS_GSB_STORAGE (self));
+
+  ephy_gsb_storage_clear_db (self);
+  return ephy_gsb_storage_init_db (self);
+}
+
 static inline gboolean
 ephy_gsb_storage_check_schema_version (EphyGSBStorage *self)
 {
@@ -481,10 +498,7 @@ ephy_gsb_storage_constructed (GObject *object)
     success = ephy_gsb_storage_open_db (self);
     if (success && !ephy_gsb_storage_check_schema_version (self)) {
       LOG ("GSB database schema incompatibility, recreating database...");
-      ephy_sqlite_connection_close (self->db);
-      ephy_sqlite_connection_delete_database (self->db);
-      g_clear_object (&self->db);
-      success = ephy_gsb_storage_init_db (self);
+      success = ephy_gsb_storage_recreate_db (self);
     }
   }
 
@@ -585,6 +599,7 @@ ephy_gsb_storage_get_metadata (EphyGSBStorage *self,
     g_warning ("Failed to execute select metadata statement: %s", error->message);
     g_error_free (error);
     g_object_unref (statement);
+    ephy_gsb_storage_recreate_db (self);
     return default_value;
   }
 
@@ -645,6 +660,7 @@ ephy_gsb_storage_set_metadata (EphyGSBStorage *self,
   if (error) {
     g_warning ("Failed to execute update metadata statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 }
 
@@ -693,6 +709,7 @@ ephy_gsb_storage_get_threat_lists (EphyGSBStorage *self)
   if (error) {
     g_warning ("Failed to execute select threat lists statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -753,6 +770,7 @@ ephy_gsb_storage_compute_checksum (EphyGSBStorage    *self,
   if (error) {
     g_warning ("Failed to execute select hash prefix statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
     goto out;
   }
 
@@ -821,6 +839,7 @@ ephy_gsb_storage_update_client_state (EphyGSBStorage    *self,
   if (error) {
     g_warning ("Failed to execute update threat statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -863,6 +882,7 @@ ephy_gsb_storage_clear_hash_prefixes (EphyGSBStorage    *self,
   if (error) {
     g_warning ("Failed to execute clear hash prefix statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -915,6 +935,7 @@ ephy_gsb_storage_get_hash_prefixes_to_delete (EphyGSBStorage    *self,
   if (error) {
     g_warning ("Failed to execute select prefix value statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -997,6 +1018,7 @@ ephy_gsb_storage_delete_hash_prefixes_batch (EphyGSBStorage      *self,
   if (error) {
     g_warning ("Failed to execute delete hash prefix statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
 out:
@@ -1178,6 +1200,7 @@ ephy_gsb_storage_insert_hash_prefixes_batch (EphyGSBStorage      *self,
   if (error) {
     g_warning ("Failed to execute insert hash prefix statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
 out:
@@ -1355,6 +1378,7 @@ ephy_gsb_storage_lookup_hash_prefixes (EphyGSBStorage *self,
     g_error_free (error);
     g_list_free_full (retval, (GDestroyNotify)ephy_gsb_hash_prefix_lookup_free);
     retval = NULL;
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -1439,6 +1463,7 @@ ephy_gsb_storage_lookup_full_hashes (EphyGSBStorage *self,
     g_error_free (error);
     g_list_free_full (retval, (GDestroyNotify)ephy_gsb_hash_full_lookup_free);
     retval = NULL;
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -1496,6 +1521,7 @@ ephy_gsb_storage_insert_full_hash (EphyGSBStorage    *self,
   ephy_sqlite_statement_step (statement, &error);
   if (error) {
     g_warning ("Failed to execute insert full hash statement: %s", error->message);
+    ephy_gsb_storage_recreate_db (self);
     goto out;
   }
 
@@ -1523,8 +1549,10 @@ ephy_gsb_storage_insert_full_hash (EphyGSBStorage    *self,
     goto out;
 
   ephy_sqlite_statement_step (statement, &error);
-  if (error)
+  if (error) {
     g_warning ("Failed to execute insert full hash statement: %s", error->message);
+    ephy_gsb_storage_recreate_db (self);
+  }
 
 out:
   if (statement)
@@ -1573,6 +1601,7 @@ ephy_gsb_storage_delete_old_full_hashes (EphyGSBStorage *self)
   if (error) {
     g_warning ("Failed to execute delete full hash statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);
@@ -1631,6 +1660,7 @@ ephy_gsb_storage_update_hash_prefix_expiration (EphyGSBStorage *self,
   if (error) {
     g_warning ("Failed to execute update hash prefix statement: %s", error->message);
     g_error_free (error);
+    ephy_gsb_storage_recreate_db (self);
   }
 
   g_object_unref (statement);


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