[gom] filter: use a copy of the value array



commit 7d183492765609162501ed4f9a3c31dd45585a02
Author: Christian Hergert <christian hergert me>
Date:   Fri Aug 7 19:16:52 2015 +0200

    filter: use a copy of the value array
    
    In GObject Introspection, we can't expect transfer of ownership of the
    array. So we will just make a copy of the array.

 gom/gom-filter.c |   37 ++++++++++++++++++++++++++++++-------
 gom/gom-filter.h |    2 +-
 2 files changed, 31 insertions(+), 8 deletions(-)
---
diff --git a/gom/gom-filter.c b/gom/gom-filter.c
index 8143339..51c8a80 100644
--- a/gom/gom-filter.c
+++ b/gom/gom-filter.c
@@ -75,14 +75,35 @@ static const gchar *gOperators[] = {
  * Returns: (transfer full): A new #GomFilter.
  */
 GomFilter *
-gom_filter_new_sql (const gchar *sql,
-                    GArray      *values)
-{
-   GomFilter *filter = g_object_new(GOM_TYPE_FILTER,
-                                    "mode", GOM_FILTER_SQL,
-                                    "sql", sql,
-                                    NULL);
-   filter->priv->values = g_array_ref(values);
+gom_filter_new_sql (const gchar  *sql,
+                    const GArray *values)
+{
+   GomFilter *filter;
+
+   g_return_val_if_fail (sql != NULL, NULL);
+
+   filter = g_object_new (GOM_TYPE_FILTER,
+                          "mode", GOM_FILTER_SQL,
+                          "sql", sql,
+                          NULL);
+
+   if (values != NULL) {
+      guint i;
+
+      filter->priv->values = g_array_sized_new (FALSE, FALSE, sizeof(GValue), values->len);
+      g_array_set_clear_func (filter->priv->values, (GDestroyNotify)g_value_unset);
+
+      for (i = 0; i < values->len; i++) {
+         GValue copy = { 0 };
+         const GValue *src;
+
+         src = &g_array_index (values, GValue, i);
+         g_value_init (&copy, G_VALUE_TYPE (src));
+         g_value_copy (src, &copy);
+         g_array_append_val (filter->priv->values, copy);
+      }
+   }
+
    return filter;
 }
 
@@ -599,6 +620,8 @@ gom_filter_finalize (GObject *object)
       g_value_unset(&priv->value);
    }
 
+   g_clear_pointer (&priv->values, g_array_unref);
+
    if (priv->subfilters != NULL)
       g_queue_free_full(priv->subfilters, g_object_unref);
 
diff --git a/gom/gom-filter.h b/gom/gom-filter.h
index e76f763..699e970 100644
--- a/gom/gom-filter.h
+++ b/gom/gom-filter.h
@@ -73,7 +73,7 @@ gchar       *gom_filter_get_sql         (GomFilter     *filter,
                                          GHashTable    *table_map);
 GArray      *gom_filter_get_values      (GomFilter     *filter);
 GomFilter   *gom_filter_new_sql         (const gchar   *sql,
-                                         GArray        *values);
+                                         const GArray  *values);
 GomFilter   *gom_filter_new_or          (GomFilter     *left,
                                          GomFilter     *right);
 GomFilter   *gom_filter_new_or_full     (GomFilter     *first,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]