[gom] gom: Ensure we update ids when saving a resource group



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]