Index: src/trackerd/tracker-metadata.c =================================================================== --- src/trackerd/tracker-metadata.c (revisión: 2277) +++ src/trackerd/tracker-metadata.c (copia de trabajo) @@ -231,6 +231,58 @@ } void +tracker_metadata_get_all (TrackerMetadata *object, + const gchar *service_type, + const gchar *uri, + DBusGMethodInvocation *context, + GError **error) +{ + guint request_id; + gchar *service_id; + GPtrArray * values; + GError *actual_error = NULL; + + request_id = tracker_dbus_get_next_request_id (); + + tracker_dbus_async_return_if_fail (service_type != NULL, context); + tracker_dbus_async_return_if_fail (uri != NULL, context); + + tracker_dbus_request_new (request_id, + "DBus request to get all metadata values, " + "service type:'%s' uri:'%s'", + service_type, uri); + + if (!tracker_ontology_service_is_valid (service_type)) { + tracker_dbus_request_failed (request_id, + &actual_error, + "Service '%s' is invalid or has not been implemented yet", + service_type); + dbus_g_method_return_error (context, actual_error); + g_error_free (actual_error); + return; + } + + service_id = tracker_db_file_get_id_as_string (service_type, uri); + if (!service_id) { + tracker_dbus_request_failed (request_id, + &actual_error, + "Service URI '%s' not found", + uri); + dbus_g_method_return_error (context, actual_error); + g_error_free (actual_error); + return; + } + + values = tracker_db_metadata_get_all (service_type, service_id); + + dbus_g_method_return (context, values); + g_ptr_array_foreach (values, (GFunc)g_strfreev, NULL); + g_ptr_array_free (values, TRUE); + + tracker_dbus_request_success (request_id); +} + +void tracker_metadata_set (TrackerMetadata *object, const gchar *service_type, const gchar *uri, Index: src/trackerd/tracker-metadata.h =================================================================== --- src/trackerd/tracker-metadata.h (revisión: 2276) +++ src/trackerd/tracker-metadata.h (copia de trabajo) @@ -58,6 +58,11 @@ gchar **keys, DBusGMethodInvocation *context, GError **error); +void tracker_metadata_get_all (TrackerMetadata *object, + const gchar *service_type, + const gchar *uri, + DBusGMethodInvocation *context, + GError **error); void tracker_metadata_set (TrackerMetadata *object, const gchar *service_type, const gchar *uri, Index: src/trackerd/tracker-db.c =================================================================== --- src/trackerd/tracker-db.c (revisión: 2277) +++ src/trackerd/tracker-db.c (copia de trabajo) @@ -1247,6 +1247,92 @@ NULL); } +static void +db_result_set_to_ptr_array (TrackerDBResultSet *result_set, + GPtrArray **previous, + gboolean numeric) +{ + gchar *prop_id_str; + gchar *value; + gint numeric_value; + TrackerField *field; + gboolean valid = (result_set != NULL); + + while (valid) { + + /* Item is a pair (property_name, value) */ + gchar **item = g_new0 ( gchar *, 2); + + if (numeric) { + tracker_db_result_set_get (result_set, 0, &prop_id_str, 1, &numeric_value, -1); + value = g_strdup_printf ("%d", numeric_value); + item [1] = value; + } else { + tracker_db_result_set_get (result_set, 0, &prop_id_str, 1, &value, -1); + item [1] = g_strdup (value); + } + + field = tracker_ontology_get_field_by_id (GPOINTER_TO_UINT (prop_id_str)); + + item [0] = g_strdup (tracker_field_get_name (field)); + + g_ptr_array_add (*previous, item); + + valid = tracker_db_result_set_iter_next (result_set); + } +} + +GPtrArray * +tracker_db_metadata_get_all (const gchar *service_type, + const gchar *service_id) +{ + TrackerDBInterface *iface; + TrackerDBResultSet *result_set; + GPtrArray *result; + gchar *query; + + const gchar *metadata = "SELECT MetadataID, MetadataDisplay FROM ServiceMetadata WHERE ServiceID = "; + const gchar *keyword = "SELECT MetadataID, MetadataValue FROM ServiceKeywordMetadata WHERE ServiceID = "; + const gchar *numeric = "SELECT MetadataID, MetadataValue FROM ServiceNumericMetadata WHERE ServiceID = "; + + query = g_strconcat (metadata, service_id, " UNION ", + keyword, service_id, NULL); + + result = g_ptr_array_new (); + + iface = tracker_db_manager_get_db_interface_by_service (service_type); + if (!iface) { + g_warning ("Unable to obtain a DB connection for service type '%s'", + service_type); + return result; + } + + /* Non numeric metadata */ + result_set = tracker_db_interface_execute_query (iface, NULL, query); + + if (result_set) { + db_result_set_to_ptr_array (result_set, &result, FALSE); + g_object_unref (result_set); + } + + g_free (query); + + /* Numeric metadata */ + query = g_strconcat (numeric, service_id, NULL); + + result_set = tracker_db_interface_execute_query (iface, NULL, query); + + if (result_set) { + db_result_set_to_ptr_array (result_set, &result, TRUE); + g_object_unref (result_set); + } + g_free (query); + + return result; + +} + + TrackerDBResultSet * tracker_db_metadata_get_array (TrackerDBInterface *iface, const gchar *service_type, @@ -2858,8 +2944,8 @@ TrackerDBResultSet * tracker_db_metadata_get_types (TrackerDBInterface *iface, - const gchar *class, - gboolean writeable) + const gchar *class, + gboolean writeable) { g_return_val_if_fail (TRACKER_IS_DB_INTERFACE (iface), NULL); g_return_val_if_fail (class != NULL, NULL); Index: src/trackerd/tracker-db.h =================================================================== --- src/trackerd/tracker-db.h (revisión: 2277) +++ src/trackerd/tracker-db.h (copia de trabajo) @@ -70,6 +70,8 @@ TrackerDBResultSet *tracker_db_metadata_get (TrackerDBInterface *iface, const gchar *id, const gchar *key); +GPtrArray * tracker_db_metadata_get_all (const gchar *service_type, + const gchar *service_id); TrackerDBResultSet *tracker_db_metadata_get_array (TrackerDBInterface *iface, const gchar *service_type, const gchar *service_id, Index: data/dbus/tracker-metadata.xml =================================================================== --- data/dbus/tracker-metadata.xml (revisión: 2276) +++ data/dbus/tracker-metadata.xml (copia de trabajo) @@ -14,6 +14,16 @@ + + + + + + + +