diff options
author | Philip Van Hoof <philip@codeminded.be> | 2011-02-10 10:45:24 +0100 |
---|---|---|
committer | Philip Van Hoof <philip@codeminded.be> | 2011-02-10 10:45:24 +0100 |
commit | 31d891f6e29271e560f9231fe1755899506ce0a9 (patch) | |
tree | 8f1cf4eafc8664f446c53e326a269ae065f7beed | |
parent | 4c3e8c1b2492900bee67057a5b8ca3413e64961a (diff) | |
download | tracker-31d891f6e29271e560f9231fe1755899506ce0a9.tar.gz |
libtracker-data: Recreate the DB if first init of the DB iface fails
-rw-r--r-- | src/libtracker-data/tracker-db-manager.c | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c index d29083b69..7b5865d02 100644 --- a/src/libtracker-data/tracker-db-manager.c +++ b/src/libtracker-data/tracker-db-manager.c @@ -784,6 +784,38 @@ tracker_db_manager_init_locations (void) locations_initialized = TRUE; } +static void +perform_recreate (gboolean *first_time, GError **error) +{ + GError *internal_error; + guint i; + + if (first_time) { + *first_time = TRUE; + } + + for (i = 1; i < G_N_ELEMENTS (dbs); i++) { + if (dbs[i].iface) { + g_object_unref (dbs[i].iface); + dbs[i].iface = NULL; + } + } + + if (!tracker_file_system_has_enough_space (data_dir, TRACKER_DB_MIN_REQUIRED_SPACE, TRUE)) { + g_set_error (error, + TRACKER_DB_INTERFACE_ERROR, + TRACKER_DB_OPEN_ERROR, + "Filesystem has not enough space"); + return; + } + + db_recreate_all (&internal_error); + + if (internal_error) { + g_propagate_error (error, internal_error); + } +} + gboolean tracker_db_manager_init (TrackerDBManagerFlags flags, gboolean *first_time, @@ -975,24 +1007,10 @@ tracker_db_manager_init (TrackerDBManagerFlags flags, return FALSE; } - if (first_time) { - *first_time = TRUE; - } - - if (!tracker_file_system_has_enough_space (data_dir, TRACKER_DB_MIN_REQUIRED_SPACE, TRUE)) { - - g_set_error (error, - TRACKER_DB_INTERFACE_ERROR, - TRACKER_DB_OPEN_ERROR, - "Filesystem has not enough space"); - - return FALSE; - } - /* Clear the first-index stamp file */ tracker_db_manager_set_first_index_done (FALSE); - db_recreate_all (&internal_error); + perform_recreate (first_time, &internal_error); if (internal_error) { g_propagate_error (error, internal_error); @@ -1121,34 +1139,11 @@ tracker_db_manager_init (TrackerDBManagerFlags flags, g_message ("Database severely damaged. We will recreate it and replay the journal if available."); - if (first_time) { - *first_time = TRUE; - } - - for (i = 1; i < G_N_ELEMENTS (dbs); i++) { - if (dbs[i].iface) { - g_object_unref (dbs[i].iface); - dbs[i].iface = NULL; - } - } - - if (!tracker_file_system_has_enough_space (data_dir, TRACKER_DB_MIN_REQUIRED_SPACE, TRUE)) { - - g_set_error (error, - TRACKER_DB_INTERFACE_ERROR, - TRACKER_DB_OPEN_ERROR, - "Filesystem has not enough space"); - - return FALSE; - } - - db_recreate_all (&internal_error); - + perform_recreate (first_time, &internal_error); if (internal_error) { g_propagate_error (error, internal_error); return FALSE; } - loaded = FALSE; } @@ -1185,9 +1180,22 @@ tracker_db_manager_init (TrackerDBManagerFlags flags, } if (internal_error) { - g_propagate_error (error, internal_error); - initialized = FALSE; - return FALSE; + if ((flags & TRACKER_DB_MANAGER_READONLY) == 0) { + perform_recreate (first_time, &internal_error); + if (!internal_error) { + resources_iface = tracker_db_manager_get_db_interfaces (&internal_error, 1, + TRACKER_DB_METADATA); + } + if (internal_error) { + g_propagate_error (error, internal_error); + initialized = FALSE; + return FALSE; + } + } else { + g_propagate_error (error, internal_error); + initialized = FALSE; + return FALSE; + } } tracker_db_interface_set_max_stmt_cache_size (resources_iface, |