summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2020-12-01 03:05:53 +0100
committerCarlos Garnacho <carlosg@gnome.org>2020-12-01 13:09:45 +0100
commit1f0b3618e31194836e923667fe476c3c356359bf (patch)
treea6ee9d1784028840a3c1eaefa99f286e48d9251c
parent4c95590eb9fc1ea2690203043f18cb90847b9c3b (diff)
downloadtracker-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.c58
-rw-r--r--src/libtracker-data/tracker-data-query.c10
-rw-r--r--src/libtracker-data/tracker-data-update.c62
-rw-r--r--src/libtracker-data/tracker-db-interface-sqlite.c45
-rw-r--r--src/libtracker-data/tracker-db-interface.h6
-rw-r--r--src/libtracker-data/tracker-db-manager.c12
-rw-r--r--src/libtracker-data/tracker-sparql.c2
-rw-r--r--src/tracker/tracker-export.c2
-rw-r--r--src/tracker/tracker-sql.c2
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);