Hi,
fin attached a new version of the patch. This one uses
TrackerDBResultSet (guess this is what you meant by new db interface)
and works fine with current trunk head.
Iago
El jue, 24-04-2008 a las 00:39 -0400, Jamie McCracken escribió:
> Patch is mostly ok but needs to be updated to use new db interface in
> order to work properly
>
>
> jamie
>
>
> On Wed, 2008-04-23 at 17:46 +0200, [EMAIL PROTECTED] wrote:
> > Hi,
> >
> > thanks for the patch! I checked it out and found this:
> >
> > the patch made trackerd segfault. tracker_db_get_unique_metadata_values
> > converted offset and limit parameters to string, but did not do the same
> > for the id parameter, making it fail later when calling
> > sqlite3_bind_text.
> >
> > Also, I think it passed the variable parameter list to tracker_exec_proc
> > in a wrong way, for it seemed to be passing the parameter count (3) as
> > the first parameter.
> >
> > I've fixed the first problem by using tracker_uint_to_str() and the
> > second by removing that parameter and adding a trailing NULL parameter
> > instead. I've attached the new version of the patch.
> >
> > Unfortunately, after fixing this, I found that the query does not seem
> > to return any results, I always get am empty array as return value... :(
> >
> > I wonder if this might be related to this other bug I filed today,
> > though at least in that case the query did work for some keys:
> >
> > http://bugzilla.gnome.org/show_bug.cgi?id=529516
> >
> > Iago
> >
> >
> > >
> > > Hello,
> > >
> > > The attached patch adds "GetUniqueValues" which should be what are looking
> > > for.
> > >
> > > Mikael
> > >
> > >
> > > ________________________________________
> > > From: [EMAIL PROTECTED] [EMAIL PROTECTED] On
> > > Behalf Of Iago Toral Quiroga [EMAIL PROTECTED]
> > > Sent: Wednesday, April 23, 2008 11:15 AM
> > > To: [email protected]
> > > Subject: [Tracker] Querying values of metadata keys
> > >
> > > Hi all,
> > >
> > > I'd like to know how I can get the list of different values available
> > > for a given metadata key. For example, I'd like to get the list of
> > > different music albums (Audio:Album metadata key).
> > >
> > > Thanks in advance!
> > >
> > > Iago
> > >
> > > _______________________________________________
> > > tracker-list mailing list
> > > [email protected]
> > > http://mail.gnome.org/mailman/listinfo/tracker-list
> > >
> > _______________________________________________
> > tracker-list mailing list
> > [email protected]
> > http://mail.gnome.org/mailman/listinfo/tracker-list
>
>
>
Index: src/trackerd/tracker-process-requests.c
===================================================================
--- src/trackerd/tracker-process-requests.c (revision 1307)
+++ 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 1307)
+++ 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 1307)
+++ 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 1307)
+++ src/trackerd/tracker-dbus-metadata.c (working copy)
@@ -568,3 +568,62 @@
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;
+ TrackerDBResultSet *result_set;
+/*
+ <!-- returns an array of all unique values of given metadata type -->
+ <method name="GetUniqueValues">
+ <arg type="s" name="meta_type" direction="in" />
+ <arg type="i" name="offset" direction="in" />
+ <arg type="i" name="max_hits" direction="in" />
+ <arg type="as" name="result" direction="out" />
+ </method>
+*/
+
+ 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;
+ }
+
+ result_set = tracker_db_get_unique_metadata_values (db_con, meta_type, offset, limit);
+
+ array = NULL;
+ row_count = 0;
+
+ if (result_set) {
+ array = tracker_get_query_result_as_array (result_set, &row_count);
+ g_object_unref (result_set);
+ }
+
+ 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 1307)
+++ 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 1307)
+++ src/trackerd/tracker-db-sqlite.c (working copy)
@@ -2980,6 +2980,47 @@
}
+TrackerDBResultSet *
+tracker_db_get_unique_metadata_values (DBConnection *db_con, const char *meta_type, int offset, int limit)
+{
+ FieldDef *def;
+ char *str_offset, *str_limit;
+ TrackerDBResultSet *result_set;
+
+ 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);
+
+ switch (def->type) {
+
+ case DATA_INDEX:
+ case DATA_STRING:
+ case DATA_DOUBLE:
+ result_set = tracker_exec_proc (db_con, "GetMetadataValues", def->id, str_offset, str_limit, NULL); break;
+
+ case DATA_INTEGER:
+ case DATA_DATE:
+ result_set = tracker_exec_proc (db_con, "GetMetadataNumericValues", def->id, str_offset, str_limit, NULL); break;
+
+ case DATA_KEYWORD:
+ result_set = tracker_exec_proc (db_con, "GetMetadataKeywordValues", def->id, str_offset, str_limit, NULL); break;
+
+ default: tracker_error ("ERROR: metadata could not be retrieved as type %d is not supported", def->type); result_set = NULL;
+ }
+
+ return result_set;
+
+}
+
+
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 1307)
+++ 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);
+TrackerDBResultSet * 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 1307)
+++ 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 1307)
+++ 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 1307)
+++ 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 1307)
+++ data/tracker-introspect.xml (working copy)
@@ -220,6 +220,14 @@
<arg type="as" name="result" direction="out" />
</method>
+ <!-- returns an array of all unique values of given metadata type -->
+ <method name="GetUniqueValues">
+ <arg type="s" name="meta_type" direction="in" />
+ <arg type="i" name="offset" direction="in" />
+ <arg type="i" name="max_hits" direction="in" />
+ <arg type="as" name="result" direction="out" />
+ </method>
+
<!-- signal emitted whenever metadata for a service entity is changed. The keys are the metadata names that have changed -->
<signal name="Changed">
<arg type="s" name="service"/>
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list