[tracker] Synchronize fts after restore from backup
- From: Philip Van Hoof <pvanhoof src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [tracker] Synchronize fts after restore from backup
- Date: Tue, 25 Aug 2009 14:50:37 +0000 (UTC)
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]