[gom] gom: Ensure we update ids when saving a resource group
- From: Alexander Larsson <alexl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gom] gom: Ensure we update ids when saving a resource group
- Date: Tue, 14 Apr 2015 14:49:29 +0000 (UTC)
commit 67d76633ffbdb7a566958be24059c4e251491d59
Author: Alexander Larsson <alexl redhat com>
Date: Tue Apr 14 15:41:35 2015 +0200
gom: Ensure we update ids when saving a resource group
We move the freeing of the items to the destruction of the asyncresult
and then we iterate over all items calling gom_resource_set_post_save_properties
on a successfull operation.
This also updates test-gom-stress to ensure we're getting the right ids
when calling gom_resource_group_write_sync().
https://bugzilla.gnome.org/show_bug.cgi?id=747849
gom/gom-resource-group.c | 26 +++++++++++++++++++++-----
gom/gom-resource-priv.h | 19 +++++++++++--------
gom/gom-resource.c | 8 ++++----
tests/test-gom-stress.c | 14 +++++++++++++-
4 files changed, 49 insertions(+), 18 deletions(-)
---
diff --git a/gom/gom-resource-group.c b/gom/gom-resource-group.c
index 6ab3055..8adc4c4 100644
--- a/gom/gom-resource-group.c
+++ b/gom/gom-resource-group.c
@@ -127,7 +127,6 @@ gom_resource_group_write_cb (GomAdapter *adapter,
g_assert(GOM_IS_ADAPTER(adapter));
items = g_object_get_data(G_OBJECT(simple), "items");
- g_ptr_array_set_free_func(items, NULL);
queue = g_object_get_data(G_OBJECT(simple), "queue");
/* do BEGIN */
@@ -143,7 +142,6 @@ gom_resource_group_write_cb (GomAdapter *adapter,
!gom_resource_do_save (item, adapter, &error)) {
got_error = TRUE;
}
- g_object_unref(item);
}
if (got_error)
@@ -162,7 +160,6 @@ error:
g_simple_async_result_take_error(simple, error);
out:
- g_ptr_array_unref(items);
g_object_unref(group);
if (!queue)
g_simple_async_result_complete_in_idle(simple);
@@ -178,6 +175,8 @@ gom_resource_group_write_sync (GomResourceGroup *group,
gboolean ret;
GAsyncQueue *queue;
GomAdapter *adapter;
+ GPtrArray *items;
+ int i;
g_return_val_if_fail(GOM_IS_RESOURCE_GROUP(group), FALSE);
g_return_val_if_fail(group->priv->is_writable, FALSE);
@@ -190,7 +189,8 @@ gom_resource_group_write_sync (GomResourceGroup *group,
return TRUE;
g_object_set_data(G_OBJECT(simple), "queue", queue);
- g_object_set_data(G_OBJECT(simple), "items", group->priv->to_write);
+ items = group->priv->to_write;
+ g_object_set_data_full(G_OBJECT(simple), "items", items, (GDestroyNotify)g_ptr_array_unref);
group->priv->to_write = NULL;
adapter = gom_repository_get_adapter(group->priv->repository);
@@ -200,7 +200,14 @@ gom_resource_group_write_sync (GomResourceGroup *group,
if (!(ret = g_simple_async_result_get_op_res_gboolean(simple))) {
g_simple_async_result_propagate_error(simple, error);
+ } else {
+ for (i=0; i < items->len; i++) {
+ GomResource *item = g_ptr_array_index(items, i);
+
+ gom_resource_set_post_save_properties (item);
+ }
}
+
g_object_unref(simple);
return ret;
@@ -229,7 +236,7 @@ gom_resource_group_write_async (GomResourceGroup *group,
return;
}
- g_object_set_data(G_OBJECT(simple), "items", group->priv->to_write);
+ g_object_set_data_full(G_OBJECT(simple), "items", group->priv->to_write,
(GDestroyNotify)g_ptr_array_unref);
group->priv->to_write = NULL;
adapter = gom_repository_get_adapter(priv->repository);
@@ -242,7 +249,9 @@ gom_resource_group_write_finish (GomResourceGroup *group,
GError **error)
{
GSimpleAsyncResult *simple = (GSimpleAsyncResult *)result;
+ GPtrArray *items;
gboolean ret;
+ int i;
g_return_val_if_fail(GOM_IS_RESOURCE_GROUP(group), FALSE);
g_return_val_if_fail(G_IS_SIMPLE_ASYNC_RESULT(simple), FALSE);
@@ -250,6 +259,13 @@ gom_resource_group_write_finish (GomResourceGroup *group,
if (!(ret = g_simple_async_result_get_op_res_gboolean(simple))) {
g_simple_async_result_propagate_error(simple, error);
+ } else {
+ items = g_object_get_data(G_OBJECT(simple), "items");
+ for (i=0; i < items->len; i++) {
+ GomResource *item = g_ptr_array_index(items, i);
+
+ gom_resource_set_post_save_properties (item);
+ }
}
g_object_unref(simple);
diff --git a/gom/gom-resource-priv.h b/gom/gom-resource-priv.h
index cda2021..41f27c3 100644
--- a/gom/gom-resource-priv.h
+++ b/gom/gom-resource-priv.h
@@ -23,14 +23,17 @@
G_BEGIN_DECLS
-gboolean gom_resource_get_is_from_table (GomResource *resource);
-void gom_resource_set_is_from_table (GomResource *resource, gboolean is_from_table);
-gboolean gom_resource_has_dynamic_pkey (GType type);
-gboolean gom_resource_do_save (GomResource *resource,
- GomAdapter *adapter,
- GError **error);
-void gom_resource_build_save_cmd (GomResource *resource,
- GomAdapter *adapter);
+gboolean gom_resource_get_is_from_table (GomResource *resource);
+void gom_resource_set_is_from_table (GomResource *resource,
+ gboolean is_from_table);
+gboolean gom_resource_has_dynamic_pkey (GType type);
+gboolean gom_resource_do_save (GomResource *resource,
+ GomAdapter *adapter,
+ GError **error);
+void gom_resource_build_save_cmd (GomResource *resource,
+ GomAdapter *adapter);
+void gom_resource_set_post_save_properties (GomResource *resource);
+
G_END_DECLS
#endif /* GOM_RESOURCE_PRIV_H */
diff --git a/gom/gom-resource.c b/gom/gom-resource.c
index 59e7adf..3a4b844 100644
--- a/gom/gom-resource.c
+++ b/gom/gom-resource.c
@@ -544,8 +544,8 @@ has_primary_key (GomResource *resource)
return ret;
}
-static void
-set_post_save_properties (GomResource *resource)
+void
+gom_resource_set_post_save_properties (GomResource *resource)
{
GValue *value;
@@ -766,7 +766,7 @@ gom_resource_save_sync (GomResource *resource,
}
if (ret)
- set_post_save_properties(resource);
+ gom_resource_set_post_save_properties(resource);
g_object_unref(simple);
@@ -816,7 +816,7 @@ gom_resource_save_finish (GomResource *resource,
}
if (ret)
- set_post_save_properties(resource);
+ gom_resource_set_post_save_properties(resource);
g_object_unref(simple);
diff --git a/tests/test-gom-stress.c b/tests/test-gom-stress.c
index 49a8f5b..72e06f9 100644
--- a/tests/test-gom-stress.c
+++ b/tests/test-gom-stress.c
@@ -237,6 +237,7 @@ stress2 (void)
GValue value = { 0, };
GomFilter *filter;
guint i;
+ GList *items, *l;
char *s1, *s2, *name, *first_name, *surname;
ItemResource *it;
GomResourceGroup *group;
@@ -256,6 +257,8 @@ stress2 (void)
group = gom_resource_group_new(repository);
+ items = NULL;
+
for (i = 1; i <= NUM_RECORDS; i++) {
ItemResource *item;
@@ -268,11 +271,18 @@ stress2 (void)
"surname", surname,
NULL);
gom_resource_group_append(group, GOM_RESOURCE(item));
- g_object_unref(item);
+ items = g_list_append (items, item);
}
gom_resource_group_write_sync(group, &error);
g_assert_no_error(error);
+
+ i = 1;
+ for (l = items; l != NULL; l = l->next) {
+ ItemResource *item = l->data;
+ g_assert_cmpint (item->priv->id, ==, i++);
+ }
+
g_object_unref(group);
g_value_init(&value, G_TYPE_UINT);
@@ -304,6 +314,8 @@ stress2 (void)
g_free(s1);
g_free(s2);
+ g_list_free_full (items, g_object_unref);
+
ret = gom_adapter_close_sync(adapter, &error);
g_assert_no_error(error);
g_assert(ret);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]