summaryrefslogtreecommitdiff
path: root/src/libtracker-sparql
diff options
context:
space:
mode:
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);