[libgda] Converting property table to GdaDbTable object



commit 64bb90806b766b8180c63038a2fac3a91cd715be
Author: Pavlo Solntsev <p sun fun gmail com>
Date:   Tue Jun 2 12:58:09 2020 -0500

    Converting property table to GdaDbTable object
    
    Misc memory leaks and corrections

 libgda/gda-db-column.c | 66 +++++++++++++++++++++++++++----------------------
 libgda/gda-db-index.c  | 67 +++++++++++++++++++++++++++++---------------------
 2 files changed, 76 insertions(+), 57 deletions(-)
---
diff --git a/libgda/gda-db-column.c b/libgda/gda-db-column.c
index e6d1d49cf..758bf53dd 100644
--- a/libgda/gda-db-column.c
+++ b/libgda/gda-db-column.c
@@ -38,7 +38,7 @@ typedef struct
   gchar *mp_comment;
   gchar *mp_default; /* property */
   gchar *mp_check;
-  gchar *mp_table; /* Property */
+  GdaDbTable *mp_table; /* Property */
 
   GType m_gtype;
 
@@ -178,11 +178,21 @@ gda_db_column_finalize (GObject *object)
   g_free (priv->mp_type);
   g_free (priv->mp_default);
   g_free (priv->mp_check);
-  g_free (priv->mp_table);
 
   G_OBJECT_CLASS (gda_db_column_parent_class)->finalize (object);
 }
 
+static void
+gda_db_column_dispose (GObject *object)
+{
+  GdaDbColumn *self = GDA_DB_COLUMN (object);
+  GdaDbColumnPrivate *priv = gda_db_column_get_instance_private (self);
+
+  g_object_unref (priv->mp_table);
+
+  G_OBJECT_CLASS (gda_db_column_parent_class)->dispose (object);
+}
+
 static void
 gda_db_column_get_property (GObject    *object,
                             guint       prop_id,
@@ -224,7 +234,7 @@ gda_db_column_get_property (GObject    *object,
       g_value_set_uint (value, priv->m_scale);
       break;
     case PROP_COLUMN_TABLE:
-      g_value_set_string (value, priv->mp_table);
+      g_value_set_object (value, priv->mp_table);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -277,8 +287,8 @@ gda_db_column_set_property (GObject      *object,
       priv->m_scale = g_value_get_uint (value);
       break;
     case PROP_COLUMN_TABLE:
-      g_free (priv->mp_table);
-      priv->mp_table = g_value_dup_string (value);
+      g_object_unref (priv->mp_table);
+      priv->mp_table = g_value_get_object (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -292,6 +302,7 @@ gda_db_column_class_init (GdaDbColumnClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->finalize = gda_db_column_finalize;
+  object_class->dispose = gda_db_column_dispose;
   object_class->get_property = gda_db_column_get_property;
   object_class->set_property = gda_db_column_set_property;
 
@@ -328,7 +339,7 @@ gda_db_column_class_init (GdaDbColumnClass *klass)
                          G_PARAM_READWRITE);
 
   properties[PROP_COLUMN_TABLE] =
-    g_param_spec_string ("table", "Table", "Parent table", NULL, G_PARAM_READWRITE);
+    g_param_spec_object ("table", "Table", "Parent table", GDA_TYPE_DB_TABLE, G_PARAM_READWRITE);
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
@@ -1306,18 +1317,14 @@ gda_db_column_create (GdaDdlModifiable *self,
   GdaServerOperation *op = NULL;
   GdaServerProvider *provider = NULL;
   gchar *buffer_str = NULL;
-  GdaDbTable *table = GDA_DB_TABLE (user_data);
+  GdaDbTable *table = NULL;
   GdaDbColumn *column = GDA_DB_COLUMN (self);
 
-  g_return_val_if_fail(GDA_IS_DDL_MODIFIABLE (self), FALSE);
-  g_return_val_if_fail(GDA_IS_CONNECTION (cnc), FALSE);
-  g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
-
   const gchar *strtype;
 
   if (!gda_connection_is_opened (cnc))
     {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+      g_set_error (error, GDA_DDL_MODIFIABLE_ERROR, GDA_DDL_MODIFIABLE_CONNECTIO_NOT_OPENED,
                    _("Connection is not opened"));
       return FALSE;
     }
@@ -1330,16 +1337,19 @@ gda_db_column_create (GdaDdlModifiable *self,
                                              NULL, error);
 
   if (!op)
-    {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_SERVER_OPERATION,
-                   _("ServerOperation is NULL"));
-      goto on_error;
-    }
+    goto on_error;
+
+  g_object_get (column, "table", &table, NULL);
+
+  if (!table)
+    goto on_error;
 
   if (!gda_server_operation_set_value_at (op, gda_db_base_get_full_name (GDA_DB_BASE (table)),
                                           error, "/COLUMN_DEF_P/TABLE_NAME"))
     goto on_error;
 
+  g_object_unref (table);
+
   if (!gda_server_operation_set_value_at (op, gda_db_column_get_name (column),
                                           error, "/COLUMN_DEF_P/COLUMN_NAME"))
     goto on_error;
@@ -1393,6 +1403,9 @@ on_error:
   if (buffer_str)
     g_free (buffer_str);
 
+  if (table)
+    g_object_unref (table);
+
   gda_lockable_unlock (GDA_LOCKABLE (cnc));
 
   return FALSE;
@@ -1420,16 +1433,13 @@ gda_db_column_rename (GdaDdlModifiable *self,
   G_DEBUG_HERE();
   GdaServerOperation *op = NULL;
   GdaServerProvider *provider = NULL;
-  gchar *table = NULL;
+  GdaDbTable *table = NULL;
   GdaDbColumn *column = GDA_DB_COLUMN (self);
   GdaDbColumn *column_new = GDA_DB_COLUMN (user_data);
 
-  g_return_val_if_fail(GDA_IS_DDL_MODIFIABLE (self), FALSE);
-  g_return_val_if_fail(GDA_IS_CONNECTION (cnc), FALSE);
-
   if (!gda_connection_is_opened (cnc))
     {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+      g_set_error (error, GDA_DDL_MODIFIABLE_ERROR, GDA_DDL_MODIFIABLE_CONNECTIO_NOT_OPENED,
                    _("Connection is not opened"));
       return FALSE;
     }
@@ -1442,21 +1452,19 @@ gda_db_column_rename (GdaDdlModifiable *self,
                                              NULL, error);
 
   if (!op)
-    {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_SERVER_OPERATION,
-                   _("ServerOperation is NULL"));
-      goto on_error;
-    }
+    goto on_error;
 
   g_object_get (column, "table", &table, NULL);
 
   if (!table)
     goto on_error;
 
-  if (!gda_server_operation_set_value_at (op, table,
+  if (!gda_server_operation_set_value_at (op, gda_db_base_get_name (GDA_DB_BASE (table)),
                                           error, "/COLUMN_DEF_P/TABLE_NAME"))
     goto on_error;
 
+  g_object_unref (table);
+
   if (!gda_server_operation_set_value_at (op, gda_db_column_get_name (column),
                                           error, "/COLUMN_DEF_P/COLUMN_NAME"))
     goto on_error;
@@ -1479,7 +1487,7 @@ on_error:
     g_object_unref (op);
 
   if (table)
-    g_free (table);
+    g_object_unref (table);
 
   gda_lockable_unlock (GDA_LOCKABLE (cnc));
 
diff --git a/libgda/gda-db-index.c b/libgda/gda-db-index.c
index 36785db93..229e38b4d 100644
--- a/libgda/gda-db-index.c
+++ b/libgda/gda-db-index.c
@@ -33,7 +33,7 @@ typedef struct
 {
   gboolean mUnique;
   GSList *mFieldList; /* A list of GdaDbIndexField */
-       gchar *mTable; /* A table associated with the index */
+  GdaDbTable *mTable; /* A table associated with the index */
 } GdaDbIndexPrivate;
 
 /**
@@ -119,11 +119,21 @@ gda_db_index_finalize (GObject *object)
   GdaDbIndexPrivate *priv = gda_db_index_get_instance_private (self);
 
   g_slist_free_full (priv->mFieldList, g_object_unref);
-       g_free (priv->mTable);
 
   G_OBJECT_CLASS (gda_db_index_parent_class)->finalize (object);
 }
 
+static void
+gda_db_index_dispose (GObject *object)
+{
+  GdaDbIndex *self = GDA_DB_INDEX (object);
+  GdaDbIndexPrivate *priv = gda_db_index_get_instance_private (self);
+
+  g_object_unref (priv->mTable);
+
+  G_OBJECT_CLASS (gda_db_index_parent_class)->dispose (object);
+}
+
 static void
 gda_db_index_get_property (GObject    *object,
                            guint       prop_id,
@@ -135,7 +145,7 @@ gda_db_index_get_property (GObject    *object,
 
   switch (prop_id) {
     case PROP_TABLE:
-      g_value_set_string (value, priv->mTable);
+      g_value_set_object (value, priv->mTable);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -153,8 +163,10 @@ gda_db_index_set_property (GObject    *object,
 
   switch (prop_id) {
     case PROP_TABLE:
-      g_free (priv->mTable);
-      priv->mTable = g_strdup (g_value_get_string (value));
+      if (priv->mTable)
+        g_object_unref (priv->mTable);
+
+      priv->mTable = g_value_dup_object (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -167,13 +179,14 @@ gda_db_index_class_init (GdaDbIndexClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->finalize = gda_db_index_finalize;
+  object_class->dispose = gda_db_index_dispose;
   object_class->get_property = gda_db_index_get_property;
   object_class->set_property = gda_db_index_set_property;
 
-  properties[PROP_TABLE] = g_param_spec_string ("table",
+  properties[PROP_TABLE] = g_param_spec_object ("table",
                                                   "Table",
                                                   "Table associated with index",
-                                                  NULL,
+                                                  GDA_TYPE_DB_TABLE,
                                                   G_PARAM_READWRITE);
 
   g_object_class_install_properties (object_class, N_PROPS, properties);
@@ -340,12 +353,10 @@ gda_db_index_drop (GdaDdlModifiable *self,
 {
   G_DEBUG_HERE();
   g_return_val_if_fail (GDA_IS_DB_INDEX (self), FALSE);
-  g_return_val_if_fail (GDA_IS_CONNECTION (cnc), FALSE);
-  g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   if (!gda_connection_is_opened(cnc))
     {
-      g_set_error (error, GDA_DB_INDEX_ERROR, GDA_DB_INDEX_CONNECTION_NOT_OPENED,
+      g_set_error (error, GDA_DDL_MODIFIABLE_ERROR, GDA_DDL_MODIFIABLE_CONNECTIO_NOT_OPENED,
                    _("Connection is not opened"));
       return FALSE;
     }
@@ -363,11 +374,7 @@ gda_db_index_drop (GdaDdlModifiable *self,
                                              NULL,
                                              error);
   if (!op)
-    {
-      g_set_error (error, GDA_DB_INDEX_ERROR, GDA_DB_INDEX_CONNECTION_NOT_OPENED,
-                   _("Connection is not opened"));
-      goto on_error;
-    }
+    goto on_error;
 
   if (!gda_server_operation_set_value_at (op, gda_db_base_get_full_name (GDA_DB_BASE (self)),
                                           error, "/INDEX_DESC_P/INDEX_NAME"))
@@ -380,6 +387,8 @@ gda_db_index_drop (GdaDdlModifiable *self,
   if (!gda_server_provider_perform_operation (provider, cnc, op, error))
     goto on_error;
 
+  g_object_unref (op);
+
   gda_lockable_unlock (GDA_LOCKABLE (cnc));
 
   return TRUE;
@@ -393,6 +402,7 @@ on_error:
 }
 
 /**
+ * gda_db_index_create:
  * @self is a instance of GdaDbIndex
  * @cnc is a opened connection
  * @user_data is ignored
@@ -410,13 +420,11 @@ gda_db_index_create (GdaDdlModifiable *self,
   GdaServerOperation *op = NULL;
 
   GdaDbIndex *index = GDA_DB_INDEX (self);
-  gchar *table = NULL;
-
-  g_return_val_if_fail(GDA_IS_CONNECTION (cnc), FALSE);
+  GdaDbTable *table = NULL;
 
   if (!gda_connection_is_opened (cnc))
     {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+      g_set_error (error, GDA_DDL_MODIFIABLE_ERROR, GDA_DDL_MODIFIABLE_CONNECTIO_NOT_OPENED,
                    _("Connection is not opened"));
       return FALSE;
     }
@@ -429,13 +437,9 @@ gda_db_index_create (GdaDdlModifiable *self,
                                              NULL, error);
 
   if (!op)
-    {
-      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_SERVER_OPERATION,
-                   _("ServerOperation is NULL"));
-      goto on_error;
-    }
+    goto on_error;
 
-  if (gda_db_index_get_unique(index))
+  if (gda_db_index_get_unique (index))
     {
       if (!gda_server_operation_set_value_at (op, "UNIQUE", error,
                                               "/INDEX_DEF_P/INDEX_TYPE"))
@@ -449,11 +453,14 @@ gda_db_index_create (GdaDdlModifiable *self,
 
   g_object_get (index, "table", &table, NULL);
 
-  if (!gda_server_operation_set_value_at (op, table,
+  if (!table)
+    goto on_error;
+
+  if (!gda_server_operation_set_value_at (op, gda_db_base_get_name (GDA_DB_BASE (table)),
                                           error, "/INDEX_DEF_P/INDEX_ON_TABLE"))
     goto on_error;
 
-       g_free (table);
+  g_object_unref (table);
 
   if (!gda_server_operation_set_value_at (op, "TRUE",
                                           error, "/INDEX_DEF_P/INDEX_IFNOTEXISTS"))
@@ -493,12 +500,16 @@ gda_db_index_create (GdaDdlModifiable *self,
 
   g_object_unref (op);
 
+  gda_lockable_unlock (GDA_LOCKABLE (cnc));
+
   return TRUE;
 
 on_error:
   if (op) g_object_unref (op);
 
-  g_free (table);
+  g_object_unref (table);
+
+  gda_lockable_unlock (GDA_LOCKABLE (cnc));
 
   return FALSE;
 }


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