summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Van Hoof <philip@codeminded.be>2010-08-12 13:48:54 +0200
committerMartyn Russell <martyn@lanedo.com>2010-08-12 17:02:18 +0100
commitd77a5ca62e55d9e3b5eb81b24292a55586bb99b4 (patch)
treead3dfc4ac91e76f2ad048018e6c23224c1d25cf3
parent1405ee26b152b7a62a64d1584a4c5b2e55c32f79 (diff)
downloadtracker-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.c6
-rw-r--r--src/libtracker-data/tracker-db-manager.c139
-rw-r--r--src/libtracker-data/tracker-db-manager.h1
-rw-r--r--src/tracker-control/tracker-control.c2
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;
}