static gboolean gom_resource_do_delete (GomResource *resource, GomAdapter *adapter, GError **error) { GomCommandBuilder *builder; GType resource_type; g_return_val_if_fail(GOM_IS_RESOURCE(resource), FALSE); g_return_val_if_fail(GOM_IS_ADAPTER(adapter), FALSE); resource_type = G_TYPE_FROM_INSTANCE(resource); builder = g_object_new(GOM_TYPE_COMMAND_BUILDER, "adapter", adapter, NULL); do { GomResourceClass *klass; GParamSpec *pspec; GomCommand *command; GomFilter *filter; GArray *values; GValue value = { 0 }; gchar *sql; klass = g_type_class_peek(resource_type); g_assert(GOM_IS_RESOURCE_CLASS(klass)); pspec = g_object_class_find_property(G_OBJECT_CLASS(klass), klass->primary_key); g_assert(pspec); g_value_init(&value, pspec->value_type); g_object_get_property(G_OBJECT(resource), klass->primary_key, &value); sql = g_strdup_printf("'%s'.'%s' = ?", klass->table, klass->primary_key); values = g_array_sized_new(FALSE, FALSE, sizeof(GValue), 1); g_array_append_val(values, value); filter = gom_filter_new_sql(sql, values); g_free(sql); memset(&value, 0, sizeof value); g_array_unref(values); g_object_set(builder, "filter", filter, "resource-type", resource_type, NULL); g_object_unref(filter); command = gom_command_builder_build_delete(builder); if (!gom_command_execute(command, NULL, error)) { g_object_unref(command); g_object_unref(builder); return FALSE; } g_object_unref(command); } while ((resource_type = g_type_parent(resource_type)) != GOM_TYPE_RESOURCE); g_object_unref(builder); return TRUE; }
static void produce_bookmarks_from_query (OperationSpec *os, const gchar *query) { GomFilter *filter; GArray *array; GRL_DEBUG ("produce_bookmarks_from_query"); array = g_array_new(FALSE, FALSE, sizeof(GValue)); filter = gom_filter_new_sql (query, array); g_array_unref (array); produce_bookmarks_from_filter (os, filter); g_object_unref (filter); }