[libgda] GdaDataHandler: fix memory leak at create default for type



commit 7386defea969dccd7ea071847127d4ae35295edb
Author: Daniel Espinosa <esodan gmail com>
Date:   Tue Apr 23 08:26:44 2019 -0500

    GdaDataHandler: fix memory leak at create default for type

 libgda/gda-data-handler.c | 92 +++++++++++++++++++++++------------------------
 libgda/gda-holder.c       |  4 ++-
 2 files changed, 49 insertions(+), 47 deletions(-)
---
diff --git a/libgda/gda-data-handler.c b/libgda/gda-data-handler.c
index 3fb265140..1caae4006 100644
--- a/libgda/gda-data-handler.c
+++ b/libgda/gda-data-handler.c
@@ -241,18 +241,6 @@ gda_data_handler_get_descr (GdaDataHandler *dh)
        return NULL;
 }
 
-static guint
-gtype_hash (gconstpointer key)
-{
-        return GPOINTER_TO_UINT (key);
-}
-
-static gboolean
-gtype_equal (gconstpointer a, gconstpointer b)
-{
-        return (GType) a == (GType) b ? TRUE : FALSE;
-}
-
 /**
  * gda_data_handler_get_default:
  * @for_type: a #GType type
@@ -263,47 +251,59 @@ gtype_equal (gconstpointer a, gconstpointer b)
  *
  * The returned pointer is %NULL if there is no default data handler available for the @for_type data type
  *
- * Returns: (transfer none): a #GdaDataHandler which must not be modified or destroyed.
+ * Returns: (transfer full): a #GdaDataHandler which must not be modified or destroyed.
  *
  * Since: 4.2.3
  */
 GdaDataHandler *
 gda_data_handler_get_default (GType for_type)
 {
-       static GMutex mutex;
-       static GHashTable *hash = NULL;
        GdaDataHandler *dh;
 
-       g_mutex_lock (&mutex);
-       if (!hash) {
-               hash = g_hash_table_new_full (gtype_hash, gtype_equal,
-                                             NULL, (GDestroyNotify) g_object_unref);
-
-                g_hash_table_insert (hash, (gpointer) G_TYPE_INT64, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_UINT64, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_BINARY, gda_handler_bin_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_BLOB, gda_handler_bin_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_BOOLEAN, gda_handler_boolean_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_DATE, gda_handler_time_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_DOUBLE, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_INT, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_NUMERIC, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_FLOAT, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_SHORT, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_USHORT, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_STRING, gda_handler_string_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_TEXT, gda_handler_text_new ());
-                g_hash_table_insert (hash, (gpointer) GDA_TYPE_TIME, gda_handler_time_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_DATE_TIME, gda_handler_time_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_CHAR, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_UCHAR, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_ULONG, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_LONG, gda_handler_numerical_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_GTYPE, gda_handler_type_new ());
-                g_hash_table_insert (hash, (gpointer) G_TYPE_UINT, gda_handler_numerical_new ());
-       }
-       g_mutex_unlock (&mutex);
-
-       dh = g_hash_table_lookup (hash, (gpointer) for_type);
+  if (for_type == G_TYPE_INT64) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_UINT64) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == GDA_TYPE_BINARY) {
+    dh = gda_handler_bin_new ();
+  } else if (for_type == GDA_TYPE_BLOB) {
+    dh = gda_handler_bin_new ();
+  } else if (for_type == G_TYPE_BOOLEAN) {
+    dh = gda_handler_boolean_new ();
+  } else if (for_type == G_TYPE_DATE) {
+    dh = gda_handler_time_new ();
+  } else if (for_type == G_TYPE_DOUBLE) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_INT) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == GDA_TYPE_NUMERIC) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_FLOAT) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == GDA_TYPE_SHORT) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == GDA_TYPE_USHORT) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_STRING) {
+    dh = gda_handler_string_new ();
+  } else if (for_type == GDA_TYPE_TEXT) {
+    dh = gda_handler_text_new ();
+  } else if (for_type == GDA_TYPE_TIME) {
+    dh = gda_handler_time_new ();
+  } else if (for_type == G_TYPE_DATE_TIME) {
+    dh = gda_handler_time_new ();
+  } else if (for_type == G_TYPE_CHAR) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_UCHAR) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_ULONG) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_LONG) {
+    dh = gda_handler_numerical_new ();
+  } else if (for_type == G_TYPE_GTYPE) {
+    dh = gda_handler_type_new ();
+  } else if (for_type == G_TYPE_UINT) {
+    dh = gda_handler_numerical_new ();
+  }
        return dh;
 }
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index 7a11ea05c..0a694246a 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -923,8 +923,10 @@ gda_holder_set_value_str (GdaHolder *holder, GdaDataHandler *dh, const gchar *va
                gda_holder_lock ((GdaLockable*) holder);
                if (!dh)
                        dh = gda_data_handler_get_default (priv->g_type);
-               if (dh)
+               if (dh) {
                        gdaval = gda_data_handler_get_value_from_str (dh, value, priv->g_type);
+      g_object_unref (dh);
+    }
                
                if (gdaval)
                        retval = real_gda_holder_set_value (holder, gdaval, FALSE, error);


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