diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2019-07-10 00:08:04 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2019-09-10 00:22:58 +0200 |
commit | b0727bd8226cd388f4deff43587941bb2240065e (patch) | |
tree | 01f365b7fd3f0928030cdafc7db2742cd60dbe4b /src | |
parent | 980c039bb104e592f6db2f9a6028751c73df0771 (diff) | |
download | tracker-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.c | 40 | ||||
-rw-r--r-- | src/libtracker-fts/tracker-fts.c | 10 |
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); |