[tracker] Synchronize fts after restore from backup



commit 8e4fbac6fd228f2bc3b0026a109a8d6151ba1cd3
Author: Philip Van Hoof <philip codeminded be>
Date:   Tue Aug 25 16:49:44 2009 +0200

    Synchronize fts after restore from backup

 src/libtracker-data/tracker-data-backup.c  |    3 +
 src/libtracker-data/tracker-data-manager.c |   28 ++--------
 src/libtracker-db/tracker-db-backup.c      |   77 +++++++++++++++++++++++++++-
 src/libtracker-db/tracker-db-backup.h      |    1 +
 src/libtracker-db/tracker-db-manager.c     |   12 +++-
 src/tracker-fts/tracker-fts.c              |   34 ++++++++++++
 src/tracker-fts/tracker-fts.h              |    2 +
 7 files changed, 130 insertions(+), 27 deletions(-)
---
diff --git a/src/libtracker-data/tracker-data-backup.c b/src/libtracker-data/tracker-data-backup.c
index fc2ddc3..47a06ec 100644
--- a/src/libtracker-data/tracker-data-backup.c
+++ b/src/libtracker-data/tracker-data-backup.c
@@ -253,5 +253,8 @@ tracker_data_backup_restore (GFile *backup,
 	tracker_db_journal_open ();
 	tracker_db_manager_reconnect ();
 
+	tracker_db_backup_sync_fts ();
+
 	g_idle_add (on_restore_done, info);
 }
+
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index a35fc2d..81e712f 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -37,6 +37,8 @@
 #include <libtracker-common/tracker-utils.h>
 #include <libtracker-common/tracker-ontology.h>
 
+#include <tracker-fts/tracker-fts.h>
+
 #include <libtracker-db/tracker-db-interface-sqlite.h>
 #include <libtracker-db/tracker-db-manager.h>
 
@@ -717,31 +719,11 @@ create_decomposed_transient_metadata_tables (TrackerDBInterface *iface)
 static void
 create_fts_table (TrackerDBInterface *iface)
 {
-	GString    *sql;
-	TrackerProperty	  **properties, **property;
-	gboolean first;
+	gchar *query = tracker_fts_get_create_fts_table_query ();
 
-	sql = g_string_new ("CREATE VIRTUAL TABLE fulltext.fts USING trackerfts (");
+	tracker_db_interface_execute_query (iface, NULL, "%s", query);
 
-	first = TRUE;
-	properties = tracker_ontology_get_properties ();
-	for (property = properties; *property; property++) {
-		if (tracker_property_get_data_type (*property) == TRACKER_PROPERTY_TYPE_STRING &&
-		    tracker_property_get_fulltext_indexed (*property)) {
-			if (first) {
-				first = FALSE;
-			} else {
-				g_string_append (sql, ", ");
-			}
-			g_string_append_printf (sql, "\"%s\"", tracker_property_get_name (*property));
-		}
-	}
-	g_free (properties);
-
-	g_string_append (sql, ")");
-	tracker_db_interface_execute_query (iface, NULL, "%s", sql->str);
-
-	g_string_free (sql, TRUE);
+	g_free (query);
 }
 
 gboolean
diff --git a/src/libtracker-db/tracker-db-backup.c b/src/libtracker-db/tracker-db-backup.c
index e278eef..0620b32 100644
--- a/src/libtracker-db/tracker-db-backup.c
+++ b/src/libtracker-db/tracker-db-backup.c
@@ -32,6 +32,8 @@
 #include <libtracker-db/tracker-db-manager.h>
 #include <libtracker-db/tracker-db-interface-sqlite.h>
 
+#include <tracker-fts/tracker-fts.h>
+
 #include "tracker-db-backup.h"
 
 #define TRACKER_DB_BACKUP_META_FILENAME_T	"meta-backup.db.tmp"
@@ -265,5 +267,78 @@ tracker_db_backup_save (TrackerDBBackupFinished callback,
 }
 
 
+void
+tracker_db_backup_sync_fts (void)
+{
+	TrackerProperty   **properties, **property;
+	TrackerDBInterface *iface;
+	TrackerDBStatement *stmt;
+	TrackerDBResultSet *result_set;
+	GValue              id   = { 0 };
+	GValue              text = { 0 };
+	TrackerClass       *prop_class;
+	gchar              *query;
+
+	iface = tracker_db_manager_get_db_interface ();
+
+	query = tracker_fts_get_drop_fts_table_query ();
+	tracker_db_interface_execute_query (iface, NULL, "%s", query);
+	g_free (query);
+
+	query = tracker_fts_get_create_fts_table_query ();
+	tracker_db_interface_execute_query (iface, NULL, "%s", query);
+	g_free (query);
+
+	properties = tracker_ontology_get_properties ();
+	for (property = properties; *property; property++) {
+		if (tracker_property_get_data_type (*property) == TRACKER_PROPERTY_TYPE_STRING &&
+		    tracker_property_get_fulltext_indexed (*property)) {
+
+			prop_class  = tracker_property_get_domain (*property);
+
+			if (tracker_property_get_multiple_values (*property)) {
+				query = g_strdup_printf ("SELECT ID, \"%s\" FROM \"%s_%s\"", 
+				                         tracker_property_get_name (*property), 
+				                         tracker_class_get_name (prop_class),
+				                         tracker_property_get_name (*property));
+			} else {
+				query = g_strdup_printf ("SELECT ID, \"%s\" FROM \"%s\" WHERE \"%s\" IS NOT NULL", 
+				                         tracker_property_get_name (*property), 
+				                         tracker_class_get_name (prop_class),
+				                         tracker_property_get_name (*property));
+			}
+
+			stmt = tracker_db_interface_create_statement (iface, "%s", query);
+			result_set = tracker_db_statement_execute (stmt, NULL);
+			g_object_unref (stmt);
+
+			if (result_set) {
+				do {
+					guint32 vid;
+
+					_tracker_db_result_set_get_value (result_set, 0, &id);
+					_tracker_db_result_set_get_value (result_set, 1, &text);
+
+					vid = (guint32) g_value_get_int (&id);
+
+					// TODO we need to retrieve all existing (FTS indexed) property values for
+					// this resource to properly support incremental FTS updates
+					// (like calling deleteTerms and then calling insertTerms)
+					tracker_fts_update_init (vid);
+					tracker_fts_update_text (vid, 0,  g_value_get_string (&text));
+
+					g_value_unset (&id);
+					g_value_unset (&text);
+
+				} while (tracker_db_result_set_iter_next (result_set));
+
+				g_object_unref (result_set);
+			}
+
+			g_free (query);
+		}
+	}
+	g_free (properties);
 
-
+	tracker_fts_update_commit ();
+}
diff --git a/src/libtracker-db/tracker-db-backup.h b/src/libtracker-db/tracker-db-backup.h
index 1769f96..c76a9d9 100644
--- a/src/libtracker-db/tracker-db-backup.h
+++ b/src/libtracker-db/tracker-db-backup.h
@@ -45,6 +45,7 @@ void      tracker_db_backup_save        (TrackerDBBackupFinished callback,
                                          GDestroyNotify destroy);
 GFile *   tracker_db_backup_file        (GFile **parent_out, 
                                          const gchar *type);
+void      tracker_db_backup_sync_fts    (void);
 
 G_END_DECLS
 
diff --git a/src/libtracker-db/tracker-db-manager.c b/src/libtracker-db/tracker-db-manager.c
index 32e078f..14d79e1 100644
--- a/src/libtracker-db/tracker-db-manager.c
+++ b/src/libtracker-db/tracker-db-manager.c
@@ -35,6 +35,7 @@
 #include <libtracker-common/tracker-type-utils.h>
 #include <libtracker-common/tracker-utils.h>
 
+#include "tracker-db-journal.h"
 #include "tracker-db-backup.h"
 #include "tracker-db-manager.h"
 #include "tracker-db-interface-sqlite.h"
@@ -888,6 +889,7 @@ db_manager_remove_all (gboolean rm_backup_and_log, gboolean not_meta)
 	if (rm_backup_and_log) {
 		GFile *file;
 		gchar *path;
+		const gchar *cpath;
 
 		file = tracker_db_backup_file (NULL, TRACKER_DB_BACKUP_META_FILENAME);
 		path = g_file_get_path (file);
@@ -896,10 +898,10 @@ db_manager_remove_all (gboolean rm_backup_and_log, gboolean not_meta)
 		g_free (path);
 		g_file_delete (file, NULL, NULL);
 		g_object_unref (file);
-		path = tracker_db_journal_filename ();
+		cpath = tracker_db_journal_filename ();
 		g_message ("  Removing database:'%s'",
-			   path);
-		file = g_file_new_for_path (path);
+			   cpath);
+		file = g_file_new_for_path (cpath);
 		g_file_delete (file, NULL, NULL);
 		g_object_unref (file);
 	}
@@ -1315,6 +1317,10 @@ tracker_db_manager_init (TrackerDBManagerFlags	flags,
 								    TRACKER_DB_COMMON);
 	}
 
+	if (did_copy) {
+		tracker_db_backup_sync_fts ();
+	}
+
 	return TRUE;
 }
 
diff --git a/src/tracker-fts/tracker-fts.c b/src/tracker-fts/tracker-fts.c
index 615f5ed..5e644ff 100644
--- a/src/tracker-fts/tracker-fts.c
+++ b/src/tracker-fts/tracker-fts.c
@@ -7839,3 +7839,37 @@ void tracker_fts_update_commit(void){
   fulltextCommit((sqlite3_vtab *) tracker_fts_vtab);
 }
 
+gchar *
+tracker_fts_get_drop_fts_table_query (void)
+{
+	return g_strdup ("DROP TABLE fulltext.fts");
+}
+
+gchar *
+tracker_fts_get_create_fts_table_query (void)
+{
+	GString    *sql;
+	TrackerProperty	  **properties, **property;
+	gboolean first;
+
+	sql = g_string_new ("CREATE VIRTUAL TABLE fulltext.fts USING trackerfts (");
+
+	first = TRUE;
+	properties = tracker_ontology_get_properties ();
+	for (property = properties; *property; property++) {
+		if (tracker_property_get_data_type (*property) == TRACKER_PROPERTY_TYPE_STRING &&
+		    tracker_property_get_fulltext_indexed (*property)) {
+			if (first) {
+				first = FALSE;
+			} else {
+				g_string_append (sql, ", ");
+			}
+			g_string_append_printf (sql, "\"%s\"", tracker_property_get_name (*property));
+		}
+	}
+	g_free (properties);
+
+	g_string_append (sql, ")");
+
+	return g_string_free (sql, FALSE);
+}
diff --git a/src/tracker-fts/tracker-fts.h b/src/tracker-fts/tracker-fts.h
index fe82309..3f953a9 100644
--- a/src/tracker-fts/tracker-fts.h
+++ b/src/tracker-fts/tracker-fts.h
@@ -26,6 +26,8 @@ int tracker_fts_init (sqlite3 *db);
 int tracker_fts_update_init (int id);
 int tracker_fts_update_text (int id, int column_id, const char *text);
 void tracker_fts_update_commit (void);
+gchar * tracker_fts_get_create_fts_table_query (void);
+gchar * tracker_fts_get_drop_fts_table_query (void);
 
 G_END_DECLS
 



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