Index: src/trackerd/tracker-process-requests.c =================================================================== --- src/trackerd/tracker-process-requests.c (revision 1293) +++ src/trackerd/tracker-process-requests.c (working copy) @@ -206,7 +206,11 @@ case DBUS_ACTION_METADATA_GET_REGISTERED_CLASSES: tracker_dbus_method_metadata_get_registered_classes (rec); break; - + + case DBUS_ACTION_METADATA_GET_UNIQUE_VALUES: + tracker_dbus_method_metadata_get_unique_values (rec); + break; + case DBUS_ACTION_KEYWORDS_GET_LIST: tracker->request_waiting = TRUE; tracker->grace_period = 2; Index: src/trackerd/tracker-dbus.c =================================================================== --- src/trackerd/tracker-dbus.c (revision 1293) +++ src/trackerd/tracker-dbus.c (working copy) @@ -445,6 +445,13 @@ + } else if (dbus_message_is_method_call (message, TRACKER_INTERFACE_METADATA, TRACKER_METHOD_METADATA_GET_UNIQUE_VALUES)) { + + dbus_message_ref (message); + rec->action = DBUS_ACTION_METADATA_GET_UNIQUE_VALUES; + + + } else if (dbus_message_is_method_call (message, TRACKER_INTERFACE_KEYWORDS, TRACKER_METHOD_KEYWORDS_GET_LIST)) { dbus_message_ref (message); Index: src/trackerd/tracker-dbus.h =================================================================== --- src/trackerd/tracker-dbus.h (revision 1293) +++ src/trackerd/tracker-dbus.h (working copy) @@ -59,6 +59,7 @@ #define TRACKER_METHOD_METADATA_GET_REGISTERED_TYPES "GetRegisteredTypes" #define TRACKER_METHOD_METADATA_GET_WRITEABLE_TYPES "GetWriteableTypes" #define TRACKER_METHOD_METADATA_GET_REGISTERED_CLASSES "GetRegisteredClasses" +#define TRACKER_METHOD_METADATA_GET_UNIQUE_VALUES "GetUniqueValues" /* keywords interface */ #define TRACKER_METHOD_KEYWORDS_GET_LIST "GetList" @@ -130,6 +131,7 @@ DBUS_ACTION_METADATA_GET_REGISTERED_TYPES, DBUS_ACTION_METADATA_GET_WRITEABLE_TYPES, DBUS_ACTION_METADATA_GET_REGISTERED_CLASSES, + DBUS_ACTION_METADATA_GET_UNIQUE_VALUES, DBUS_ACTION_KEYWORDS_GET_LIST, DBUS_ACTION_KEYWORDS_GET, Index: src/trackerd/tracker-dbus-metadata.c =================================================================== --- src/trackerd/tracker-dbus-metadata.c (revision 1293) +++ src/trackerd/tracker-dbus-metadata.c (working copy) @@ -568,3 +568,63 @@ dbus_connection_send (rec->connection, reply, NULL); dbus_message_unref (reply); } + + +void +tracker_dbus_method_metadata_get_unique_values (DBusRec *rec) +{ + DBConnection *db_con; + DBusError dbus_error; + DBusMessage *reply; + gchar *meta_type; + gchar **array; + gint limit, offset; + int row_count; + char ***res; + +/* + + + + + + + +*/ + + g_return_if_fail (rec && rec->user_data); + + db_con = rec->user_data; + + dbus_error_init (&dbus_error); + if (!dbus_message_get_args (rec->message, NULL, + DBUS_TYPE_STRING, &meta_type, + DBUS_TYPE_INT32, &offset, + DBUS_TYPE_INT32, &limit, + DBUS_TYPE_INVALID)) { + tracker_set_error (rec, "DBusError: %s;%s", dbus_error.name, dbus_error.message); + dbus_error_free (&dbus_error); + return; + } + + res = tracker_db_get_unique_metadata_values (db_con, meta_type, offset, limit); + + array = NULL; + row_count = 0; + + if (res) { + array = tracker_get_query_result_as_array (res, &row_count); + tracker_db_free_result (res); + } + + reply = dbus_message_new_method_return (rec->message); + + dbus_message_append_args (reply, + DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &array, row_count, + DBUS_TYPE_INVALID); + + tracker_free_array (array, row_count); + + dbus_connection_send (rec->connection, reply, NULL); + dbus_message_unref (reply); +} Index: src/trackerd/tracker-dbus-metadata.h =================================================================== --- src/trackerd/tracker-dbus-metadata.h (revision 1293) +++ src/trackerd/tracker-dbus-metadata.h (working copy) @@ -33,4 +33,6 @@ void tracker_dbus_method_metadata_get_writeable_types (DBusRec *rec); void tracker_dbus_method_metadata_get_registered_classes (DBusRec *rec); +void tracker_dbus_method_metadata_get_unique_values (DBusRec *rec); + #endif Index: src/trackerd/tracker-db-sqlite.c =================================================================== --- src/trackerd/tracker-db-sqlite.c (revision 1293) +++ src/trackerd/tracker-db-sqlite.c (working copy) @@ -2980,6 +2980,48 @@ } +char *** +tracker_db_get_unique_metadata_values (DBConnection *db_con, const char *meta_type, int offset, int limit) +{ + FieldDef *def; + char *str_offset, *str_limit, *str_id; + char ***res; + + g_return_val_if_fail ((meta_type), NULL); + + def = tracker_db_get_field_def (db_con, meta_type); + + if (!def) { + tracker_error ("ERROR: metadata not found for type %s", meta_type); + return NULL; + } + + str_offset = tracker_int_to_str (offset); + str_limit = tracker_int_to_str (limit); + str_id = tracker_uint_to_str (def->id); + + switch (def->type) { + + case DATA_INDEX: + case DATA_STRING: + case DATA_DOUBLE: + res = tracker_exec_proc (db_con, "GetMetadataValues", str_id, str_offset, str_limit, NULL); break; + + case DATA_INTEGER: + case DATA_DATE: + res = tracker_exec_proc (db_con, "GetMetadataNumericValues", str_id, str_offset, str_limit, NULL); break; + + case DATA_KEYWORD: + res = tracker_exec_proc (db_con, "GetMetadataKeywordValues", str_id, str_offset, str_limit, NULL); break; + + default: tracker_error ("ERROR: metadata could not be retrieved as type %d is not supported", def->type); res = NULL; + } + + return res; + +} + + static char * remove_value (const char *str, const char *del_str) { Index: src/trackerd/tracker-db-sqlite.h =================================================================== --- src/trackerd/tracker-db-sqlite.h (revision 1293) +++ src/trackerd/tracker-db-sqlite.h (working copy) @@ -139,6 +139,8 @@ char * tracker_db_set_metadata (DBConnection *db_con, const char *service, const char *id, const char *key, char **values, int length, gboolean do_backup); void tracker_db_set_single_metadata (DBConnection *db_con, const char *service, const char *id, const char *key, const char *value, gboolean do_backup); +char *** tracker_db_get_unique_metadata_values (DBConnection *db_con, const char *meta_type, int offset, int limit); + void tracker_db_insert_embedded_metadata (DBConnection *db_con, const char *service, const char *id, const char *key, char **values, int length, GHashTable *table); void tracker_db_insert_single_embedded_metadata (DBConnection *db_con, const char *service, const char *id, const char *key, const char *value, GHashTable *table); Index: src/libtracker/tracker.h =================================================================== --- src/libtracker/tracker.h (revision 1293) +++ src/libtracker/tracker.h (working copy) @@ -125,8 +125,8 @@ char ** tracker_metadata_get_registered_types (TrackerClient *client, const char *classname, GError **error); char ** tracker_metadata_get_writeable_types (TrackerClient *client, const char *classname, GError **error); char ** tracker_metadata_get_registered_classes (TrackerClient *client, GError **error); +char ** tracker_metadata_get_unique_values (TrackerClient *client, const char *meta_type, int offset, int max_hits, GError **error); - GPtrArray * tracker_keywords_get_list (TrackerClient *client, ServiceType service, GError **error); char ** tracker_keywords_get (TrackerClient *client, ServiceType service, const char *id, GError **error); void tracker_keywords_add (TrackerClient *client, ServiceType service, const char *id, char **values, GError **error); @@ -184,8 +184,8 @@ void tracker_metadata_get_registered_types_async (TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data); void tracker_metadata_get_writeable_types_async (TrackerClient *client, const char *classname, TrackerArrayReply callback, gpointer user_data); void tracker_metadata_get_registered_classes_async (TrackerClient *client, TrackerArrayReply callback, gpointer user_data); +void tracker_metadata_get_unique_values_async (TrackerClient *client, const char *meta_type, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data); - void tracker_keywords_get_list_async (TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data); void tracker_keywords_get_async (TrackerClient *client, ServiceType service, const char *id, TrackerArrayReply callback, gpointer user_data); void tracker_keywords_add_async (TrackerClient *client, ServiceType service, const char *id, char **values, TrackerVoidReply callback, gpointer user_data); Index: src/libtracker/tracker.c =================================================================== --- src/libtracker/tracker.c (revision 1293) +++ src/libtracker/tracker.c (working copy) @@ -511,9 +511,19 @@ +char ** +tracker_metadata_get_unique_values (TrackerClient *client, const char *meta_type, int offset, int max_hits, GError **error) +{ + char **array = NULL; + if (!org_freedesktop_Tracker_Metadata_get_unique_values (client->proxy_metadata, meta_type, offset, max_hits, &array, &*error)) { + return NULL; + } + return array; +} + GPtrArray * tracker_keywords_get_list (TrackerClient *client, ServiceType service, GError **error) { @@ -1099,9 +1109,23 @@ +void +tracker_metadata_get_unique_values_async (TrackerClient *client, const char *meta_type, int offset, int max_hits, TrackerArrayReply callback, gpointer user_data) +{ + + ArrayCallBackStruct *callback_struct; + callback_struct = g_new (ArrayCallBackStruct, 1); + callback_struct->callback = callback; + callback_struct->data = user_data; + org_freedesktop_Tracker_Metadata_get_unique_values_async (client->proxy_search, meta_type, offset, max_hits, tracker_array_reply, callback_struct); + +} + + + void tracker_keywords_get_list_async (TrackerClient *client, ServiceType service, TrackerGPtrArrayReply callback, gpointer user_data) { Index: data/sqlite-stored-procs.sql =================================================================== --- data/sqlite-stored-procs.sql (revision 1293) +++ data/sqlite-stored-procs.sql (working copy) @@ -83,6 +83,10 @@ GetMetadata SELECT MetaDataDisplay FROM ServiceMetaData WHERE ServiceID = ? AND MetaDataID = ?; GetMetadataNumeric SELECT MetaDataValue FROM ServiceNumericMetaData WHERE ServiceID = ? AND MetaDataID = ?; +GetMetadataKeywordValues SELECT DISTINCT MetaDataValue FROM ServiceKeywordMetaData WHERE MetaDataID = ? LIMIT ?,?; +GetMetadataValues SELECT DISTINCT MetaDataDisplay FROM ServiceMetaData WHERE MetaDataID = ? LIMIT ?,?; +GetMetadataNumericValues SELECT DISTINCT MetaDataValue FROM ServiceNumericMetaData WHERE MetaDataID = ? LIMIT ?,?; + SetMetadataKeyword INSERT INTO ServiceKeywordMetaData (ServiceID, MetaDataID, MetaDataValue) VALUES (?,?,?); SetMetadata INSERT INTO ServiceMetaData (ServiceID, MetaDataID, MetaDataValue, MetaDataDisplay) VALUES (?,?,?,?); SetMetadataNumeric INSERT INTO ServiceNumericMetaData (ServiceID, MetaDataID, MetaDataValue) VALUES (?,?,?); Index: data/tracker-introspect.xml =================================================================== --- data/tracker-introspect.xml (revision 1293) +++ data/tracker-introspect.xml (working copy) @@ -220,6 +220,14 @@ + + + + + + + +