[tracker/tracker-0.6] Fixes indexer warnings closing contexts inserting with collated data
- From: Martyn James Russell <mr src gnome org>
- To: svn-commits-list gnome org
- Subject: [tracker/tracker-0.6] Fixes indexer warnings closing contexts inserting with collated data
- Date: Mon, 25 May 2009 09:24:16 -0400 (EDT)
commit 9527d83fba221cbfc844b447acb621595175bc2e
Author: Martyn Russell <martyn imendio com>
Date: Mon May 25 12:16:16 2009 +0100
Fixes indexer warnings closing contexts inserting with collated data
This fixes warnings in the indexer like:
Couldn't close TrackerDataUpdateMetadataContext, unrecognized token:
"^A"
Which were seen because we were using g_utf8_collate() and then
putting the value in the INSERT. That was breaking on soem occasions.
---
src/libtracker-common/tracker-utils.c | 33 ++++++++---
src/libtracker-common/tracker-utils.h | 3 +-
src/libtracker-data/tracker-data-update.c | 87 +++++++++++++++++++----------
src/libtracker-data/tracker-data-update.h | 11 ++--
src/libtracker-data/tracker-rdf-query.c | 29 ++--------
src/libtracker-db/tracker-db-manager.c | 26 +++++----
6 files changed, 108 insertions(+), 81 deletions(-)
diff --git a/src/libtracker-common/tracker-utils.c b/src/libtracker-common/tracker-utils.c
index aa36ecc..1ac52ee 100644
--- a/src/libtracker-common/tracker-utils.c
+++ b/src/libtracker-common/tracker-utils.c
@@ -103,24 +103,37 @@ tracker_string_replace (const gchar *haystack,
}
gchar *
-tracker_escape_string (const gchar *in)
+tracker_escape_db_string (const gchar *str,
+ gboolean add_quotes)
{
- gchar **array, *out;
+ GStrv strv;
+ gchar *escaped;
- if (!in) {
+ if (!str) {
return NULL;
}
- if (!strchr (in, '\'')) {
- return g_strdup (in);
+ if (!g_utf8_strchr (str, -1, '\'')) {
+ if (G_LIKELY (add_quotes)) {
+ return g_strdup_printf ("'%s'", str);
+ } else {
+ return g_strdup (str);
+ }
}
- /* double single quotes */
- array = g_strsplit (in, "'", -1);
- out = g_strjoinv ("''", array);
- g_strfreev (array);
+ strv = g_strsplit (str, "'", -1);
+ escaped = g_strjoinv ("''", strv);
+ g_strfreev (strv);
+
+ if (G_LIKELY (add_quotes)) {
+ gchar *p;
+
+ p = escaped;
+ escaped = g_strdup_printf ("'%s'", escaped);
+ g_free (p);
+ }
- return out;
+ return escaped;
}
gchar *
diff --git a/src/libtracker-common/tracker-utils.h b/src/libtracker-common/tracker-utils.h
index 51f2bf4..48ef635 100644
--- a/src/libtracker-common/tracker-utils.h
+++ b/src/libtracker-common/tracker-utils.h
@@ -35,7 +35,8 @@ gchar * tracker_string_replace (const gchar *haystack,
const gchar *replacement);
gchar * tracker_string_remove (gchar *haystack,
const gchar *needle);
-gchar * tracker_escape_string (const gchar *in);
+gchar * tracker_escape_db_string (const gchar *str,
+ gboolean add_quotes);
gchar * tracker_seconds_estimate_to_string (gdouble seconds_elapsed,
gboolean short_string,
guint items_done,
diff --git a/src/libtracker-data/tracker-data-update.c b/src/libtracker-data/tracker-data-update.c
index c25fa04..2c4cbe3 100644
--- a/src/libtracker-data/tracker-data-update.c
+++ b/src/libtracker-data/tracker-data-update.c
@@ -150,20 +150,33 @@ tracker_data_update_create_service (TrackerDataUpdateMetadataContext *context,
is_symlink = g_file_test (path, G_FILE_TEST_IS_SYMLINK);
/* Add data to the context */
- tracker_data_update_metadata_context_add (context, "Path", dirname);
- tracker_data_update_metadata_context_add (context, "Name", basename);
- tracker_data_update_metadata_context_add (context, "ServiceTypeID", service_type_id_str);
+ tracker_data_update_metadata_context_add (context, "Path",
+ dirname,
+ NULL);
+ tracker_data_update_metadata_context_add (context, "Name",
+ basename,
+ NULL);
+ tracker_data_update_metadata_context_add (context, "ServiceTypeID",
+ service_type_id_str,
+ NULL);
tracker_data_update_metadata_context_add (context, "Mime",
- is_dir ? "Folder" : g_hash_table_lookup (metadata, "File:Mime"));
+ is_dir ? "Folder" : g_hash_table_lookup (metadata, "File:Mime"),
+ NULL);
tracker_data_update_metadata_context_add (context, "Size",
- g_hash_table_lookup (metadata, "File:Size"));
- tracker_data_update_metadata_context_add (context, "IsDirectory",
- is_dir ? "1" : "0");
- tracker_data_update_metadata_context_add (context, "IsLink",
- is_symlink ? "1" : "0");
+ g_hash_table_lookup (metadata, "File:Size"),
+ NULL);
+ tracker_data_update_metadata_context_add (context, "IsDirectory",
+ is_dir ? "1" : "0",
+ NULL);
+ tracker_data_update_metadata_context_add (context, "IsLink",
+ is_symlink ? "1" : "0",
+ NULL);
tracker_data_update_metadata_context_add (context, "IndexTime",
- g_hash_table_lookup (metadata, "File:Modified"));
- tracker_data_update_metadata_context_add (context, "AuxilaryID", volume_id_str);
+ g_hash_table_lookup (metadata, "File:Modified"),
+ NULL);
+ tracker_data_update_metadata_context_add (context, "AuxilaryID",
+ volume_id_str,
+ NULL);
g_free (service_type_id_str);
g_free (volume_id_str);
@@ -412,25 +425,21 @@ tracker_data_update_set_metadata (TrackerDataUpdateMetadataContext *context,
gchar *column;
column = g_strdup_printf ("KeyMetadata%d", metadata_key);
- tracker_data_update_metadata_context_add (context, column, value);
+ tracker_data_update_metadata_context_add (context, column, value, NULL);
g_free (column);
} else if (tracker_field_get_data_type (field) == TRACKER_FIELD_TYPE_DATE &&
(strcmp (tracker_field_get_name (field), "File:Modified") == 0)) {
/* Handle mtime */
- tracker_data_update_metadata_context_add (context, "IndexTime", value);
+ tracker_data_update_metadata_context_add (context, "IndexTime", value, NULL);
}
collate_key = tracker_ontology_service_get_key_collate (tracker_service_get_name (service),
tracker_field_get_name (field));
if (collate_key > 0) {
- gchar *value_collated, *column;
+ gchar *column;
- value_collated = g_utf8_collate_key (value, -1);
column = g_strdup_printf ("KeyMetadataCollation%d", collate_key);
-
- tracker_data_update_metadata_context_add (context, column, value_collated);
-
- g_free (value_collated);
+ tracker_data_update_metadata_context_add (context, column, value, "CollateKey");
g_free (column);
}
@@ -746,7 +755,7 @@ tracker_data_update_replace_service (const gchar *udi,
}
file_mtime = atoi (modified);
- escaped_path = tracker_escape_string (path);
+ escaped_path = tracker_escape_db_string (path, FALSE);
basename = g_path_get_basename (escaped_path);
dirname = g_path_get_dirname (escaped_path);
@@ -920,11 +929,27 @@ tracker_data_update_metadata_context_new (TrackerDataUpdateMetadataContextType
void
tracker_data_update_metadata_context_add (TrackerDataUpdateMetadataContext *context,
const gchar *column,
- const gchar *value)
+ const gchar *value,
+ const gchar *function)
{
- g_hash_table_replace (context->data,
- g_strdup (column),
- tracker_escape_string (value));
+ if (G_UNLIKELY (function)) {
+ gchar *escaped;
+ gchar *wrapped;
+
+ escaped = tracker_escape_db_string (value, TRUE);
+ wrapped = g_strdup_printf ("%s(%s)",
+ function,
+ escaped);
+ g_free (escaped);
+
+ g_hash_table_replace (context->data,
+ g_strdup (column),
+ wrapped);
+ } else {
+ g_hash_table_replace (context->data,
+ g_strdup (column),
+ tracker_escape_db_string (value, TRUE));
+ }
}
void
@@ -949,7 +974,7 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
/* Ensure we have an ID */
id_str = tracker_guint32_to_string (context->id);
- tracker_data_update_metadata_context_add (context, "ID", id_str);
+ tracker_data_update_metadata_context_add (context, "ID", id_str, NULL);
g_free (id_str);
/* Compose insert SQL query */
@@ -968,10 +993,10 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
if (first) {
g_string_append_printf (keys, "%s", (gchar*) key);
- g_string_append_printf (values, "'%s'", (gchar*) value);
+ g_string_append_printf (values, "%s", (gchar*) value);
} else {
g_string_append_printf (keys, ",%s", (gchar*) key);
- g_string_append_printf (values, ",'%s'", (gchar*) value);
+ g_string_append_printf (values, ",%s", (gchar*) value);
}
first = FALSE;
@@ -1010,7 +1035,7 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
}
g_string_append_printf (update_query,
- "%s = '%s'",
+ "%s = %s",
(gchar*) key,
(gchar*) value);
@@ -1028,13 +1053,15 @@ tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *co
TRACKER_DB_CONTENT_TYPE_METADATA);
tracker_db_interface_execute_query (iface, &error, sql, NULL);
- g_free (sql);
if (error) {
- g_warning ("Couldn't close TrackerDataUpdateMetadataContext, %s",
+ g_warning ("Couldn't close TrackerDataUpdateMetadataContext, query was '%s', %s",
+ sql,
error->message);
g_error_free (error);
}
+
+ g_free (sql);
}
void
diff --git a/src/libtracker-data/tracker-data-update.h b/src/libtracker-data/tracker-data-update.h
index 09783e3..b47c14d 100644
--- a/src/libtracker-data/tracker-data-update.h
+++ b/src/libtracker-data/tracker-data-update.h
@@ -111,11 +111,12 @@ TrackerDataUpdateMetadataContext *
tracker_data_update_metadata_context_new (TrackerDataUpdateMetadataContextType type,
TrackerService *service,
guint id);
-void tracker_data_update_metadata_context_add (TrackerDataUpdateMetadataContext *context,
- const gchar *column,
- const gchar *value);
-void tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *context);
-void tracker_data_update_metadata_context_free (TrackerDataUpdateMetadataContext *context);
+void tracker_data_update_metadata_context_add (TrackerDataUpdateMetadataContext *context,
+ const gchar *column,
+ const gchar *value,
+ const gchar *function);
+void tracker_data_update_metadata_context_close (TrackerDataUpdateMetadataContext *context);
+void tracker_data_update_metadata_context_free (TrackerDataUpdateMetadataContext *context);
G_END_DECLS
diff --git a/src/libtracker-data/tracker-rdf-query.c b/src/libtracker-data/tracker-rdf-query.c
index a2031f6..311e750 100644
--- a/src/libtracker-data/tracker-rdf-query.c
+++ b/src/libtracker-data/tracker-rdf-query.c
@@ -742,24 +742,6 @@ start_element_handler (GMarkupParseContext *context,
}
}
-static gchar *
-get_value (const gchar *value, gboolean quote)
-{
- gchar *escaped;
- gchar *ret;
-
- escaped = tracker_escape_string(value);
- if (quote) {
- ret = g_strconcat (" '", escaped, "' ", NULL);
- } else {
- ret = g_strdup (escaped);
- }
-
- g_free (escaped);
-
- return ret;
-}
-
static gboolean
build_sql (ParserData *data)
{
@@ -781,9 +763,10 @@ build_sql (ParserData *data)
state = peek_state (data);
- avalue = get_value (data->current_value, (state != STATE_END_DATE &&
- state != STATE_END_INTEGER &&
- state != STATE_END_FLOAT));
+ avalue = tracker_escape_db_string (data->current_value,
+ state != STATE_END_DATE &&
+ state != STATE_END_INTEGER &&
+ state != STATE_END_FLOAT);
field_data = add_metadata_field (data, data->current_field, FALSE, TRUE, FALSE);
@@ -1299,7 +1282,7 @@ tracker_rdf_query_to_sql (TrackerDBInterface *iface,
}
list = g_hash_table_lookup (table, key);
- list = g_list_prepend (list, tracker_escape_string(value));
+ list = g_list_prepend (list, tracker_escape_db_string (value, TRUE));
g_hash_table_insert (table, g_strdup (key), list);
g_free (full);
@@ -1315,7 +1298,7 @@ tracker_rdf_query_to_sql (TrackerDBInterface *iface,
for (l = list; l; l = l->next) {
g_string_append_printf (data.sql_where,
- " AND (S.ID IN (SELECT ServiceID FROM ServiceKeywordMetaData WHERE MetaDataID in (%s) AND MetadataValue = '%s')) ",
+ " AND (S.ID IN (SELECT ServiceID FROM ServiceKeywordMetaData WHERE MetaDataID in (%s) AND MetadataValue = %s)) ",
keyword_metadata,
(gchar*) l->data);
}
diff --git a/src/libtracker-db/tracker-db-manager.c b/src/libtracker-db/tracker-db-manager.c
index 93ffbad..3adb3b4 100644
--- a/src/libtracker-db/tracker-db-manager.c
+++ b/src/libtracker-db/tracker-db-manager.c
@@ -504,15 +504,17 @@ load_metadata_file (TrackerDBInterface *iface,
g_critical ("Field '%s' doesn't have a valid data type '%s'", groups[i], new_value);
}
} else {
- gchar *esc_value;
+ gchar *escaped_value;
- esc_value = tracker_escape_string (new_value);
+ escaped_value = tracker_escape_db_string (new_value, TRUE);
tracker_db_interface_execute_query (iface, NULL,
- "update MetaDataTypes set %s = '%s' where ID = %d",
- keys[j], esc_value, id);
+ "update MetaDataTypes set %s = %s where ID = %d",
+ keys[j],
+ escaped_value,
+ id);
- g_free (esc_value);
+ g_free (escaped_value);
}
g_free (new_value);
@@ -663,19 +665,19 @@ load_service_file (TrackerDBInterface *iface,
g_strfreev (tab_array);
} else {
- gchar *value, *new_value, *esc_value;
+ gchar *value, *new_value, *escaped_value;
value = g_key_file_get_string (key_file, groups[i], keys[j], NULL);
new_value = tracker_string_boolean_to_string_gint (value);
- esc_value = tracker_escape_string (new_value);
+ escaped_value = tracker_escape_db_string (new_value, TRUE);
/* Special case "Parent */
if (g_ascii_strcasecmp (keys[j], "parent") == 0) {
TrackerDBResultSet *result_set;
gchar *query;
- query = g_strdup_printf ("SELECT TypeId FROM ServiceTypes WHERE TypeName = '%s'",
- esc_value);
+ query = g_strdup_printf ("SELECT TypeId FROM ServiceTypes WHERE TypeName = %s",
+ escaped_value);
result_set = tracker_db_interface_execute_query (iface, NULL, "%s", query);
g_free (query);
@@ -703,12 +705,12 @@ load_service_file (TrackerDBInterface *iface,
tracker_db_interface_execute_query (iface,
NULL,
- "UPDATE ServiceTypes SET %s = '%s' WHERE TypeID = %s",
+ "UPDATE ServiceTypes SET %s = %s WHERE TypeID = %s",
keys[j],
- esc_value,
+ escaped_value,
str_id);
- g_free (esc_value);
+ g_free (escaped_value);
g_free (value);
g_free (new_value);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]