diff options
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); |