[tracker/rss-enclosures] libtracker-data: Fix db corruption test



commit 3ca23487bb9f595a8d8685de111a27dcda402869
Author: Philip Van Hoof <philip codeminded be>
Date:   Thu Sep 30 12:15:37 2010 +0200

    libtracker-data: Fix db corruption test
    
    Fixes NB#195547

 src/libtracker-data/tracker-db-manager.c |   50 ++++++++++++++++++++---------
 1 files changed, 34 insertions(+), 16 deletions(-)
---
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c
index 495a6b7..415a0fe 100644
--- a/src/libtracker-data/tracker-db-manager.c
+++ b/src/libtracker-data/tracker-db-manager.c
@@ -218,9 +218,12 @@ db_set_params (TrackerDBInterface *iface,
 	tracker_db_interface_execute_query (iface, NULL, "PRAGMA auto_vacuum = 0;");
 
 	result_set = tracker_db_interface_execute_query (iface, NULL, "PRAGMA journal_mode = WAL;");
-        if (result_set) {
-                g_object_unref (result_set);
-        }
+	if (result_set == NULL) {
+		/* Don't just silence the problem. This pragma must return 'WAL' */
+		g_message ("Can't set journal mode to WAL");
+	} else {
+		g_object_unref (result_set);
+	}
 
 	if (page_size != TRACKER_DB_PAGE_SIZE_DONT_SET) {
 		g_message ("  Setting page size to %d", page_size);
@@ -862,7 +865,6 @@ tracker_db_manager_init (TrackerDBManagerFlags  flags,
 
 	} else if ((flags & TRACKER_DB_MANAGER_READONLY) == 0) {
 		/* do not do shutdown check for read-only mode (direct access) */
-
 		gboolean must_recreate;
 		gchar *journal_filename;
 
@@ -886,9 +888,9 @@ tracker_db_manager_init (TrackerDBManagerFlags  flags,
 			g_message ("Didn't shut down cleanly last time, doing integrity checks");
 
 			for (i = 1; i < G_N_ELEMENTS (dbs) && !must_recreate; i++) {
-				TrackerDBCursor *cursor = NULL;
-				TrackerDBStatement *stmt;
 				struct stat st;
+				GError *error = NULL;
+				TrackerDBStatement *stmt;
 
 				if (g_stat (dbs[i].abs_filename, &st) == 0) {
 					size = st.st_size;
@@ -907,27 +909,43 @@ tracker_db_manager_init (TrackerDBManagerFlags  flags,
 
 				loaded = TRUE;
 
-				stmt = tracker_db_interface_create_statement (dbs[i].iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, NULL,
+				stmt = tracker_db_interface_create_statement (dbs[i].iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &error,
 				                                              "PRAGMA integrity_check(1)");
 
-				if (stmt) {
-					cursor = tracker_db_statement_start_cursor (stmt, NULL);
-					g_object_unref (stmt);
-				}
+				if (error != NULL) {
+					if (error->domain == TRACKER_DB_INTERFACE_ERROR &&
+					    error->code == TRACKER_DB_QUERY_ERROR) {
+						must_recreate = TRUE;
+					} else {
+						g_critical ("%s", error->message);
+					}
+					g_error_free (error);
+				} else {
+					TrackerDBCursor *cursor = NULL;
+
+					if (stmt) {
+						cursor = tracker_db_statement_start_cursor (stmt, NULL);
+						g_object_unref (stmt);
+					} else {
+						g_critical ("Can't create stmt for integrity_check, no error given");
+					}
 
-				if (cursor) {
-					if (tracker_db_cursor_iter_next (cursor, NULL, NULL)) {
-						if (g_strcmp0 (tracker_db_cursor_get_string (cursor, 0, NULL), "ok") != 0) {
-							must_recreate = TRUE;
+					if (cursor) {
+						if (tracker_db_cursor_iter_next (cursor, NULL, NULL)) {
+							if (g_strcmp0 (tracker_db_cursor_get_string (cursor, 0, NULL), "ok") != 0) {
+								must_recreate = TRUE;
+							}
 						}
+						g_object_unref (cursor);
 					}
-					g_object_unref (cursor);
 				}
 			}
 		}
 
 		if (must_recreate) {
 
+			g_message ("Database severely damaged. We will recreate it and replay the journal if available.");
+
 			if (first_time) {
 				*first_time = TRUE;
 			}



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