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 @@
+
+
+
+
+
+
+
+