[tracker/tracker-0.6] Fixes indexer warnings closing contexts inserting with collated data



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]