summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2023-01-22 15:54:39 +0100
committerCarlos Garnacho <carlosg@gnome.org>2023-01-23 15:50:06 +0100
commitbe4c9bdb65b97be1ccc3ffabb9d1b53f8882366e (patch)
treebe766c9a059aff4987272c5ca1daa250d65a498b /src/libtracker-sparql
parenteb75f65bc2c4611e5a7c97c584f39f5ea0757788 (diff)
downloadtracker-be4c9bdb65b97be1ccc3ffabb9d1b53f8882366e.tar.gz
core: Cache FTS delete/insert statements directly
The one piece of good news from having to do full-row FTS insert/delete in the case of updates to FTS properties is that these queries are now directly cacheable, instead of going through the TrackerDBInterface LRUs. Keep TrackerDBSstatements around for these, so that they can be executed many times and ensured to be compiled exactly once.
Diffstat (limited to 'src/libtracker-sparql')
-rw-r--r--src/libtracker-sparql/core/tracker-data-update.c81
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface-sqlite.c54
-rw-r--r--src/libtracker-sparql/core/tracker-db-interface-sqlite.h20
3 files changed, 76 insertions, 79 deletions
diff --git a/src/libtracker-sparql/core/tracker-data-update.c b/src/libtracker-sparql/core/tracker-data-update.c
index 046b4abe5..1a3789cc4 100644
--- a/src/libtracker-sparql/core/tracker-data-update.c
+++ b/src/libtracker-sparql/core/tracker-data-update.c
@@ -124,6 +124,8 @@ struct _TrackerDataUpdateBufferGraph {
TrackerDBStatement *update_ref;
TrackerDBStatement *delete_ref;
TrackerDBStatement *query_rdf_types;
+ TrackerDBStatement *fts_delete;
+ TrackerDBStatement *fts_insert;
TrackerDBStatementMru values_mru;
};
@@ -1489,6 +1491,8 @@ graph_buffer_free (TrackerDataUpdateBufferGraph *graph)
g_clear_object (&graph->update_ref);
g_clear_object (&graph->delete_ref);
g_clear_object (&graph->query_rdf_types);
+ g_clear_object (&graph->fts_delete);
+ g_clear_object (&graph->fts_insert);
g_hash_table_unref (graph->resources);
g_array_unref (graph->refcounts);
g_free (graph->graph);
@@ -1529,43 +1533,70 @@ get_fts_properties (TrackerData *data)
return result;
}
+static gboolean
+tracker_data_ensure_graph_fts_stmts (TrackerData *data,
+ TrackerDataUpdateBufferGraph *graph,
+ GError **error)
+{
+ TrackerDBInterface *iface;
+ const gchar *database;
+ GPtrArray *properties;
+
+ if (G_LIKELY (graph->fts_insert && graph->fts_delete))
+ return TRUE;
+
+ database = graph->graph ? graph->graph : "main";
+ iface = tracker_data_manager_get_writable_db_interface (data->manager);
+ properties = get_fts_properties (data);
+
+ if (!graph->fts_delete) {
+ graph->fts_delete =
+ tracker_db_interface_sqlite_fts_delete_text_stmt (iface,
+ database,
+ (const gchar **) properties->pdata,
+ error);
+ }
+
+ if (graph->fts_delete && !graph->fts_insert) {
+ graph->fts_insert =
+ tracker_db_interface_sqlite_fts_insert_text_stmt (iface,
+ database,
+ (const gchar **) properties->pdata,
+ error);
+ }
+
+ g_ptr_array_free (properties, TRUE);
+
+ return graph->fts_insert && graph->fts_delete;
+}
+
void
tracker_data_update_buffer_flush (TrackerData *data,
GError **error)
{
TrackerDataUpdateBufferGraph *graph;
TrackerDataUpdateBufferResource *resource;
- TrackerDBInterface *iface;
GHashTableIter iter;
GError *actual_error = NULL;
- const gchar *database;
guint i;
if (data->update_buffer.update_log->len == 0)
return;
- iface = tracker_data_manager_get_writable_db_interface (data->manager);
-
for (i = 0; i < data->update_buffer.graphs->len; i++) {
graph = g_ptr_array_index (data->update_buffer.graphs, i);
g_hash_table_iter_init (&iter, graph->resources);
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
if (resource->fts_update && !resource->create) {
- GPtrArray *properties;
- gboolean retval;
-
- database = resource->graph->graph ? resource->graph->graph : "main";
- properties = get_fts_properties (data);
+ if (!tracker_data_ensure_graph_fts_stmts (data,
+ graph,
+ error))
+ goto out;
- retval = tracker_db_interface_sqlite_fts_delete_text (iface,
- database,
- resource->id,
- (const gchar **) properties->pdata,
- error);
- g_ptr_array_free (properties, TRUE);
+ tracker_db_statement_bind_int (graph->fts_delete, 0, resource->id);
- if (!retval)
+ if (!tracker_db_statement_execute (graph->fts_delete, error))
goto out;
}
}
@@ -1580,20 +1611,14 @@ tracker_data_update_buffer_flush (TrackerData *data,
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &resource)) {
if (resource->fts_update) {
- GPtrArray *properties;
- gboolean retval;
-
- database = resource->graph->graph ? resource->graph->graph : "main";
- properties = get_fts_properties (data);
+ if (!tracker_data_ensure_graph_fts_stmts (data,
+ graph,
+ error))
+ goto out;
- retval = tracker_db_interface_sqlite_fts_update_text (iface,
- database,
- resource->id,
- (const gchar **) properties->pdata,
- error);
- g_ptr_array_free (properties, TRUE);
+ tracker_db_statement_bind_int (graph->fts_insert, 0, resource->id);
- if (!retval)
+ if (!tracker_db_statement_execute (graph->fts_insert, error))
goto out;
}
}
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
index 580775e19..385b59f4f 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.c
@@ -2307,15 +2307,13 @@ tracker_db_interface_sqlite_fts_create_update_query (TrackerDBInterface *db_int
return query;
}
-gboolean
-tracker_db_interface_sqlite_fts_update_text (TrackerDBInterface *db_interface,
- const gchar *database,
- TrackerRowid id,
- const gchar **properties,
- GError **error)
+TrackerDBStatement *
+tracker_db_interface_sqlite_fts_insert_text_stmt (TrackerDBInterface *db_interface,
+ const gchar *database,
+ const gchar **properties,
+ GError **error)
{
TrackerDBStatement *stmt;
- GError *inner_error = NULL;
gchar *query;
query = tracker_db_interface_sqlite_fts_create_update_query (db_interface,
@@ -2327,19 +2325,7 @@ tracker_db_interface_sqlite_fts_update_text (TrackerDBInterface *db_interface,
query);
g_free (query);
- if (!stmt)
- return FALSE;
-
- tracker_db_statement_bind_int (stmt, 0, id);
- tracker_db_statement_execute (stmt, &inner_error);
- g_object_unref (stmt);
-
- if (inner_error) {
- g_propagate_prefixed_error (error, inner_error, "Could not insert FTS text: ");
- return FALSE;
- }
-
- return TRUE;
+ return stmt;
}
static gchar *
@@ -2371,39 +2357,25 @@ tracker_db_interface_sqlite_fts_create_delete_query (TrackerDBInterface *db_int
return query;
}
-gboolean
-tracker_db_interface_sqlite_fts_delete_text (TrackerDBInterface *db_interface,
- const gchar *database,
- TrackerRowid rowid,
- const gchar **properties,
- GError **error)
+TrackerDBStatement *
+tracker_db_interface_sqlite_fts_delete_text_stmt (TrackerDBInterface *db_interface,
+ const gchar *database,
+ const gchar **properties,
+ GError **error)
{
TrackerDBStatement *stmt;
- GError *inner_error = NULL;
gchar *query;
query = tracker_db_interface_sqlite_fts_create_delete_query (db_interface,
database,
properties);
stmt = tracker_db_interface_create_statement (db_interface,
- TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE,
+ TRACKER_DB_STATEMENT_CACHE_TYPE_NONE,
error,
query);
g_free (query);
- if (!stmt)
- return FALSE;
-
- tracker_db_statement_bind_int (stmt, 0, rowid);
- tracker_db_statement_execute (stmt, &inner_error);
- g_object_unref (stmt);
-
- if (inner_error) {
- g_propagate_prefixed_error (error, inner_error, "Could not delete FTS text: ");
- return FALSE;
- }
-
- return TRUE;
+ return stmt;
}
gboolean
diff --git a/src/libtracker-sparql/core/tracker-db-interface-sqlite.h b/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
index 265919045..9848df6e9 100644
--- a/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
+++ b/src/libtracker-sparql/core/tracker-db-interface-sqlite.h
@@ -67,17 +67,17 @@ gboolean tracker_db_interface_sqlite_fts_alter_table (TrackerD
GHashTable *properties,
GHashTable *multivalued,
GError **error);
-gboolean tracker_db_interface_sqlite_fts_update_text (TrackerDBInterface *db_interface,
- const gchar *database,
- TrackerRowid id,
- const gchar **properties,
- GError **error);
-gboolean tracker_db_interface_sqlite_fts_delete_text (TrackerDBInterface *interface,
- const gchar *database,
- TrackerRowid rowid,
- const gchar **properties,
- GError **error);
+TrackerDBStatement * tracker_db_interface_sqlite_fts_insert_text_stmt (TrackerDBInterface *db_interface,
+ const gchar *database,
+ const gchar **properties,
+ GError **error);
+
+TrackerDBStatement * tracker_db_interface_sqlite_fts_delete_text_stmt (TrackerDBInterface *db_interface,
+ const gchar *database,
+ const gchar **properties,
+ GError **error);
+
gboolean tracker_db_interface_sqlite_fts_rebuild_tokens (TrackerDBInterface *interface,
const gchar *database,
GError **error);