tracker r1959 - in branches/indexer-split: . src/tracker-indexer src/tracker-indexer/modules
- From: carlosg svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r1959 - in branches/indexer-split: . src/tracker-indexer src/tracker-indexer/modules
- Date: Tue, 29 Jul 2008 12:05:42 +0000 (UTC)
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]