diff options
author | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-05 17:26:47 +0100 |
---|---|---|
committer | Charlie Brej <cbrej@cs.man.ac.uk> | 2010-08-05 17:26:47 +0100 |
commit | fd052ea999822f52ca884ab5b7b47977bd71e3bf (patch) | |
tree | 55d11eb714a79ef928ea44885ebd0ce3ec99335c | |
parent | f928667b2d9d60dc0f64729d0a944ae8c9997b0f (diff) |
Implement dbus backend query function
-rw-r--r-- | src/libtidbit/tidbit-database-dbus.c | 35 |
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; +} |