diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2020-12-01 03:05:53 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2020-12-01 13:09:45 +0100 |
commit | 1f0b3618e31194836e923667fe476c3c356359bf (patch) | |
tree | a6ee9d1784028840a3c1eaefa99f286e48d9251c | |
parent | 4c95590eb9fc1ea2690203043f18cb90847b9c3b (diff) | |
download | tracker-wip/carlosg/insert-perf.tar.gz |
libtracker-data: Avoid varargs function where possiblewip/carlosg/insert-perf
We let tracker_db_interface_create_statement() take varargs, even
though most often we have full SQL queries to give. Add a separate
tracker_db_interface_create_vstatement() function taking varargs,
and let this function go with the given SQL string as is.
This avoids needless string copies in fast paths, like executing a
TrackerSparqlStatement.
-rw-r--r-- | src/libtracker-data/tracker-data-manager.c | 58 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-query.c | 10 | ||||
-rw-r--r-- | src/libtracker-data/tracker-data-update.c | 62 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-interface-sqlite.c | 45 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-interface.h | 6 | ||||
-rw-r--r-- | src/libtracker-data/tracker-db-manager.c | 12 | ||||
-rw-r--r-- | src/libtracker-data/tracker-sparql.c | 2 | ||||
-rw-r--r-- | src/tracker/tracker-export.c | 2 | ||||
-rw-r--r-- | src/tracker/tracker-sql.c | 2 |
9 files changed, 109 insertions, 90 deletions
diff --git a/src/libtracker-data/tracker-data-manager.c b/src/libtracker-data/tracker-data-manager.c index 8cdf70827..4a2bee58d 100644 --- a/src/libtracker-data/tracker-data-manager.c +++ b/src/libtracker-data/tracker-data-manager.c @@ -3332,9 +3332,9 @@ query_table_exists (TrackerDBInterface *iface, TrackerDBStatement *stmt; gboolean exists = FALSE; - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, error, - "SELECT 1 FROM sqlite_master WHERE tbl_name=\"%s\" AND type=\"table\"", - table_name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, error, + "SELECT 1 FROM sqlite_master WHERE tbl_name=\"%s\" AND type=\"table\"", + table_name); if (stmt) { cursor = tracker_db_statement_start_cursor (stmt, error); g_object_unref (stmt); @@ -4624,7 +4624,7 @@ data_manager_perform_cleanup (TrackerDataManager *manager, stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &internal_error, - "%s", str->str); + str->str); g_string_free (str, TRUE); if (!stmt) @@ -4919,10 +4919,10 @@ tracker_data_manager_clear_graph (TrackerDataManager *manager, if (g_str_has_prefix (tracker_class_get_name (classes[i]), "xsd:")) continue; - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, - "DELETE FROM \"%s\".\"%s\"", - graph, - tracker_class_get_name (classes[i])); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, + "DELETE FROM \"%s\".\"%s\"", + graph, + tracker_class_get_name (classes[i])); if (!stmt) break; @@ -4937,11 +4937,11 @@ tracker_data_manager_clear_graph (TrackerDataManager *manager, continue; service = tracker_property_get_domain (properties[i]); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, - "DELETE FROM \"%s\".\"%s_%s\"", - graph, - tracker_class_get_name (service), - tracker_property_get_name (properties[i])); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, + "DELETE FROM \"%s\".\"%s_%s\"", + graph, + tracker_class_get_name (service), + tracker_property_get_name (properties[i])); if (!stmt) break; @@ -4987,13 +4987,13 @@ tracker_data_manager_copy_graph (TrackerDataManager *manager, if (g_str_has_prefix (tracker_class_get_name (classes[i]), "xsd:")) continue; - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, - "INSERT OR REPLACE INTO \"%s\".\"%s\" " - "SELECT * from \"%s\".\"%s\"", - destination, - tracker_class_get_name (classes[i]), - source, - tracker_class_get_name (classes[i])); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, + "INSERT OR REPLACE INTO \"%s\".\"%s\" " + "SELECT * from \"%s\".\"%s\"", + destination, + tracker_class_get_name (classes[i]), + source, + tracker_class_get_name (classes[i])); if (!stmt) break; @@ -5008,15 +5008,15 @@ tracker_data_manager_copy_graph (TrackerDataManager *manager, continue; service = tracker_property_get_domain (properties[i]); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, - "INSERT OR REPLACE INTO \"%s\".\"%s_%s\" " - "SELECT * from \"%s\".\"%s_%s\"", - destination, - tracker_class_get_name (service), - tracker_property_get_name (properties[i]), - source, - tracker_class_get_name (service), - tracker_property_get_name (properties[i])); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, + "INSERT OR REPLACE INTO \"%s\".\"%s_%s\" " + "SELECT * from \"%s\".\"%s_%s\"", + destination, + tracker_class_get_name (service), + tracker_property_get_name (properties[i]), + source, + tracker_class_get_name (service), + tracker_property_get_name (properties[i])); if (!stmt) break; diff --git a/src/libtracker-data/tracker-data-query.c b/src/libtracker-data/tracker-data-query.c index ddde295e8..7ff062f58 100644 --- a/src/libtracker-data/tracker-data-query.c +++ b/src/libtracker-data/tracker-data-query.c @@ -48,11 +48,11 @@ tracker_data_query_rdf_type (TrackerDataManager *manager, iface = tracker_data_manager_get_writable_db_interface (manager); ontologies = tracker_data_manager_get_ontologies (manager); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, - "SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") " - "FROM \"%s\".\"rdfs:Resource_rdf:type\" " - "WHERE ID = ?", - graph ? graph : "main"); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, + "SELECT (SELECT Uri FROM Resource WHERE ID = \"rdf:type\") " + "FROM \"%s\".\"rdfs:Resource_rdf:type\" " + "WHERE ID = ?", + graph ? graph : "main"); if (stmt) { tracker_db_statement_bind_int (stmt, 0, id); diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c index 43bd786ca..e97006631 100644 --- a/src/libtracker-data/tracker-data-update.c +++ b/src/libtracker-data/tracker-data-update.c @@ -841,23 +841,23 @@ tracker_data_resource_buffer_flush (TrackerData *data, property = &g_array_index (table->properties, TrackerDataUpdateBufferProperty, i); if (table->delete_value && property->delete_all_values) { - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "DELETE FROM \"%s\".\"%s\" WHERE ID = ?", - database, - table_name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "DELETE FROM \"%s\".\"%s\" WHERE ID = ?", + database, + table_name); } else if (table->delete_value) { /* delete rows for multiple value properties */ - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "DELETE FROM \"%s\".\"%s\" WHERE ID = ? AND \"%s\" = ?", - database, - table_name, - property->name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "DELETE FROM \"%s\".\"%s\" WHERE ID = ? AND \"%s\" = ?", + database, + table_name, + property->name); } else { - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "INSERT OR IGNORE INTO \"%s\".\"%s\" (ID, \"%s\") VALUES (?, ?)", - database, - table_name, - property->name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "INSERT OR IGNORE INTO \"%s\".\"%s\" (ID, \"%s\") VALUES (?, ?)", + database, + table_name, + property->name); } if (actual_error) { @@ -885,9 +885,9 @@ tracker_data_resource_buffer_flush (TrackerData *data, if (table->delete_row) { /* remove entry from rdf:type table */ - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "DELETE FROM \"%s\".\"rdfs:Resource_rdf:type\" WHERE ID = ? AND \"rdf:type\" = ?", - database); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "DELETE FROM \"%s\".\"rdfs:Resource_rdf:type\" WHERE ID = ? AND \"rdf:type\" = ?", + database); if (stmt) { tracker_db_statement_bind_int (stmt, 0, resource->id); @@ -902,9 +902,9 @@ tracker_data_resource_buffer_flush (TrackerData *data, } /* remove row from class table */ - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "DELETE FROM \"%s\".\"%s\" WHERE ID = ?", - database, table_name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "DELETE FROM \"%s\".\"%s\" WHERE ID = ?", + database, table_name); if (stmt) { tracker_db_statement_bind_int (stmt, 0, resource->id); @@ -959,15 +959,15 @@ tracker_data_resource_buffer_flush (TrackerData *data, g_string_append (sql, ")"); g_string_append (values_sql, ")"); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "%s %s", sql->str, values_sql->str); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, + "%s %s", sql->str, values_sql->str); g_string_free (sql, TRUE); g_string_free (values_sql, TRUE); } else { g_string_append (sql, " WHERE ID = ?"); stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &actual_error, - "%s", sql->str); + sql->str); g_string_free (sql, TRUE); } @@ -1349,9 +1349,9 @@ get_property_values (TrackerData *data, iface = tracker_data_manager_get_writable_db_interface (data->manager); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, - "SELECT \"%s\" FROM \"%s\".\"%s\" WHERE ID = ?", - field_name, database, table_name); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, + "SELECT \"%s\" FROM \"%s\".\"%s\" WHERE ID = ?", + field_name, database, table_name); if (stmt) { tracker_db_statement_bind_int (stmt, 0, data->resource_buffer->id); @@ -1931,11 +1931,11 @@ cache_delete_resource_type_full (TrackerData *data, /* retrieve all subclasses we need to remove from the subject * before we can remove the class specified as object of the statement */ - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, - "SELECT (SELECT Uri FROM Resource WHERE ID = subclass.ID) " - "FROM \"%s\".\"rdfs:Resource_rdf:type\" AS type INNER JOIN \"%s\".\"rdfs:Class_rdfs:subClassOf\" AS subclass ON (type.\"rdf:type\" = subclass.ID) " - "WHERE type.ID = ? AND subclass.\"rdfs:subClassOf\" = (SELECT ID FROM Resource WHERE Uri = ?)", - database, database); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT, &error, + "SELECT (SELECT Uri FROM Resource WHERE ID = subclass.ID) " + "FROM \"%s\".\"rdfs:Resource_rdf:type\" AS type INNER JOIN \"%s\".\"rdfs:Class_rdfs:subClassOf\" AS subclass ON (type.\"rdf:type\" = subclass.ID) " + "WHERE type.ID = ? AND subclass.\"rdfs:subClassOf\" = (SELECT ID FROM Resource WHERE Uri = ?)", + database, database); if (stmt) { tracker_db_statement_bind_int (stmt, 0, data->resource_buffer->id); diff --git a/src/libtracker-data/tracker-db-interface-sqlite.c b/src/libtracker-data/tracker-db-interface-sqlite.c index 0fd28c066..260b81d87 100644 --- a/src/libtracker-data/tracker-db-interface-sqlite.c +++ b/src/libtracker-data/tracker-db-interface-sqlite.c @@ -2341,7 +2341,7 @@ tracker_db_interface_sqlite_fts_update_text (TrackerDBInterface *db_interface, stmt = tracker_db_interface_create_statement (db_interface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &error, - "%s", query); + query); g_free (query); if (!stmt || error) { @@ -2395,7 +2395,7 @@ tracker_db_interface_sqlite_fts_delete_text (TrackerDBInterface *db_interface, stmt = tracker_db_interface_create_statement (db_interface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &error, - "%s", query); + query); g_free (query); if (!stmt || error) { @@ -2434,7 +2434,7 @@ tracker_db_interface_sqlite_fts_delete_id (TrackerDBInterface *db_interface, stmt = tracker_db_interface_create_statement (db_interface, TRACKER_DB_STATEMENT_CACHE_TYPE_UPDATE, &error, - "%s", query); + query); g_free (query); if (!stmt || error) { @@ -2785,35 +2785,27 @@ TrackerDBStatement * tracker_db_interface_create_statement (TrackerDBInterface *db_interface, TrackerDBStatementCacheType cache_type, GError **error, - const gchar *query, - ...) + const gchar *query) { TrackerDBStatement *stmt = NULL; - va_list args; - gchar *full_query; g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (db_interface), NULL); - va_start (args, query); - full_query = g_strdup_vprintf (query, args); - va_end (args); - tracker_db_interface_lock (db_interface); if (cache_type != TRACKER_DB_STATEMENT_CACHE_TYPE_NONE) { stmt = tracker_db_interface_lru_lookup (db_interface, &cache_type, - full_query); + query); } if (!stmt) { sqlite3_stmt *sqlite_stmt; sqlite_stmt = tracker_db_interface_prepare_stmt (db_interface, - full_query, + query, error); if (!sqlite_stmt) { tracker_db_interface_unlock (db_interface); - g_free (full_query); return NULL; } @@ -2831,13 +2823,36 @@ tracker_db_interface_create_statement (TrackerDBInterface *db_interfac } stmt->stmt_is_owned = TRUE; - g_free (full_query); tracker_db_interface_unlock (db_interface); return g_object_ref_sink (stmt); } +TrackerDBStatement * +tracker_db_interface_create_vstatement (TrackerDBInterface *db_interface, + TrackerDBStatementCacheType cache_type, + GError **error, + const gchar *query, + ...) +{ + TrackerDBStatement *stmt; + va_list args; + gchar *full_query; + + g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (db_interface), NULL); + + va_start (args, query); + full_query = g_strdup_vprintf (query, args); + va_end (args); + + stmt = tracker_db_interface_create_statement (db_interface, cache_type, + error, full_query); + g_free (full_query); + + return stmt; +} + static gboolean execute_stmt (TrackerDBInterface *interface, sqlite3_stmt *stmt, diff --git a/src/libtracker-data/tracker-db-interface.h b/src/libtracker-data/tracker-db-interface.h index f415cdeca..07f370139 100644 --- a/src/libtracker-data/tracker-db-interface.h +++ b/src/libtracker-data/tracker-db-interface.h @@ -98,7 +98,11 @@ void tracker_db_interface_set_user_data (TrackerDBI gpointer tracker_db_interface_get_user_data (TrackerDBInterface *interface); /* Functions to create queries/procedures */ -TrackerDBStatement * tracker_db_interface_create_statement (TrackerDBInterface *interface, +TrackerDBStatement * tracker_db_interface_create_statement (TrackerDBInterface *db_interface, + TrackerDBStatementCacheType cache_type, + GError **error, + const gchar *query); +TrackerDBStatement * tracker_db_interface_create_vstatement (TrackerDBInterface *interface, TrackerDBStatementCacheType cache_type, GError **error, const gchar *query, diff --git a/src/libtracker-data/tracker-db-manager.c b/src/libtracker-data/tracker-db-manager.c index 5e98337de..9f4e89101 100644 --- a/src/libtracker-data/tracker-db-manager.c +++ b/src/libtracker-data/tracker-db-manager.c @@ -198,9 +198,9 @@ db_set_params (TrackerDBInterface *iface, tracker_db_interface_execute_query (iface, NULL, "PRAGMA \"%s\".auto_vacuum = 0", database); if (enable_wal) { - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, - &internal_error, - "PRAGMA \"%s\".journal_mode = WAL", database); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, + &internal_error, + "PRAGMA \"%s\".journal_mode = WAL", database); if (internal_error) { g_info ("Can't set journal mode to WAL: '%s'", @@ -324,9 +324,9 @@ tracker_db_manager_update_version (TrackerDBManager *db_manager) GError *error = NULL; iface = tracker_db_manager_get_writable_db_interface (db_manager); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, - &error, "PRAGMA user_version = %d", - TRACKER_DB_VERSION_NOW); + stmt = tracker_db_interface_create_vstatement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, + &error, "PRAGMA user_version = %d", + TRACKER_DB_VERSION_NOW); if (stmt) { tracker_db_statement_execute (stmt, &error); g_object_unref (stmt); diff --git a/src/libtracker-data/tracker-sparql.c b/src/libtracker-data/tracker-sparql.c index 6dd0307bf..42bed5907 100644 --- a/src/libtracker-data/tracker-sparql.c +++ b/src/libtracker-data/tracker-sparql.c @@ -9349,7 +9349,7 @@ prepare_query (TrackerSparql *sparql, cached ? TRACKER_DB_STATEMENT_CACHE_TYPE_SELECT : TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, - error, "%s", sparql->sql_string); + error, sparql->sql_string); if (!stmt || !literals) return stmt; diff --git a/src/tracker/tracker-export.c b/src/tracker/tracker-export.c index 900fc411b..ead5de036 100644 --- a/src/tracker/tracker-export.c +++ b/src/tracker/tracker-export.c @@ -406,7 +406,7 @@ export_2to3_with_query (const gchar *query, stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &inner_error, - "%s", query); + query); if (!stmt) { g_propagate_prefixed_error (error, inner_error, "%s: ", _("Could not run query")); diff --git a/src/tracker/tracker-sql.c b/src/tracker/tracker-sql.c index 493e09f33..6803813d0 100644 --- a/src/tracker/tracker-sql.c +++ b/src/tracker/tracker-sql.c @@ -124,7 +124,7 @@ sql_by_query (void) iface = tracker_data_manager_get_db_interface (data_manager); - stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &error, "%s", query); + stmt = tracker_db_interface_create_statement (iface, TRACKER_DB_STATEMENT_CACHE_TYPE_NONE, &error, query); if (stmt) { cursor = tracker_db_statement_start_cursor (stmt, &error); |