summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2019-07-10 00:08:04 +0200
committerCarlos Garnacho <carlosg@gnome.org>2019-09-10 00:22:58 +0200
commitb0727bd8226cd388f4deff43587941bb2240065e (patch)
tree01f365b7fd3f0928030cdafc7db2742cd60dbe4b /src
parent980c039bb104e592f6db2f9a6028751c73df0771 (diff)
downloadtracker-b0727bd8226cd388f4deff43587941bb2240065e.tar.gz
libtracker-data: Add FTS5 union view
This works similarly to other union views, except we need to export the relevant function right away from the view query, since we can't do that on the outside. There's still the question about what to do with fts:snippet though, since that takes additional arguments.
Diffstat (limited to 'src')
-rw-r--r--src/libtracker-data/tracker-data-manager.c40
-rw-r--r--src/libtracker-fts/tracker-fts.c10
2 files changed, 43 insertions, 7 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c
index 1ef5e92b2..0f01c2c7c 100644
--- a/src/libtracker-data/tracker-data-manager.c
+++ b/src/libtracker-data/tracker-data-manager.c
@@ -3901,7 +3901,7 @@ tracker_data_manager_update_union_views (TrackerDataManager *manager,
"DROP VIEW IF EXISTS temp.\"unionGraph_%s\"",
tracker_class_get_name (classes[i]));
if (!stmt)
- break;
+ goto error;
tracker_db_statement_execute (stmt, NULL);
g_object_unref (stmt);
@@ -3925,7 +3925,7 @@ tracker_data_manager_update_union_views (TrackerDataManager *manager,
"%s", str->str);
g_string_free (str, TRUE);
if (!stmt)
- break;
+ goto error;
tracker_db_statement_execute (stmt, &inner_error);
g_object_unref (stmt);
@@ -3943,7 +3943,7 @@ tracker_data_manager_update_union_views (TrackerDataManager *manager,
tracker_class_get_name (service),
tracker_property_get_name (properties[i]));
if (!stmt)
- break;
+ goto error;
tracker_db_statement_execute (stmt, NULL);
g_object_unref (stmt);
@@ -3971,12 +3971,44 @@ tracker_data_manager_update_union_views (TrackerDataManager *manager,
g_string_free (str, TRUE);
if (!stmt)
- break;
+ goto error;
tracker_db_statement_execute (stmt, &inner_error);
g_object_unref (stmt);
}
+ /* Update FTS5 union view */
+ stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error,
+ "DROP VIEW IF EXISTS temp.\"unionGraph_fts5\"");
+ if (!stmt)
+ goto error;
+
+ tracker_db_statement_execute (stmt, NULL);
+ g_object_unref (stmt);
+
+ str = g_string_new (NULL);
+ g_string_append (str,
+ "CREATE VIEW temp.\"unionGraph_fts5\" AS "
+ "SELECT 0 AS graph, ROWID, *, fts5, rank, tracker_offsets(fts5) AS offsets FROM \"main\".\"fts5\" ");
+
+ g_hash_table_iter_init (&iter, graphs);
+ while (g_hash_table_iter_next (&iter, &graph_name, &graph_id)) {
+ g_string_append_printf (str, "UNION ALL SELECT %d AS graph, ROWID, *, fts5, rank, tracker_offsets(fts5) AS offsets FROM \"%s\".\"fts5\" ",
+ GPOINTER_TO_INT (graph_id),
+ (gchar *) graph_name);
+ }
+
+ stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error,
+ "%s", str->str);
+ g_string_free (str, TRUE);
+
+ if (!stmt)
+ goto error;
+
+ tracker_db_statement_execute (stmt, &inner_error);
+ g_object_unref (stmt);
+
+error:
if (inner_error) {
g_propagate_error (error, inner_error);
return FALSE;
diff --git a/src/libtracker-fts/tracker-fts.c b/src/libtracker-fts/tracker-fts.c
index 49ba4d362..19db53987 100644
--- a/src/libtracker-fts/tracker-fts.c
+++ b/src/libtracker-fts/tracker-fts.c
@@ -164,9 +164,13 @@ tracker_fts_delete_table (sqlite3 *db,
gchar *query;
int rc;
- query = g_strdup_printf ("DROP VIEW fts_view");
- rc = sqlite3_exec (db, query, NULL, NULL, NULL);
- g_free (query);
+ rc = sqlite3_exec (db, "DROP VIEW IF EXISTS unionGraph_fts5", NULL, NULL, NULL);
+
+ if (rc == SQLITE_OK) {
+ query = g_strdup_printf ("DROP VIEW fts_view");
+ rc = sqlite3_exec (db, query, NULL, NULL, NULL);
+ g_free (query);
+ }
if (rc == SQLITE_OK) {
query = g_strdup_printf ("DROP TABLE %s", table_name);