summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharlie Brej <cbrej@cs.man.ac.uk>2010-08-05 17:26:47 +0100
committerCharlie Brej <cbrej@cs.man.ac.uk>2010-08-05 17:26:47 +0100
commitfd052ea999822f52ca884ab5b7b47977bd71e3bf (patch)
tree55d11eb714a79ef928ea44885ebd0ce3ec99335c
parentf928667b2d9d60dc0f64729d0a944ae8c9997b0f (diff)
Implement dbus backend query function
-rw-r--r--src/libtidbit/tidbit-database-dbus.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/libtidbit/tidbit-database-dbus.c b/src/libtidbit/tidbit-database-dbus.c
index c314e92..60ac3e1 100644
--- a/src/libtidbit/tidbit-database-dbus.c
+++ b/src/libtidbit/tidbit-database-dbus.c
@@ -31,11 +31,13 @@
static void tidbit_database_dbus_free (PtrTidbitDatabase database);
static unsigned int tidbit_database_dbus_insert (PtrTidbitDatabase database, PtrTidbitRecord record);
static PtrTidbitRecord tidbit_database_dbus_fetch (PtrTidbitDatabase database, PtrTidbitGuid guid);
+static PtrTidbitGuidSet tidbit_database_dbus_query (PtrTidbitDatabase database, PtrTidbitQuery query);
static TidbitDatabaseFunctions backend_functions = {
&tidbit_database_dbus_free,
&tidbit_database_dbus_insert,
&tidbit_database_dbus_fetch,
+ &tidbit_database_dbus_query,
};
@@ -78,3 +80,36 @@ static PtrTidbitRecord tidbit_database_dbus_fetch (PtrTidbitDatabase database, P
PtrTidbitRecord record = tidbit_record_from_raw (record_str); //FIXME check record is ok
return record;
}
+
+#define DBUS_STRUCT_STRING_STRING_INT (dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INVALID))
+
+static void add_query_to_gptrarray (PtrTidbitQueryExp expression, gpointer user_data)
+{
+ GPtrArray* elements = user_data;
+ GValue *value = g_new0 (GValue, 1);
+ g_value_init (value, DBUS_STRUCT_STRING_STRING_INT);
+ g_value_take_boxed (value, dbus_g_type_specialized_construct (DBUS_STRUCT_STRING_STRING_INT));
+ dbus_g_type_struct_set (value, 0, expression->key, 1, expression->value, 2, expression->type, G_MAXUINT);
+ g_ptr_array_add (elements, g_value_get_boxed (value));
+ g_free (value);
+}
+
+
+static PtrTidbitGuidSet tidbit_database_dbus_query (PtrTidbitDatabase database, PtrTidbitQuery query)
+{
+ PtrTidbitDatabaseDbus backend = GET_DBUS_BACKEND(database);
+ GError *error = NULL;
+ char **guids;
+ GPtrArray* elements = g_ptr_array_new();
+ tidbit_query_foreach_exp (query, add_query_to_gptrarray, elements);
+
+ org_freedesktop_Tidbit_query (backend->proxy, g_strdup(query->table_name), elements, &guids, &error);
+
+ PtrTidbitGuidSet guid_set = tidbit_guid_set_new ();
+ for (int i = 0; guids[i]; i++){
+ PtrTidbitGuid guid = tidbit_guid_new (guids[i]);
+ tidbit_guid_set_append (guid_set, guid);
+ tidbit_guid_unref (guid);
+ }
+ return guid_set;
+}