diff options
author | Philip Van Hoof <philip@codeminded.be> | 2010-08-12 13:48:54 +0200 |
---|---|---|
committer | Martyn Russell <martyn@lanedo.com> | 2010-08-12 17:02:18 +0100 |
commit | d77a5ca62e55d9e3b5eb81b24292a55586bb99b4 (patch) | |
tree | ad3dfc4ac91e76f2ad048018e6c23224c1d25cf3 | |
parent | 1405ee26b152b7a62a64d1584a4c5b2e55c32f79 (diff) | |
download | tracker-d77a5ca62e55d9e3b5eb81b24292a55586bb99b4.tar.gz |
tracker-data: Remove the journal when a db-bump takes place
Also remove the db-version.txt file when tracker-control -r is called.
This fixes NB#184823,
-rw-r--r-- | src/libtracker-data/tracker-data-manager.c | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-manager.c | 139 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-manager.h | 1 | ||||
-rw-r--r-- | src/tracker-control/tracker-control.c | 2 |
4 files changed, 75 insertions, 73 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c index c568808ce..232e55bdc 100644 --- a/src/libtracker-data/tracker-data-manager.c +++ b/src/libtracker-data/tracker-data-manager.c @@ -2684,7 +2684,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags, GList *sorted = NULL, *l; const gchar *env_path; gint max_id = 0; - gboolean read_only, needed_reindex = FALSE; + gboolean read_only; tracker_data_update_init (); @@ -2704,7 +2704,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags, read_journal = FALSE; - if (!tracker_db_manager_init (flags, &is_first_time_index, &needed_reindex, TRUE)) { + if (!tracker_db_manager_init (flags, &is_first_time_index, TRUE)) { return FALSE; } @@ -2718,7 +2718,7 @@ tracker_data_manager_init (TrackerDBManagerFlags flags, iface = tracker_db_manager_get_db_interface (); - if (journal_check && is_first_time_index && !needed_reindex) { + if (journal_check && is_first_time_index) { if (tracker_db_journal_reader_init (NULL)) { if (tracker_db_journal_reader_next (NULL)) { /* journal with at least one valid transaction diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c index 37ad10fde..0f8855e64 100644 --- a/src/libtracker-data/tracker-db-manager.c +++ b/src/libtracker-data/tracker-db-manager.c @@ -384,92 +384,96 @@ db_interface_create (TrackerDB db) } static void -db_manager_remove_all (gboolean rm_journal) +db_manager_remove_journal (void) { + gchar *path; + gchar *directory, *rotate_to = NULL; + gsize chunk_size; + gboolean do_rotate = FALSE; + const gchar *dirs[3] = { NULL, NULL, NULL }; guint i; - g_message ("Removing all database/storage files"); - - /* Remove stamp files */ - tracker_db_manager_set_first_index_done (FALSE); - tracker_db_manager_set_last_crawl_done (FALSE); - - /* NOTE: We don't have to be initialized for this so we - * calculate the absolute directories here. + /* We duplicate the path here because later we shutdown the + * journal which frees this data. We want to survive that. */ - for (i = 1; i < G_N_ELEMENTS (dbs); i++) { - - g_message (" Removing database:'%s'", - dbs[i].abs_filename); - g_unlink (dbs[i].abs_filename); + path = g_strdup (tracker_db_journal_get_filename ()); + if (!path) { + return; } - if (rm_journal) { - const gchar *opath = tracker_db_journal_get_filename (); + g_message (" Removing journal:'%s'", path); - if (opath) { - GFile *file; - gchar *cpath; - gchar *directory, *rotate_to = NULL; - gsize chunk_size; - gboolean do_rotate = FALSE; - const gchar *dirs[3] = { NULL, NULL, NULL }; + directory = g_path_get_dirname (path); - cpath = g_strdup (opath); + tracker_db_journal_get_rotating (&do_rotate, &chunk_size, &rotate_to); + tracker_db_journal_shutdown (); - g_message (" Removing journal:'%s'", cpath); + dirs[0] = directory; + dirs[1] = do_rotate ? rotate_to : NULL; - directory = g_path_get_dirname (cpath); + for (i = 0; dirs[i] != NULL; i++) { + GDir *journal_dir; + const gchar *f; - tracker_db_journal_get_rotating (&do_rotate, &chunk_size, &rotate_to); + journal_dir = g_dir_open (dirs[i], 0, NULL); + if (!journal_dir) { + continue; + } - tracker_db_journal_shutdown (); + /* Remove rotated chunks */ + while ((f = g_dir_read_name (journal_dir)) != NULL) { + gchar *fullpath; - dirs[0] = directory; - dirs[1] = do_rotate ? rotate_to : NULL; + if (!g_str_has_prefix (f, TRACKER_DB_JOURNAL_FILENAME ".")) { + continue; + } - for (i = 0; dirs[i] != NULL; i++) { - GDir *journal_dir; - const gchar *f_name; + fullpath = g_build_filename (dirs[i], f, NULL); + g_unlink (fullpath); + g_free (fullpath); + } - journal_dir = g_dir_open (dirs[i], 0, NULL); - if (!journal_dir) { - continue; - } - f_name = g_dir_read_name (journal_dir); + g_dir_close (journal_dir); + } - /* Remove rotated chunks */ - while (f_name) { - gchar *fullpath; + g_free (rotate_to); + g_free (directory); - if (f_name) { - if (!g_str_has_prefix (f_name, TRACKER_DB_JOURNAL_FILENAME ".")) { - f_name = g_dir_read_name (journal_dir); - continue; - } - } + /* Remove active journal */ + g_unlink (path); + g_free (path); +} - fullpath = g_build_filename (dirs[i], f_name, NULL); - file = g_file_new_for_path (fullpath); - g_file_delete (file, NULL, NULL); - g_object_unref (file); - g_free (fullpath); +static void +db_manager_remove_all (gboolean rm_journal) +{ + guint i; - f_name = g_dir_read_name (journal_dir); - } + g_message ("Removing all database/storage files"); - g_dir_close (journal_dir); - } + /* Remove stamp files */ + tracker_db_manager_set_first_index_done (FALSE); + tracker_db_manager_set_last_crawl_done (FALSE); - g_free (rotate_to); - g_free (directory); + /* NOTE: We don't have to be initialized for this so we + * calculate the absolute directories here. + */ + for (i = 1; i < G_N_ELEMENTS (dbs); i++) { + g_message (" Removing database:'%s'", dbs[i].abs_filename); + g_unlink (dbs[i].abs_filename); + } - /* Remove active journal */ - file = g_file_new_for_path (cpath); - g_file_delete (file, NULL, NULL); - g_object_unref (file); - g_free (cpath); - } + if (rm_journal) { + gchar *filename; + + db_manager_remove_journal (); + + /* If also the journal is gone, we can also remove db-version.txt, it + * would have no more relevance whatsoever. */ + filename = g_build_filename (data_dir, TRACKER_DB_VERSION_FILE, NULL); + g_message (" Removing db-version file:'%s'", filename); + g_unlink (filename); + g_free (filename); } } @@ -654,7 +658,6 @@ free_thread_interface (gpointer data) gboolean tracker_db_manager_init (TrackerDBManagerFlags flags, gboolean *first_time, - gboolean *needed_reindex, gboolean shared_cache) { GType etype; @@ -745,9 +748,9 @@ tracker_db_manager_init (TrackerDBManagerFlags flags, } if (need_reindex) { - if (needed_reindex) { - *needed_reindex = TRUE; - } + tracker_db_journal_init (NULL, FALSE); + db_manager_remove_journal (); + tracker_db_journal_shutdown (); db_set_version (); } diff --git a/src/libtracker-data/tracker-db-manager.h b/src/libtracker-data/tracker-db-manager.h index dd9cc5603..635f4f551 100644 --- a/src/libtracker-data/tracker-db-manager.h +++ b/src/libtracker-data/tracker-db-manager.h @@ -49,7 +49,6 @@ typedef enum { GType tracker_db_get_type (void) G_GNUC_CONST; gboolean tracker_db_manager_init (TrackerDBManagerFlags flags, gboolean *first_time, - gboolean *needed_reindex, gboolean shared_cache); void tracker_db_manager_shutdown (void); void tracker_db_manager_remove_all (gboolean rm_journal); diff --git a/src/tracker-control/tracker-control.c b/src/tracker-control/tracker-control.c index 04fb4a87d..3efe87184 100644 --- a/src/tracker-control/tracker-control.c +++ b/src/tracker-control/tracker-control.c @@ -431,7 +431,7 @@ main (int argc, char **argv) g_object_unref (db_config); /* Clean up */ - if (!tracker_db_manager_init (TRACKER_DB_MANAGER_REMOVE_ALL, NULL, NULL, FALSE)) { + if (!tracker_db_manager_init (TRACKER_DB_MANAGER_REMOVE_ALL, NULL, FALSE)) { return EXIT_FAILURE; } |