diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2023-01-22 15:54:39 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2023-01-23 15:50:06 +0100 |
commit | be4c9bdb65b97be1ccc3ffabb9d1b53f8882366e (patch) | |
tree | be766c9a059aff4987272c5ca1daa250d65a498b /src/libtracker-sparql | |
parent | eb75f65bc2c4611e5a7c97c584f39f5ea0757788 (diff) | |
download | tracker-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.c | 81 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-db-interface-sqlite.c | 54 | ||||
-rw-r--r-- | src/libtracker-sparql/core/tracker-db-interface-sqlite.h | 20 |
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); |