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