tracker r2242 - in branches/indexer-split: . src/libtracker-common src/tracker-indexer



Author: mr
Date: Wed Sep 17 12:14:38 2008
New Revision: 2242
URL: http://svn.gnome.org/viewvc/tracker?rev=2242&view=rev

Log:
	* src/libtracker-common/tracker-file-utils.c:
	(tracker_file_get_mime_type), (path_has_write_access): Fixed
	GFileInfo memory leaks.

	* src/libtracker-common/tracker-ontology.c:
	(tracker_ontology_get_field_by_id): Fixed GList memory leak from
	g_hash_table_get_values() call.

	* src/libtracker-common/tracker-parser.c: (analyze_text),
	(tracker_parser_text_to_string), (tracker_parser_text): Make sure
	we check the text string is not just an empty string. Also, don't
	call strlen twice in some cases.

	* src/tracker-indexer/tracker-indexer-db.c:
	(tracker_db_check_service), For some reason, the mtime comes back
	as a string, even though it is supposed to be an integer. So we
	call tracker_string_to_date() on it now.

	* src/tracker-indexer/tracker-indexer.c: (item_create_or_update):
	Fixed a memory leak here were the TrackerMetadata was not freed
	when updating an indexed item.

	* src/tracker-indexer/tracker-metadata-utils.c: Some code clean ups.


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/libtracker-common/tracker-file-utils.c
   branches/indexer-split/src/libtracker-common/tracker-ontology.c
   branches/indexer-split/src/libtracker-common/tracker-parser.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer.c
   branches/indexer-split/src/tracker-indexer/tracker-metadata-utils.c

Modified: branches/indexer-split/src/libtracker-common/tracker-file-utils.c
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-file-utils.c	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-file-utils.c	Wed Sep 17 12:14:38 2008
@@ -259,26 +259,22 @@
 	info = g_file_query_info (file,
 				  G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
 				  G_FILE_QUERY_INFO_NONE,
-				  NULL, &error);
+				  NULL, 
+				  &error);
 
-	if (error) {
+	if (G_UNLIKELY (error)) {
 		g_warning ("Could not guess mimetype, %s\n", 
 			   error->message);
 		g_error_free (error);
-
-		return g_strdup ("unknown");
+		content_type = NULL;
+	} else {
+		content_type = g_strdup (g_file_info_get_content_type (info));
 	}
 
-	content_type = g_strdup (g_file_info_get_content_type (info));
-
 	g_object_unref (info);
 	g_object_unref (file);
 
-	if (!content_type) {
-		return g_strdup ("unknown");
-	}
-
-	return content_type;
+	return content_type ? content_type : g_strdup ("unknown");
 }
 
 static gchar *
@@ -728,7 +724,7 @@
                                   &error);
         g_object_unref (file);
       
-	if (error) {
+	if (G_UNLIKELY (error)) {
                 if (error->code == G_IO_ERROR_NOT_FOUND) {
                         if (exists) {
                                 *exists = FALSE;
@@ -742,14 +738,15 @@
 
 		g_error_free (error);
                        
-		return FALSE;
-	}
+		writable = FALSE;
+	} else {
+		if (exists) {
+			*exists = TRUE;
+		}
 
-        if (exists) {
-                *exists = TRUE;
-        }
+		writable = g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
+	}
 
-        writable = g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE);
         g_object_unref (info);
 
         return writable;

Modified: branches/indexer-split/src/libtracker-common/tracker-ontology.c
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-ontology.c	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-ontology.c	Wed Sep 17 12:14:38 2008
@@ -616,24 +616,23 @@
 TrackerField *  
 tracker_ontology_get_field_by_id (gint id)
 {
-	GList *values;
-	GList *l;
+	TrackerField *field = NULL;
+	GList        *values;
+	GList        *l;
 
 	/* TODO Create a hashtable with id -> field def. More efficient */
 
 	values = g_hash_table_get_values (field_names);
 	
-	for (l = values; l; l = l->next) {
-		TrackerField *field;
-
-		field = l->data;
-
-		if (atoi (tracker_field_get_id (field)) == id) {
-			return field;
+	for (l = values; l && !field; l = l->next) {
+		if (atoi (tracker_field_get_id (l->data)) == id) {
+			field = l->data;
 		}
 	}
 
-	return NULL;
+	g_list_free (values);
+
+	return field;
 }
 
 gchar *

Modified: branches/indexer-split/src/libtracker-common/tracker-parser.c
==============================================================================
--- branches/indexer-split/src/libtracker-common/tracker-parser.c	(original)
+++ branches/indexer-split/src/libtracker-common/tracker-parser.c	Wed Sep 17 12:14:38 2008
@@ -65,7 +65,6 @@
 static inline TrackerParserWordType
 get_word_type (gunichar c)
 {
-
 	/* Fast ascii handling */
 	if (IS_ASCII (c)) {
 		if (IS_ASCII_ALPHA_LOWER (c)) {
@@ -95,15 +94,15 @@
 		if (IS_NEWLINE (c)) {
 			return TRACKER_PARSER_WORD_NEWLINE;
 		}
-	} else 	{
+	} else {
 		if (g_unichar_isalpha (c)) {
 			if (!g_unichar_isupper (c)) {
-				return  TRACKER_PARSER_WORD_ALPHA_LOWER;
+				return TRACKER_PARSER_WORD_ALPHA_LOWER;
 			} else {
-				return  TRACKER_PARSER_WORD_ALPHA_HIGHER;
+				return TRACKER_PARSER_WORD_ALPHA_HIGHER;
 			}
 		} else if (g_unichar_isdigit (c)) {
-			return  TRACKER_PARSER_WORD_NUM;
+			return TRACKER_PARSER_WORD_NUM;
 		}
 	}
 
@@ -216,7 +215,7 @@
 
 	*index_word = NULL;
 
-	if (!text) {
+	if (text == NULL || text[0] == '\0') {
                 return NULL;
         }
 
@@ -234,7 +233,8 @@
                 c = g_utf8_get_char (p);
                 type = get_word_type (c);
 
-                if (type == TRACKER_PARSER_WORD_IGNORE || type == TRACKER_PARSER_WORD_NEWLINE ||
+                if (type == TRACKER_PARSER_WORD_IGNORE || 
+		    type == TRACKER_PARSER_WORD_NEWLINE ||
                     (delimit_hyphen &&
                      (type == TRACKER_PARSER_WORD_HYPHEN ||
                       type == TRACKER_PARSER_WORD_UNDERSCORE))) {
@@ -890,7 +890,7 @@
 
 
 gchar *
-tracker_parser_text_to_string (const gchar     *txt,
+tracker_parser_text_to_string (const gchar     *text,
                                TrackerLanguage *language,
                                gint             max_word_length,
                                gint             min_word_length,
@@ -903,37 +903,36 @@
 	guint32      i = 0;
         gint         len;
 
-        g_return_val_if_fail (language != NULL, NULL);
+        g_return_val_if_fail (TRACKER_IS_LANGUAGE (language), NULL);
 
-	if (!txt) {
+	if (text == NULL || text[0] == '\0') {
                 return NULL;
         }
 
-        p = txt;
-        len = strlen (txt);
+        p = text;
+        len = strlen (text);
         len = MIN (len, 500);
 
-        if (!g_utf8_validate (txt, len, NULL)) {
+        if (!g_utf8_validate (text, len, NULL)) {
                 return NULL;
         }
 
-        if (text_needs_pango (txt)) {
+        if (text_needs_pango (text)) {
                 /* CJK text does not need stemming or other
                  * treatment.
                  */
                 PangoLogAttr *attrs;
-                guint	      nb_bytes, str_len, word_start;
+                guint	      str_len, word_start;
                 GString	     *strs;
 
-                nb_bytes = strlen (txt);
-                str_len = g_utf8_strlen (txt, -1);
+                str_len = g_utf8_strlen (text, -1);
 
                 strs = g_string_new (" ");
 
                 attrs = g_new0 (PangoLogAttr, str_len + 1);
 
-                pango_get_log_attrs (txt,
-                                     nb_bytes,
+                pango_get_log_attrs (text,
+                                     len,
                                      0,
                                      pango_language_from_string ("C"),
                                      attrs,
@@ -945,8 +944,8 @@
                         if (attrs[i].is_word_end) {
                                 gchar *start_word, *end_word;
 
-                                start_word = g_utf8_offset_to_pointer (txt, word_start);
-                                end_word = g_utf8_offset_to_pointer (txt, i);
+                                start_word = g_utf8_offset_to_pointer (text, word_start);
+                                end_word = g_utf8_offset_to_pointer (text, i);
 
                                 if (start_word != end_word) {
                                         /* Normalize word */
@@ -1069,7 +1068,7 @@
 
 GHashTable *
 tracker_parser_text (GHashTable      *word_table,
-                     const gchar     *txt,
+                     const gchar     *text,
                      gint             weight,
                      TrackerLanguage *language,
                      gint             max_words_to_index,
@@ -1096,26 +1095,25 @@
 		total_words = g_hash_table_size (word_table);
 	}
 
-	if (!txt || weight == 0) {
+	if (text == NULL || text[0] == '\0' || weight == 0) {
 		return word_table;
 	}
 
-	p = txt;
+	p = text;
 	i = 0;
 
-	if (text_needs_pango (txt)) {
+	if (text_needs_pango (text)) {
 		/* CJK text does not need stemming or other treatment */
 		PangoLogAttr *attrs;
-		guint	      nb_bytes, str_len, word_start;
-
-                nb_bytes = strlen (txt);
+		guint	      len, str_len, word_start;
 
-                str_len = g_utf8_strlen (txt, -1);
+                len = strlen (text);
+                str_len = g_utf8_strlen (text, -1);
 
 		attrs = g_new0 (PangoLogAttr, str_len + 1);
 
-		pango_get_log_attrs (txt,
-                                     nb_bytes,
+		pango_get_log_attrs (text,
+                                     len,
                                      0,
                                      pango_language_from_string ("C"),
                                      attrs,
@@ -1127,8 +1125,8 @@
 			if (attrs[i].is_word_end) {
 				gchar *start_word, *end_word;
 
-				start_word = g_utf8_offset_to_pointer (txt, word_start);
-				end_word = g_utf8_offset_to_pointer (txt, i);
+				start_word = g_utf8_offset_to_pointer (text, word_start);
+				end_word = g_utf8_offset_to_pointer (text, i);
 
 				if (start_word != end_word) {
 					gchar    *str;

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c	Wed Sep 17 12:14:38 2008
@@ -151,7 +151,9 @@
 {
 	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
-	guint db_id, db_mtime;
+	gchar *db_mtime_str;
+	guint db_id;
+	guint db_mtime;
 	gboolean found = FALSE;
 
 	db_id = db_mtime = 0;
@@ -167,10 +169,15 @@
 	if (result_set) {
 		tracker_db_result_set_get (result_set,
 					   0, &db_id,
-					   1, &db_mtime,
+					   1, &db_mtime_str,
 					   -1);
 		g_object_unref (result_set);
 		found = TRUE;
+
+		if (db_mtime_str) {
+			db_mtime = tracker_string_to_date (db_mtime_str);
+			g_free (db_mtime_str);
+		}
 	}
 
 	if (id) {
@@ -323,52 +330,59 @@
 			gboolean            numeric,
 			gboolean            only_embedded)
 {
-	gboolean      valid = TRUE;
-	TrackerField *field_def;
-	gint          metadata_id;
+	TrackerField *field;
 	gchar        *value;
 	gint          numeric_value;
+	gint          metadata_id;
+	gboolean      valid = TRUE;
 
 	while (valid) {
-		
 		if (numeric) {
-			tracker_db_result_set_get (result_set, 0, &metadata_id, 1, &numeric_value, -1);
+			tracker_db_result_set_get (result_set, 
+						   0, &metadata_id, 
+						   1, &numeric_value, 
+						   -1);
 			value = g_strdup_printf ("%d", numeric_value);
 		} else {
-			tracker_db_result_set_get (result_set, 0, &metadata_id, 1, &value, -1);
+			tracker_db_result_set_get (result_set, 
+						   0, &metadata_id, 
+						   1, &value, 
+						   -1);
 		}
 		
-		field_def = tracker_ontology_get_field_by_id (metadata_id);
-		if (!field_def) {
+		field = tracker_ontology_get_field_by_id (metadata_id);
+		if (!field) {
 			g_critical ("Field id %d in database but not in tracker-ontology",
 				    metadata_id);
 			g_free (value);
 			return;
 		}
 		
-		if (tracker_field_get_embedded (field_def) || !only_embedded) {
+		if (tracker_field_get_embedded (field) || !only_embedded) {
+			if (tracker_field_get_multiple_values (field)) {
+				GList *new_values;
+				const GList *old_values; 
 
-			if (tracker_field_get_multiple_values (field_def)) {
-			
-				GList *new_values = NULL;
-				const GList *old_values = NULL; 
+				new_values = NULL;
 				old_values = tracker_metadata_lookup_multiple_values (metadata,
-										      tracker_field_get_name (field_def));
+										      tracker_field_get_name (field));
 				if (old_values) {
-					new_values = g_list_copy ((GList *)old_values);
+					new_values = g_list_copy ((GList *) old_values);
 				}
 				
-				new_values = g_list_prepend (new_values, g_strdup (value));
+				new_values = g_list_prepend (new_values, value);
 				tracker_metadata_insert_multiple_values (metadata, 
-									 tracker_field_get_name (field_def),
+									 tracker_field_get_name (field),
 									 new_values);
-				
 			} else {
-				tracker_metadata_insert (metadata, tracker_field_get_name (field_def), g_strdup (value));
+				tracker_metadata_insert (metadata, 
+							 tracker_field_get_name (field), 
+							 value);
 			}
+		} else {
+			g_free (value);
 		}
 
-		g_free (value);
 		valid = tracker_db_result_set_iter_next (result_set);
 	}
 }
@@ -530,9 +544,9 @@
 }
 
 gchar **
-tracker_db_get_property_values (TrackerService     *service_def,
-				guint32             id,
-				TrackerField       *field_def)
+tracker_db_get_property_values (TrackerService *service_def,
+				guint32         id,
+				TrackerField   *field)
 {
 	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set = NULL;
@@ -543,7 +557,7 @@
 	iface = tracker_db_manager_get_db_interface_by_type (tracker_service_get_name (service_def),
 							     TRACKER_DB_CONTENT_TYPE_METADATA);
 	metadata_key = tracker_ontology_service_get_key_metadata (tracker_service_get_name (service_def),
-								  tracker_field_get_name (field_def));
+								  tracker_field_get_name (field));
 
 	if (metadata_key > 0) {
 		gchar *query;
@@ -561,12 +575,12 @@
 
 		id_str = tracker_guint32_to_string (id);
 		
-		switch (tracker_field_get_data_type (field_def)) {
+		switch (tracker_field_get_data_type (field)) {
 		case TRACKER_FIELD_TYPE_KEYWORD:
 			result_set = tracker_db_interface_execute_procedure (iface, NULL,
 									     "GetMetadataKeyword",
 									     id_str,
-									     tracker_field_get_id (field_def),
+									     tracker_field_get_id (field),
 									     NULL);
 			break;
 		case TRACKER_FIELD_TYPE_INDEX:
@@ -575,7 +589,7 @@
 			result_set = tracker_db_interface_execute_procedure (iface, NULL,
 									     "GetMetadata",
 									     id_str,
-									     tracker_field_get_id (field_def),
+									     tracker_field_get_id (field),
 									     NULL);
 			break;
 		case TRACKER_FIELD_TYPE_INTEGER:
@@ -583,7 +597,7 @@
 			result_set = tracker_db_interface_execute_procedure (iface, NULL,
 									     "GetMetadataNumeric",
 									     id_str,
-									     tracker_field_get_id (field_def),
+									     tracker_field_get_id (field),
 									     NULL);
 			is_numeric = TRUE;
 			break;

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer.c	Wed Sep 17 12:14:38 2008
@@ -924,8 +924,8 @@
 		tracker_db_delete_metadata (data->service, data->id, field, (gchar *)value);
 	}
 
-	g_free (parsed_value);
 	g_strfreev (arr);
+	g_free (parsed_value);
 }
 
 static void
@@ -1274,8 +1274,8 @@
 
 	if (tracker_db_check_service (service_def, dirname, basename, &id, NULL)) {
 		TrackerMetadata *old_metadata;
-		gchar           *old_text;
-		gchar           *new_text;
+		gchar *old_text;
+		gchar *new_text;
 
 		/* Update case */
 		g_debug ("Updating file '%s'", info->file->path);
@@ -1298,6 +1298,7 @@
 
 		g_free (old_text);
 		g_free (new_text);
+		tracker_metadata_free (old_metadata);		
 
 		return;
 	}

Modified: branches/indexer-split/src/tracker-indexer/tracker-metadata-utils.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-metadata-utils.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-metadata-utils.c	Wed Sep 17 12:14:38 2008
@@ -203,7 +203,8 @@
 		metadata_context = NULL;
 	}
 
-	metadata_context = process_context_create (argv, metadata_read_cb);
+	metadata_context = process_context_create (argv, 
+						   metadata_read_cb);
 
 	if (!metadata_context) {
 		return FALSE;
@@ -286,14 +287,14 @@
 
 static void
 metadata_utils_get_embedded (const char      *path,
-			     const char      *mimetype,
+			     const char      *mime_type,
 			     TrackerMetadata *metadata)
 {
-	gchar **values, *service_type;
-	gint i;
-
-	service_type = tracker_ontology_get_service_by_mime (mimetype);
+	gchar **values;
+	gchar  *service_type;
+	gint    i;
 
+	service_type = tracker_ontology_get_service_by_mime (mime_type);
 	if (!service_type) {
 		return;
 	}
@@ -305,7 +306,7 @@
 
         g_free (service_type);
 
-	values = metadata_query_file (path, mimetype);
+	values = metadata_query_file (path, mime_type);
 
 	if (!values) {
 		return;
@@ -568,9 +569,9 @@
                            path,
                            error->message);
                 g_error_free (error);
-                g_object_unref (file);
+		g_string_free (s, TRUE);
                 g_object_unref (stream);
-                g_string_free (s, TRUE);
+                g_object_unref (file);
 
                 return NULL;
         }
@@ -601,8 +602,8 @@
 	s = g_string_truncate (s, bytes_valid);
 #endif  /* TRY_LOCALE_TO_UTF8_CONVERSION */
 
-        g_object_unref (file);
         g_object_unref (stream);
+        g_object_unref (file);
 
 	if (s->len < 1) {
 		g_string_free (s, TRUE);
@@ -681,7 +682,8 @@
 	argv[3] = g_strdup ("normal");
 	argv[4] = NULL;
 
-	context = process_context_create ((const gchar **) argv, get_file_content_read_cb);
+	context = process_context_create ((const gchar **) argv, 
+					  get_file_content_read_cb)
 
 	if (!context) {
 		return;
@@ -746,7 +748,8 @@
 
 	g_message ("Extracting text for:'%s' using filter:'%s'", argv[1], argv[0]);
 
-	context = process_context_create ((const gchar **) argv, get_file_content_read_cb);
+	context = process_context_create ((const gchar **) argv, 
+					  get_file_content_read_cb);
 
 	g_free (text_filter_file);
 	g_free (argv);
@@ -771,11 +774,12 @@
 gchar *
 tracker_metadata_utils_get_text (const gchar *path)
 {
-	gchar *mimetype, *service_type;
-	gchar *text = NULL;
+	gchar *mime_type;
+	gchar *service_type;
+	gchar *text;
 
-	mimetype = tracker_file_get_mime_type (path);
-	service_type = tracker_ontology_get_service_by_mime (mimetype);
+	mime_type = tracker_file_get_mime_type (path);
+	service_type = tracker_ontology_get_service_by_mime (mime_type);
 
 	/* No need to filter text based files - index them directly */
 	if (service_type &&
@@ -783,11 +787,11 @@
              strcmp (service_type, "Development") == 0)) {
                 text = get_file_content (path);
 	} else {
-		text = get_file_content_by_filter (path, mimetype);
+		text = get_file_content_by_filter (path, mime_type);
 	}
 
-	g_free (mimetype);
 	g_free (service_type);
+	g_free (mime_type);
 
 	return text;
 }
@@ -798,7 +802,7 @@
         TrackerMetadata *metadata;
 	struct stat st;
 	const gchar *ext;
-	gchar *mimetype;
+	gchar *mime_type;
 
 	if (g_lstat (path, &st) < 0) {
                 return NULL;
@@ -811,20 +815,23 @@
 		tracker_metadata_insert (metadata, METADATA_FILE_EXT, g_strdup (ext + 1));
 	}
 
-	mimetype = tracker_file_get_mime_type (path);
+	mime_type = tracker_file_get_mime_type (path);
 
-        tracker_metadata_insert (metadata, METADATA_FILE_NAME, g_filename_display_basename (path));
-	tracker_metadata_insert (metadata, METADATA_FILE_PATH, g_path_get_dirname (path));
+        tracker_metadata_insert (metadata, METADATA_FILE_NAME, 
+				 g_filename_display_basename (path));
+	tracker_metadata_insert (metadata, METADATA_FILE_PATH, 
+				 g_path_get_dirname (path));
 	tracker_metadata_insert (metadata, METADATA_FILE_NAME_DELIMITED,
                                  g_filename_to_utf8 (path, -1, NULL, NULL, NULL));
-	tracker_metadata_insert (metadata, METADATA_FILE_MIMETYPE, mimetype);
+	tracker_metadata_insert (metadata, METADATA_FILE_MIMETYPE, 
+				 mime_type);
 
-	if (mimetype) {
+	if (mime_type) {
 		/* FIXME: 
 		 * We should determine here for which items we do and for which
 		 * items we don't want to pre-create the thumbnail. */
 
-		get_file_thumbnail (path, mimetype);
+		get_file_thumbnail (path, mime_type);
 	}
 
 	if (S_ISLNK (st.st_mode)) {
@@ -844,7 +851,7 @@
 	tracker_metadata_insert (metadata, METADATA_FILE_ACCESSED,
                                  tracker_date_to_string (st.st_atime));
 
-	metadata_utils_get_embedded (path, mimetype, metadata);
+	metadata_utils_get_embedded (path, mime_type, metadata);
 
         return metadata;
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]