tracker r1959 - in branches/indexer-split: . src/tracker-indexer src/tracker-indexer/modules



Author: carlosg
Date: Tue Jul 29 12:05:42 2008
New Revision: 1959
URL: http://svn.gnome.org/viewvc/tracker?rev=1959&view=rev

Log:
2008-07-29  Carlos Garnacho  <carlos imendio com>

        Support saving metadata with multiple items.

        * src/tracker-indexer/tracker-metadata.[ch]: Old code was removed,
        these files now contain a TrackerMetadata struct, which is used to
        store metadata, taking care of the type, whether it has multiple
        items, how data must be freed, ...
        * src/tracker-module.h:
        * src/tracker-indexer-module.[ch]: Adapt modules API to return a
        TrackerMetadata instead of a GHashTable for metadata.
        * src/tracker-indexer/tracker-indexer.c:
        * src/tracker-indexer/tracker-indexer-db.c: Use TrackerMetadata API.
        Also support storing metadata with multiple values.
        * src/tracker-indexer/modules/*.c: Adapt to module API changes, also
        store metadata lists where appropriate (mimetypes/categories for
        applications, recipients for mail).


Modified:
   branches/indexer-split/ChangeLog
   branches/indexer-split/src/tracker-indexer/modules/Makefile.am
   branches/indexer-split/src/tracker-indexer/modules/applications.c
   branches/indexer-split/src/tracker-indexer/modules/dummy.c
   branches/indexer-split/src/tracker-indexer/modules/evolution.c
   branches/indexer-split/src/tracker-indexer/modules/files.c
   branches/indexer-split/src/tracker-indexer/modules/gaim-conversations.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
   branches/indexer-split/src/tracker-indexer/tracker-indexer-module.c
   branches/indexer-split/src/tracker-indexer/tracker-indexer-module.h
   branches/indexer-split/src/tracker-indexer/tracker-indexer.c
   branches/indexer-split/src/tracker-indexer/tracker-metadata.c
   branches/indexer-split/src/tracker-indexer/tracker-metadata.h
   branches/indexer-split/src/tracker-indexer/tracker-module.h

Modified: branches/indexer-split/src/tracker-indexer/modules/Makefile.am
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/Makefile.am	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/Makefile.am	Tue Jul 29 12:05:42 2008
@@ -60,4 +60,4 @@
 	$(GCONF_LIBS)							\
 	$(GMIME_LIBS)
 
-endif
\ No newline at end of file
+endif

Modified: branches/indexer-split/src/tracker-indexer/modules/applications.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/applications.c	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/applications.c	Tue Jul 29 12:05:42 2008
@@ -20,6 +20,7 @@
 #include <stdlib.h>
 #include <glib.h>
 #include <tracker-indexer/tracker-module.h>
+#include <tracker-indexer/tracker-metadata.h>
 
 #define GROUP_DESKTOP_ENTRY "Desktop Entry"
 #define KEY_TYPE            "Type"
@@ -50,11 +51,11 @@
 }
 
 static void
-insert_data_from_desktop_file (GHashTable  *metadata,
-			       const gchar *metadata_key,
-			       GKeyFile    *desktop_file,
-			       const gchar *key,
-			       gboolean     use_locale)
+insert_data_from_desktop_file (TrackerMetadata *metadata,
+			       const gchar     *metadata_key,
+			       GKeyFile        *desktop_file,
+			       const gchar     *key,
+			       gboolean         use_locale)
 {
 	gchar *str;
 
@@ -65,14 +66,44 @@
 	}
 
 	if (str) {
-		g_hash_table_insert (metadata, (gpointer) metadata_key, str);
+                tracker_metadata_insert (metadata, metadata_key, str);
 	}
 }
 
-GHashTable *
+static void
+insert_list_from_desktop_file (TrackerMetadata *metadata,
+                               const gchar     *metadata_key,
+                               GKeyFile        *desktop_file,
+                               const gchar     *key,
+                               gboolean         use_locale)
+{
+        gchar **arr;
+
+        if (use_locale) {
+                arr = g_key_file_get_locale_string_list (desktop_file, GROUP_DESKTOP_ENTRY, key, NULL, NULL, NULL);
+        } else {
+                arr = g_key_file_get_string_list (desktop_file, GROUP_DESKTOP_ENTRY, key, NULL, NULL);
+        }
+
+        if (arr) {
+                GList *list = NULL;
+                gint i;
+
+                for (i = 0; arr[i]; i++) {
+                        list = g_list_prepend (list, arr[i]);
+                }
+
+                list = g_list_reverse (list);
+                g_free (arr);
+
+                tracker_metadata_insert_multiple_values (metadata, metadata_key, list);
+        }
+}
+
+TrackerMetadata *
 tracker_module_file_get_metadata (TrackerFile *file)
 {
-	GHashTable *metadata;
+        TrackerMetadata *metadata;
 	GKeyFile *key_file;
 	gchar *type, *filename;
 
@@ -102,9 +133,7 @@
 	}
 
 	/* Begin collecting data */
-	metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
-					  NULL,
-					  (GDestroyNotify) g_free);
+        metadata = tracker_metadata_new ();
 
 	insert_data_from_desktop_file (metadata, METADATA_APP_NAME, key_file, KEY_NAME, FALSE);
 	insert_data_from_desktop_file (metadata, METADATA_APP_DISPLAY_NAME, key_file, KEY_NAME, TRUE);
@@ -113,10 +142,11 @@
 	insert_data_from_desktop_file (metadata, METADATA_APP_EXECUTABLE, key_file, KEY_EXECUTABLE, FALSE);
 	insert_data_from_desktop_file (metadata, METADATA_APP_ICON, key_file, KEY_ICON, FALSE);
 
-	/* FIXME: mimetypes list and categories? */
+        insert_list_from_desktop_file (metadata, METADATA_APP_MIMETYPE, key_file, KEY_MIMETYPE, FALSE);
+        insert_list_from_desktop_file (metadata, METADATA_APP_CATEGORIES, key_file, KEY_CATEGORIES, FALSE);
 
 	filename = g_filename_display_basename (file->path);
-	g_hash_table_insert (metadata, METADATA_FILE_NAME, filename);
+        tracker_metadata_insert (metadata, METADATA_FILE_NAME, filename);
 
 	g_key_file_free (key_file);
 	g_free (type);

Modified: branches/indexer-split/src/tracker-indexer/modules/dummy.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/dummy.c	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/dummy.c	Tue Jul 29 12:05:42 2008
@@ -18,6 +18,7 @@
  */
 
 #include <glib.h>
+#include <tracker-indexer/tracker-metadata.h>
 
 void
 tracker_module_init (void)
@@ -69,7 +70,7 @@
          */
 }
 
-GHashTable *
+TrackerMetadata *
 tracker_module_file_get_metadata (TrackerFile *file)
 {
 	/* Return a hashtable filled with metadata for file, given the

Modified: branches/indexer-split/src/tracker-indexer/modules/evolution.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/evolution.c	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/evolution.c	Tue Jul 29 12:05:42 2008
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 #include <gconf/gconf-client.h>
 #include <tracker-indexer/tracker-module.h>
+#include <tracker-indexer/tracker-metadata.h>
 #include <libtracker-common/tracker-utils.h>
 #include <libtracker-common/tracker-file-utils.h>
 #include <libtracker-common/tracker-type-utils.h>
@@ -37,6 +38,8 @@
 #define METADATA_EMAIL_DATE          "Email:Date"
 #define METADATA_EMAIL_SENDER        "Email:Sender"
 #define METADATA_EMAIL_SUBJECT       "Email:Subject"
+#define METADATA_EMAIL_SENT_TO       "Email:SentTo"
+#define METADATA_EMAIL_CC            "Email:CC"
 
 typedef union EvolutionFileData EvolutionFileData;
 typedef struct EvolutionLocalData EvolutionLocalData;
@@ -562,14 +565,45 @@
         return id;
 }
 
-GHashTable *
+static GList *
+get_mbox_recipient_list (GMimeMessage *message,
+                         const gchar  *type)
+{
+        GList *list = NULL;
+        const InternetAddressList *addresses;
+
+        addresses = g_mime_message_get_recipients (message, type);
+
+        while (addresses) {
+                InternetAddress *address;
+                gchar *str;
+
+                address = addresses->address;
+
+                if (address->name && address->value.addr) {
+                        str = g_strdup_printf ("%s %s", address->name, address->value.addr);
+                } else if (address->value.addr) {
+                        str = g_strdup (address->value.addr);
+                } else if (address->name) {
+                        str = g_strdup (address->name);
+                }
+
+                list = g_list_prepend (list, str);
+                addresses = addresses->next;
+        }
+
+        return g_list_reverse (list);
+}
+
+TrackerMetadata *
 get_metadata_for_mbox (TrackerFile *file)
 {
         EvolutionLocalData *data;
         GMimeMessage *message;
-        GHashTable *metadata;
+        TrackerMetadata *metadata;
         gchar *dir, *name;
         time_t date;
+        GList *list;
 
         data = file->data;
         message = data->message;
@@ -578,31 +612,30 @@
                 return NULL;
         }
 
-	metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
-					  NULL,
-					  (GDestroyNotify) g_free);
-
+        metadata = tracker_metadata_new ();
         dir = tracker_string_replace (file->path, local_dir, NULL);
         name = g_strdup_printf ("%s;uid=%d", dir, get_mbox_message_id (message));
 
-        g_hash_table_insert (metadata, METADATA_FILE_PATH, g_strdup ("email://local local"));
-        g_hash_table_insert (metadata, METADATA_FILE_NAME, name);
+        tracker_metadata_insert (metadata, METADATA_FILE_PATH, g_strdup ("email://local local"));
+        tracker_metadata_insert (metadata, METADATA_FILE_NAME, name);
 
         g_mime_message_get_date (message, &date, NULL);
-	g_hash_table_insert (metadata, METADATA_EMAIL_DATE,
-                             tracker_uint_to_string (date));
+	tracker_metadata_insert (metadata, METADATA_EMAIL_DATE,
+                                 tracker_uint_to_string (date));
+
+        tracker_metadata_insert (metadata, METADATA_EMAIL_SENDER,
+                                 g_strdup (g_mime_message_get_sender (message)));
+        tracker_metadata_insert (metadata, METADATA_EMAIL_SUBJECT,
+                                 g_strdup (g_mime_message_get_subject (message)));
+
+        list = get_mbox_recipient_list (message, GMIME_RECIPIENT_TYPE_TO);
+        tracker_metadata_insert_multiple_values (metadata, METADATA_EMAIL_SENT_TO, list);
 
-        g_hash_table_insert (metadata, METADATA_EMAIL_SENDER,
-                             g_strdup (g_mime_message_get_sender (message)));
-        g_hash_table_insert (metadata, METADATA_EMAIL_SUBJECT,
-                             g_strdup (g_mime_message_get_subject (message)));
+        list = get_mbox_recipient_list (message, GMIME_RECIPIENT_TYPE_CC);
+        tracker_metadata_insert_multiple_values (metadata, METADATA_EMAIL_CC, list);
 
         /* Missing:
          *
-         * Recipients:
-         *   To
-         *   CC
-         *   BCC
          * Body
          * Attachments
          */
@@ -687,15 +720,39 @@
         return;
 }
 
-GHashTable *
+static GList *
+get_imap_recipient_list (const gchar *str)
+{
+        GList *list = NULL;
+        gchar **arr;
+        gint i;
+
+        if (!str) {
+                return NULL;
+        }
+
+        arr = g_strsplit (str, ",", -1);
+
+        for (i = 0; arr[i]; i++) {
+                g_strstrip (arr[i]);
+                list = g_list_prepend (list, g_strdup (arr[i]));
+        }
+
+        g_strfreev (arr);
+
+        return g_list_reverse (list);
+}
+
+TrackerMetadata *
 get_metadata_for_imap (TrackerFile *file)
 {
         EvolutionImapData *data;
-        GHashTable *metadata;
+        TrackerMetadata *metadata;
         gchar *dirname, *basename;
-        gchar *uid, *subject, *from, *to;
+        gchar *uid, *subject, *from, *to, *cc;
         gint32 i, count;
         time_t date;
+        GList *list;
 
         data = file->data;
 
@@ -712,28 +769,32 @@
                       SUMMARY_TYPE_STRING, &subject, /* subject */
                       SUMMARY_TYPE_STRING, &from, /* from */
                       SUMMARY_TYPE_STRING, &to, /* to */
-                      SUMMARY_TYPE_STRING, NULL, /* cc */
+                      SUMMARY_TYPE_STRING, &cc, /* cc */
                       SUMMARY_TYPE_STRING, NULL, /* mlist */
                       -1);
 
-	metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
-					  NULL,
-					  (GDestroyNotify) g_free);
-
+	metadata = tracker_metadata_new ();
         get_imap_uri (file->path, &dirname, &basename);
 
-        g_hash_table_insert (metadata, METADATA_FILE_PATH, dirname);
-        g_hash_table_insert (metadata, METADATA_FILE_NAME, g_strdup_printf ("%s;uid=%s", basename, uid));
+        tracker_metadata_insert (metadata, METADATA_FILE_PATH, dirname);
+        tracker_metadata_insert (metadata, METADATA_FILE_NAME, g_strdup_printf ("%s;uid=%s", basename, uid));
         g_free (basename);
 
-	g_hash_table_insert (metadata, METADATA_EMAIL_DATE,
-                             tracker_uint_to_string (date));
+	tracker_metadata_insert (metadata, METADATA_EMAIL_DATE,
+                                 tracker_uint_to_string (date));
+
+        tracker_metadata_insert (metadata, METADATA_EMAIL_SENDER, from);
+        tracker_metadata_insert (metadata, METADATA_EMAIL_SUBJECT, subject);
+
+        list = get_imap_recipient_list (to);
+        tracker_metadata_insert_multiple_values (metadata, METADATA_EMAIL_SENT_TO, list);
 
-        g_hash_table_insert (metadata, METADATA_EMAIL_SENDER, from);
-        g_hash_table_insert (metadata, METADATA_EMAIL_SUBJECT, subject);
+        list = get_imap_recipient_list (cc);
+        tracker_metadata_insert_multiple_values (metadata, METADATA_EMAIL_CC, list);
 
         g_free (uid);
         g_free (to);
+        g_free (cc);
 
         read_summary (data->summary,
                       SUMMARY_TYPE_INT32, NULL,
@@ -776,7 +837,7 @@
         return metadata;
 }
 
-GHashTable *
+TrackerMetadata *
 tracker_module_file_get_metadata (TrackerFile *file)
 {
         EvolutionFileData *data;

Modified: branches/indexer-split/src/tracker-indexer/modules/files.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/files.c	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/files.c	Tue Jul 29 12:05:42 2008
@@ -49,9 +49,9 @@
 }
 
 static void
-tracker_metadata_get_embedded (const char *path,
-			       const char *mimetype,
-			       GHashTable *table)
+tracker_metadata_get_embedded (const char      *path,
+			       const char      *mimetype,
+                               TrackerMetadata *metadata)
 {
 	gboolean success;
 	gchar **argv, *output, **values, *service_type;
@@ -113,7 +113,7 @@
 		if (!name || !value)
 			continue;
 
-		if (g_hash_table_lookup (table, name))
+		if (tracker_metadata_lookup (metadata, name))
 			continue;
 
 		if (!g_utf8_validate (value, -1, NULL)) {
@@ -125,8 +125,7 @@
 		if (!utf_value)
 			continue;
 
-		/* FIXME: name should be const */
-		g_hash_table_insert (table, g_strdup (name), utf_value);
+                tracker_metadata_insert (metadata, name, utf_value);
 	}
 
 	g_strfreev (values);
@@ -199,11 +198,11 @@
 	return FALSE;
 }
 
-GHashTable *
+TrackerMetadata *
 tracker_module_file_get_metadata (TrackerFile *file)
 {
 	const gchar *path;
-	GHashTable *metadata;
+        TrackerMetadata *metadata;
 	struct stat st;
 	const gchar *ext;
 	gchar *mimetype;
@@ -215,39 +214,37 @@
 	}
 
 	g_lstat (path, &st);
-	metadata = g_hash_table_new_full (g_str_hash, g_str_equal,
-					  NULL,
-					  (GDestroyNotify) g_free);
+        metadata = tracker_metadata_new ();
 	ext = strrchr (path, '.');
 
 	if (ext) {
-		g_hash_table_insert (metadata, METADATA_FILE_EXT, g_strdup (ext + 1));
+		tracker_metadata_insert (metadata, METADATA_FILE_EXT, g_strdup (ext + 1));
 	}
 
 	mimetype = tracker_file_get_mime_type (path);
 
-	g_hash_table_insert (metadata, METADATA_FILE_NAME, g_filename_display_basename (path));
-	g_hash_table_insert (metadata, METADATA_FILE_PATH, g_path_get_dirname (path));
-	g_hash_table_insert (metadata, METADATA_FILE_NAME_DELIMITED,
-			     g_filename_to_utf8 (path, -1, NULL, NULL, NULL));
-	g_hash_table_insert (metadata, METADATA_FILE_MIMETYPE, mimetype);
+        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);
 
 	if (S_ISLNK (st.st_mode)) {
 		gchar *link_path;
 
 		link_path = g_file_read_link (path, NULL);
-		g_hash_table_insert (metadata, METADATA_FILE_LINK,
-				     g_filename_to_utf8 (link_path, -1, NULL, NULL, NULL));
+		tracker_metadata_insert (metadata, METADATA_FILE_LINK,
+                                         g_filename_to_utf8 (link_path, -1, NULL, NULL, NULL));
 		g_free (link_path);
 	}
 
 	/* FIXME: These should be dealt directly as integer/times/whatever, not strings */
-	g_hash_table_insert (metadata, METADATA_FILE_SIZE,
-			     tracker_uint_to_string (st.st_size));
-	g_hash_table_insert (metadata, METADATA_FILE_MODIFIED,
-			     tracker_uint_to_string (st.st_mtime));
-	g_hash_table_insert (metadata, METADATA_FILE_ACCESSED,
-			     tracker_uint_to_string (st.st_atime));
+	tracker_metadata_insert (metadata, METADATA_FILE_SIZE,
+                                 tracker_uint_to_string (st.st_size));
+	tracker_metadata_insert (metadata, METADATA_FILE_MODIFIED,
+                                 tracker_uint_to_string (st.st_mtime));
+	tracker_metadata_insert (metadata, METADATA_FILE_ACCESSED,
+                                 tracker_uint_to_string (st.st_atime));
 
 	tracker_metadata_get_embedded (path, mimetype, metadata);
 

Modified: branches/indexer-split/src/tracker-indexer/modules/gaim-conversations.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/modules/gaim-conversations.c	(original)
+++ branches/indexer-split/src/tracker-indexer/modules/gaim-conversations.c	Tue Jul 29 12:05:42 2008
@@ -18,6 +18,7 @@
  */
 
 #include <glib.h>
+#include <tracker-indexer/tracker-module.h>
 
 G_CONST_RETURN gchar *
 tracker_module_get_name (void)
@@ -26,7 +27,7 @@
 	return "GaimConversations";
 }
 
-GHashTable *
+TrackerMetadata *
 tracker_module_get_file_metadata (const gchar *file)
 {
 	/* Return a hashtable filled with metadata for the file */

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	Tue Jul 29 12:05:42 2008
@@ -110,15 +110,15 @@
 }
 
 static void
-get_dirname_and_basename (const gchar  *path,
-			  GHashTable   *metadata,
-			  gchar       **out_dirname,
-			  gchar       **out_basename)
+get_dirname_and_basename (const gchar      *path,
+			  TrackerMetadata  *metadata,
+			  gchar           **out_dirname,
+			  gchar           **out_basename)
 {
 	const gchar *dirname, *basename;
 
-	dirname = g_hash_table_lookup (metadata, "File:Path");
-	basename = g_hash_table_lookup (metadata, "File:Name");
+	dirname = tracker_metadata_lookup (metadata, "File:Path");
+	basename = tracker_metadata_lookup (metadata, "File:Name");
 
 	if (dirname && basename) {
 		*out_dirname = g_strdup (dirname);
@@ -130,9 +130,9 @@
 }
 
 guint
-tracker_db_check_service (TrackerService *service,
-			  const gchar    *path,
-			  GHashTable     *metadata)
+tracker_db_check_service (TrackerService  *service,
+			  const gchar     *path,
+			  TrackerMetadata *metadata)
 {
 	TrackerDBInterface *iface;
 	TrackerDBResultSet *result_set;
@@ -162,10 +162,10 @@
 }
 
 gboolean
-tracker_db_create_service (TrackerService *service,
-			   guint32         id,
-			   const gchar    *path,
-			   GHashTable     *metadata)
+tracker_db_create_service (TrackerService  *service,
+			   guint32          id,
+			   const gchar     *path,
+			   TrackerMetadata *metadata)
 {
 	TrackerDBInterface *iface;
 	gchar *id_str, *service_type_id_str;
@@ -192,12 +192,12 @@
 						dirname,
 						basename,
 						service_type_id_str,
-						is_dir ? "Folder" : g_hash_table_lookup (metadata, "File:Mime"),
-						g_hash_table_lookup (metadata, "File:Size"),
+						is_dir ? "Folder" : tracker_metadata_lookup (metadata, "File:Mime"),
+						tracker_metadata_lookup (metadata, "File:Size"),
 						is_dir ? "1" : "0",
 						is_symlink ? "1" : "0",
 						"0", /* offset */
-						g_hash_table_lookup (metadata, "File:Modified"),
+						tracker_metadata_lookup (metadata, "File:Modified"),
 						"0", /* aux ID */
 						NULL);
 

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-db.h	Tue Jul 29 12:05:42 2008
@@ -24,6 +24,7 @@
 
 #include <libtracker-common/tracker-ontology.h>
 #include <libtracker-db/tracker-db-interface.h>
+#include "tracker-metadata.h"
 
 G_BEGIN_DECLS
 
@@ -33,11 +34,11 @@
 
 guint    tracker_db_check_service      (TrackerService     *service,
 					const gchar        *path,
-					GHashTable         *metadata);
+					TrackerMetadata    *metadata);
 gboolean tracker_db_create_service     (TrackerService     *service,
                                         guint32             id,
                                         const gchar        *path,
-                                        GHashTable         *metadata);
+					TrackerMetadata    *metadata);
 void     tracker_db_set_metadata       (TrackerService     *service,
                                         guint32             id,
                                         TrackerField       *field,

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-module.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-module.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-module.c	Tue Jul 29 12:05:42 2008
@@ -115,7 +115,7 @@
 	g_slice_free (TrackerFile, file);
 }
 
-GHashTable *
+TrackerMetadata *
 tracker_indexer_module_file_get_metadata (GModule     *module,
 					  TrackerFile *file)
 {

Modified: branches/indexer-split/src/tracker-indexer/tracker-indexer-module.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-indexer-module.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-indexer-module.h	Tue Jul 29 12:05:42 2008
@@ -24,6 +24,7 @@
 
 #include <glib.h>
 #include "tracker-module.h"
+#include "tracker-metadata.h"
 
 G_BEGIN_DECLS
 
@@ -40,7 +41,7 @@
 void                    tracker_indexer_module_file_free              (GModule     *module,
 								       TrackerFile *file);
 
-GHashTable *            tracker_indexer_module_file_get_metadata      (GModule     *module,
+TrackerMetadata *       tracker_indexer_module_file_get_metadata      (GModule     *module,
 								       TrackerFile *file);
 gchar *                 tracker_indexer_module_file_get_text          (GModule     *module,
 								       TrackerFile *file);

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	Tue Jul 29 12:05:42 2008
@@ -695,31 +695,14 @@
 }
 
 static void
-index_metadata_foreach (gpointer key,
-			gpointer value,
-			gpointer user_data)
+index_metadata_item (TrackerField        *field,
+		     gpointer             value,
+		     MetadataForeachData *data)
 {
-	TrackerField *field;
-	MetadataForeachData *data;
 	gchar *parsed_value;
 	gchar **arr;
-	gint throttle;
 	gint i;
 
-	if (!value) {
-		return;
-	}
-
-	data = (MetadataForeachData *) user_data;
-
-	/* Throttle indexer, value 9 is from older code, why 9? */
-	throttle = tracker_config_get_throttle (data->config);
-	if (throttle > 9) {
-		indexer_throttle (data->config, throttle * 100);
-	}
-
-	field = tracker_ontology_get_field_def ((gchar *) key);
-
 	parsed_value = tracker_parser_text_to_string ((gchar *) value,
 						      data->language,
 						      tracker_config_get_max_word_length (data->config),
@@ -744,10 +727,44 @@
 }
 
 static void
-index_metadata (TrackerIndexer *indexer,
-		guint32         id,
-		TrackerService *service,
-		GHashTable     *metadata)
+index_metadata_foreach (TrackerField *field,
+			gpointer      value,
+			gpointer      user_data)
+{
+	MetadataForeachData *data;
+	gint throttle;
+
+	if (!value) {
+		return;
+	}
+
+	data = (MetadataForeachData *) user_data;
+
+	/* Throttle indexer, value 9 is from older code, why 9? */
+	throttle = tracker_config_get_throttle (data->config);
+	if (throttle > 9) {
+		indexer_throttle (data->config, throttle * 100);
+	}
+
+	if (!tracker_field_get_multiple_values (field)) {
+		index_metadata_item (field, value, data);
+	} else {
+		GList *list;
+
+		list = (GList *) value;
+
+		while (list) {
+			index_metadata_item (field, list->data, data);
+			list = list->next;
+		}
+	}
+}
+
+static void
+index_metadata (TrackerIndexer  *indexer,
+		guint32          id,
+		TrackerService  *service,
+		TrackerMetadata *metadata)
 {
 	MetadataForeachData data;
 
@@ -757,7 +774,7 @@
 	data.service = service;
 	data.id = id;
 
-	g_hash_table_foreach (metadata, index_metadata_foreach, &data);
+	tracker_metadata_foreach (metadata, index_metadata_foreach, &data);
 
 	schedule_flush (indexer, FALSE);
 }
@@ -804,7 +821,7 @@
 process_file (TrackerIndexer *indexer,
 	      PathInfo       *info)
 {
-	GHashTable *metadata;
+	TrackerMetadata *metadata;
 
 	g_debug ("Processing file:'%s'", info->file->path);
 
@@ -873,7 +890,7 @@
 
 		}
 
-		g_hash_table_destroy (metadata);
+		tracker_metadata_free (metadata);
 	}
 
 	indexer->private->items_processed++;

Modified: branches/indexer-split/src/tracker-indexer/tracker-metadata.c
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-metadata.c	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-metadata.c	Tue Jul 29 12:05:42 2008
@@ -1,6 +1,8 @@
-/* Tracker - indexer and metadata database engine
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
- *
+ * Copyright (C) 2008, Nokia
+
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
  * License as published by the Free Software Foundation; either
@@ -17,289 +19,157 @@
  * Boston, MA  02110-1301, USA.
  */
 
-#include "config.h"
-
-#include <unistd.h>
-#include <string.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#ifdef OS_WIN32
-#include <conio.h>
-#else
-#include <sys/resource.h>
-#endif
+#include <glib.h>
+#include <libtracker-common/tracker-ontology.h>
+#include "tracker-metadata.h"
 
-#include <glib/gstdio.h>
+struct TrackerMetadata {
+        GHashTable *table;
+};
 
-#include <libtracker-common/tracker-log.h>
-#include <libtracker-common/tracker-file-utils.h>
-#include <libtracker-common/tracker-ontology.h>
-#include <libtracker-common/tracker-os-dependant.h>
-#include <libtracker-common/tracker-utils.h>
+TrackerMetadata *
+tracker_metadata_new (void)
+{
+        TrackerMetadata *metadata;
 
-#include "tracker-metadata.h"
+        metadata = g_slice_new (TrackerMetadata);
+        metadata->table = g_hash_table_new_full (g_direct_hash,
+                                                 g_direct_equal,
+                                                 (GDestroyNotify) g_object_unref,
+                                                 NULL);
+        return metadata;
+}
 
-gchar *
-tracker_metadata_get_text_file (const gchar *uri, 
-                                const gchar *mime)
+static gboolean
+remove_metadata_foreach (gpointer key,
+                         gpointer value,
+                         gpointer user_data)
 {
-	gchar *text_filter_file = NULL;
-	gchar *service_type;
+        TrackerField *field;
 
-	/* No need to filter text based files - index them directly */
-	service_type = tracker_ontology_get_service_type_for_mime (mime);
+        field = (TrackerField *) key;
 
-	if (!strcmp (service_type, "Text") || 
-            !strcmp (service_type, "Development")) {
-		g_free (service_type);
-
-		return g_filename_from_utf8 (uri, -1, NULL, NULL, NULL);
-	} else {
-		gchar *text_filter_file;
-                gchar *str;
-                
-#ifdef OS_WIN32
-		str = g_strconcat (mime, "_filter.bat", NULL);
-#else
-		str = g_strconcat (mime, "_filter", NULL);
-#endif
-                
-		text_filter_file = g_build_filename (LIBDIR, 
-                                                     "tracker", 
-                                                     "filters", 
-                                                     str,
-                                                     NULL);
-                g_free (str);
-	}
-
-	if (text_filter_file && 
-            g_file_test (text_filter_file, G_FILE_TEST_EXISTS)) {
-		gchar *argv[4];
-                gchar *filename;
-                gchar *sys_tmp_dir;
-		gchar *temp_filename;
-		gint   fd;
-
-                filename = g_strdup_printf ("tracker-%s", g_get_user_name ());
-                sys_tmp_dir = g_build_filename (g_get_tmp_dir (), filename, NULL);
-                g_free (filename);
-                
-		temp_filename = g_build_filename (sys_tmp_dir,
-                                                  "tmp_text_file_XXXXXX",
-                                                  NULL);
-                g_free (sys_tmp_dir);
-
-		fd = g_mkstemp (temp_filename);
-
-		if (fd == -1) {
-			g_warning ("Could not open a temporary file:'%s'", temp_filename);
-                        g_free (temp_filename);
-			return NULL;
-		} else {
-			close (fd);
-		}
-
-		argv[0] = g_strdup (text_filter_file);
-		argv[1] = g_filename_from_utf8 (uri, -1, NULL, NULL, NULL);
-		argv[2] = g_strdup (temp_filename);
-		argv[3] = NULL;
-
-		g_free (text_filter_file);
-
-		if (!argv[1]) {
-			g_critical ("uri could not be converted to locale format");
-			g_free (argv[0]);
-			g_free (argv[2]);
-			return NULL;
-		}
-
-		g_message ("Extracting text for:'%s' using filter:'%s'",
-                           argv[1], argv[0]);
-
-		if (tracker_spawn (argv, 30, NULL, NULL)) {
-			g_free (argv[0]);
-			g_free (argv[1]);
-			g_free (argv[2]);
-
-			if (tracker_file_is_valid (temp_filename)) {
-				return temp_filename;
-			} else {
-				g_free (temp_filename);
-				return NULL;
-			}
-		} else {
-			g_free (temp_filename);
-
-			g_free (argv[0]);
-			g_free (argv[1]);
-			g_free (argv[2]);
-
-			return NULL;
-		}
-	} else {
-		g_free (text_filter_file);
-	}
+        if (tracker_field_get_multiple_values (field)) {
+                GList *list = (GList *) value;
 
-	return NULL;
+                switch (tracker_field_get_data_type (field)) {
+                case TRACKER_FIELD_TYPE_KEYWORD:
+                case TRACKER_FIELD_TYPE_INDEX:
+                case TRACKER_FIELD_TYPE_FULLTEXT:
+                case TRACKER_FIELD_TYPE_STRING:
+                        g_list_foreach (list, (GFunc) g_free, NULL);
+                        /* pass through */
+                case TRACKER_FIELD_TYPE_INTEGER:
+                case TRACKER_FIELD_TYPE_DOUBLE:
+                case TRACKER_FIELD_TYPE_DATE:
+                        g_list_free (list);
+                        break;
+                case TRACKER_FIELD_TYPE_BLOB:
+                case TRACKER_FIELD_TYPE_STRUCT:
+                case TRACKER_FIELD_TYPE_LINK:
+                default:
+                        /* Unhandled for now */
+                        break;
+                }
+        } else {
+                switch (tracker_field_get_data_type (field)) {
+                case TRACKER_FIELD_TYPE_KEYWORD:
+                case TRACKER_FIELD_TYPE_INDEX:
+                case TRACKER_FIELD_TYPE_FULLTEXT:
+                case TRACKER_FIELD_TYPE_STRING:
+                        g_free (value);
+                        break;
+                case TRACKER_FIELD_TYPE_INTEGER:
+                case TRACKER_FIELD_TYPE_DOUBLE:
+                case TRACKER_FIELD_TYPE_DATE:
+                        /* Nothing to free here */
+                        break;
+                case TRACKER_FIELD_TYPE_BLOB:
+                case TRACKER_FIELD_TYPE_STRUCT:
+                case TRACKER_FIELD_TYPE_LINK:
+                default:
+                        /* Unhandled for now */
+                        break;
+                }
+        }
+
+        return TRUE;
 }
 
-gchar *
-tracker_metadata_get_thumbnail (const gchar *path, 
-                                const gchar *mime, 
-                                const gchar *size)
+void
+tracker_metadata_free (TrackerMetadata *metadata)
+{
+        g_hash_table_foreach_remove (metadata->table,
+                                     remove_metadata_foreach,
+                                     NULL);
+        g_hash_table_destroy (metadata->table);
+        g_slice_free (TrackerMetadata, metadata);
+}
+
+void
+tracker_metadata_insert (TrackerMetadata *metadata,
+                         const gchar     *field_name,
+                         gpointer         value)
 {
-	gchar *thumbnail;
-	gchar *argv[5];
-	gint   exit_status;
-
-	argv[0] = g_strdup ("tracker-thumbnailer");
-	argv[1] = g_filename_from_utf8 (path, -1, NULL, NULL, NULL);
-	argv[2] = g_strdup (mime);
-	argv[3] = g_strdup (size);
-	argv[4] = NULL;
-
-	if (!tracker_spawn (argv, 10, &thumbnail, &exit_status)) {
-		thumbnail = NULL;
-	} else if (exit_status != EXIT_SUCCESS) {
-		thumbnail = NULL;
-	} else {
-		g_message ("Managed to get thumbnail:'%s' for:'%s' with mime:'%s' and size:'%s'", 
-                           thumbnail,
-                           argv[1],
-                           argv[2],
-                           argv[3]);
-	}
-
-	g_free (argv[0]);
-	g_free (argv[1]);
-	g_free (argv[2]);
-	g_free (argv[3]);
+        TrackerField *field;
 
-	return thumbnail;
+        field = tracker_ontology_get_field_def (field_name);
+
+        g_return_if_fail (tracker_field_get_multiple_values (field) == FALSE);
+
+        g_hash_table_insert (metadata->table,
+                             g_object_ref (field),
+                             value);
 }
 
 void
-tracker_metadata_get_embedded (const gchar *uri, 
-                               const gchar *mime, 
-                               GHashTable  *table)
+tracker_metadata_insert_multiple_values (TrackerMetadata *metadata,
+                                         const gchar     *field_name,
+                                         GList           *list)
 {
-	gboolean   success;
-	gchar     *argv[4];
-	gchar     *output;
-	gchar    **values;
-	gchar     *service_type;
-	gint       i;
-
-	if (!uri || !mime || !table) {
-		return;
-	}
-
-	service_type = tracker_ontology_get_service_type_for_mime (mime);
-	if (!service_type ) {
-		return;
-	}
-
-	if (!tracker_ontology_service_type_has_metadata (service_type)) {
-		g_free (service_type);
-		return;
-	}
-
-	/* We extract metadata out of process using pipes */
-	argv[0] = g_strdup ("tracker-extract");
-	argv[1] = g_filename_from_utf8 (uri, -1, NULL, NULL, NULL);
-	argv[2] = g_locale_from_utf8 (mime, -1, NULL, NULL, NULL);
-	argv[3] = NULL;
-
-	if (!argv[1]) {
-		g_critical ("Could not create UTF-8 uri from:'%s'", uri);
-
-		g_free (argv[0]);
-		g_free (argv[1]);
-		g_free (argv[2]);
-		return;
-	}
-
-	if (!argv[2]) {
-		g_critical ("Could not create UTF-8 mime from:'%s'", mime);
-
-		g_free (argv[0]);
-		g_free (argv[1]);
-		g_free (argv[2]);
-		return;
-	}
-
-	success = tracker_spawn (argv, 10, &output, NULL);
-
-	g_free (argv[0]);
-	g_free (argv[1]);
-	g_free (argv[2]);
+        TrackerField *field;
 
-	if (!success || !output) {
-		return;
-        }
+        field = tracker_ontology_get_field_def (field_name);
 
-	/* Parse returned stdout and extract keys and associated
-         * metadata values 
-         */
-	values = g_strsplit_set (output, ";", -1);
-
-	for (i = 0; values[i]; i++) {
-		const gchar *name, *value;
-		gchar       *meta_data, *sep;
-		gchar       *utf_value;
+        g_return_if_fail (tracker_field_get_multiple_values (field) == TRUE);
 
-		meta_data = g_strstrip (values[i]);
-		sep = strchr (meta_data, '=');
+        g_hash_table_insert (metadata->table,
+                             g_object_ref (field),
+                             list);
+}
 
-		if (!sep) {
-			continue;
-                }
+gpointer
+tracker_metadata_lookup (TrackerMetadata *metadata,
+                         const gchar     *field_name)
+{
+        TrackerField *field;
 
-		/* Zero out the separator, so we get NULL-terminated
-                 * name and value 
-                 */
-		sep[0] = '\0';
-		name = meta_data;
-		value = sep + 1;
+        field = tracker_ontology_get_field_def (field_name);
 
-		if (!name || !value) {
-			continue;
-                }
+        g_return_val_if_fail (tracker_field_get_multiple_values (field) == FALSE, NULL);
 
-		if (g_hash_table_lookup (table, name)) {
-			continue;
-                }
+        return g_hash_table_lookup (metadata->table, field);
+}
 
-		if (!g_utf8_validate (value, -1, NULL)) {
-			utf_value = g_locale_to_utf8 (value, -1, NULL, NULL, NULL);
-		} else {
-			utf_value = g_strdup (value);
-		}
-
-		if (!utf_value) {
-                        GSList *list;
-                        gchar  *key;
-                        
-                        key = g_strdup (name);
-                        
-                        /* Code is taken from
-                         * tracker_add_metadata_to_table() in
-                         * trackerd/tracker-utils.c
-                         *
-                         * This was put directly in here because we
-                         * need it for the tracker-indexer as part of
-                         * the indexer-split move for
-                         * tracker-metadata.[ch].
-                         *
-                         * -Martyn
-                         */
-                        list = g_hash_table_lookup (table, key);
-                        list = g_slist_prepend (list, utf_value);
-                        g_hash_table_steal (table, key);
-                        g_hash_table_insert (table, key, list);
-                }
-	}
+G_CONST_RETURN GList *
+tracker_metadata_lookup_multiple_values (TrackerMetadata *metadata,
+                                         const gchar     *field_name)
+{
+        TrackerField *field;
+
+        field = tracker_ontology_get_field_def (field_name);
+
+        g_return_val_if_fail (tracker_field_get_multiple_values (field) == TRUE, NULL);
 
-	g_strfreev (values);
-	g_free (output);
+        return g_hash_table_lookup (metadata->table, field);
+}
+
+void
+tracker_metadata_foreach (TrackerMetadata        *metadata,
+                          TrackerMetadataForeach  func,
+                          gpointer                user_data)
+{
+        g_hash_table_foreach (metadata->table,
+                              (GHFunc) func,
+                              user_data);
 }

Modified: branches/indexer-split/src/tracker-indexer/tracker-metadata.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-metadata.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-metadata.h	Tue Jul 29 12:05:42 2008
@@ -1,7 +1,8 @@
 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
-/* 
+/*
  * Copyright (C) 2006, Mr Jamie McCracken (jamiemcc gnome org)
- *
+ * Copyright (C) 2008, Nokia
+
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public
  * License as published by the Free Software Foundation; either
@@ -22,20 +23,32 @@
 #define __TRACKER_METADATA_H__
 
 #include <glib.h>
+#include <libtracker-common/tracker-field.h>
 
-#define THUMB_SMALL "128"
-#define THUMB_LARGE "640"
-
-G_BEGIN_DECLS
+typedef struct TrackerMetadata TrackerMetadata;
 
-gchar *tracker_metadata_get_text_file       (const gchar   *uri,
-					     const gchar   *mime);
-gchar *tracker_metadata_get_thumbnail       (const gchar   *path,
-					     const gchar   *mime,
-					     const gchar   *size);
-void   tracker_metadata_get_embedded        (const gchar   *uri,
-					     const gchar   *mime,
-					     GHashTable    *table);
+typedef void (* TrackerMetadataForeach) (TrackerField *field,
+					 gpointer      value,
+					 gpointer      user_data);
+
+TrackerMetadata *      tracker_metadata_new    (void);
+void                   tracker_metadata_free   (TrackerMetadata *metadata);
+
+void                   tracker_metadata_insert                 (TrackerMetadata *metadata,
+								const gchar     *field_name,
+								gpointer         value);
+void                   tracker_metadata_insert_multiple_values (TrackerMetadata *metadata,
+								const gchar     *field_name,
+								GList           *list);
+
+gpointer               tracker_metadata_lookup                 (TrackerMetadata *metadata,
+								const gchar     *field_name);
+G_CONST_RETURN GList * tracker_metadata_lookup_multiple_values (TrackerMetadata *metadata,
+								const gchar     *field_name);
+
+void                   tracker_metadata_foreach (TrackerMetadata        *metadata,
+						 TrackerMetadataForeach  func,
+						 gpointer                user_data);
 
 G_END_DECLS
 

Modified: branches/indexer-split/src/tracker-indexer/tracker-module.h
==============================================================================
--- branches/indexer-split/src/tracker-indexer/tracker-module.h	(original)
+++ branches/indexer-split/src/tracker-indexer/tracker-module.h	Tue Jul 29 12:05:42 2008
@@ -23,6 +23,7 @@
 G_BEGIN_DECLS
 
 #include <glib.h>
+#include <tracker-indexer/tracker-metadata.h>
 
 typedef struct TrackerFile TrackerFile;
 
@@ -32,18 +33,18 @@
 	gpointer  data;
 };
 
-typedef void          (* TrackerModuleInit)               (void);
-typedef void          (* TrackerModuleShutdown)           (void);
+typedef void              (* TrackerModuleInit)               (void);
+typedef void              (* TrackerModuleShutdown)           (void);
 
-typedef const gchar * (* TrackerModuleGetNameFunc)        (void);
-typedef gchar **      (* TrackerModuleGetDirectoriesFunc) (void);
+typedef const gchar *     (* TrackerModuleGetNameFunc)        (void);
+typedef gchar **          (* TrackerModuleGetDirectoriesFunc) (void);
 
-typedef gpointer      (* TrackerModuleFileGetDataFunc)  (const gchar *path);
-typedef void          (* TrackerModuleFileFreeDataFunc) (gpointer     data);
+typedef gpointer          (* TrackerModuleFileGetDataFunc)  (const gchar *path);
+typedef void              (* TrackerModuleFileFreeDataFunc) (gpointer     data);
 
-typedef GHashTable *  (* TrackerModuleFileGetMetadataFunc) (TrackerFile *file);
-typedef gchar *       (* TrackerModuleFileGetText)         (TrackerFile *path);
-typedef gboolean      (* TrackerModuleFileIterContents)    (TrackerFile *path);
+typedef TrackerMetadata * (* TrackerModuleFileGetMetadataFunc) (TrackerFile *file);
+typedef gchar *           (* TrackerModuleFileGetText)         (TrackerFile *path);
+typedef gboolean          (* TrackerModuleFileIterContents)    (TrackerFile *path);
 
 
 void                   tracker_module_init                   (void);
@@ -54,7 +55,7 @@
 gpointer               tracker_module_file_get_data  (const gchar *path);
 void                   tracker_module_file_free_data (gpointer     file_data);
 
-GHashTable *           tracker_module_file_get_metadata  (TrackerFile *file);
+TrackerMetadata *      tracker_module_file_get_metadata  (TrackerFile *file);
 gchar *                tracker_module_file_get_text      (TrackerFile *file);
 gboolean               tracker_module_file_iter_contents (TrackerFile *file);
 



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