[libgda: 8/17] DB: New API added for GdaDbTable



commit 6015e45638018fc6e35db061829904ff46870918
Author: Pavlo Solntsev <p sun fun gmail com>
Date:   Thu Mar 21 07:22:44 2019 -0500

    DB: New API added for GdaDbTable
    
     - gda_db_table_drop() and gda_db_table_add_index were added
     - New error was added
     - G_DEBUG_HERE() macro was added to simplify debuging

 libgda/gda-db-table.c | 214 ++++++++++++++++++++++++++++++++++++++++++++++++--
 libgda/gda-db-table.h |  15 +++-
 2 files changed, 223 insertions(+), 6 deletions(-)
---
diff --git a/libgda/gda-db-table.c b/libgda/gda-db-table.c
index 018a4346c..27026cd87 100644
--- a/libgda/gda-db-table.c
+++ b/libgda/gda-db-table.c
@@ -102,12 +102,14 @@ static const gchar *gdadbtablenodes[GDA_DB_TABLE_N_NODES] = {
 GdaDbTable *
 gda_db_table_new (void)
 {
+  G_DEBUG_HERE();
   return g_object_new (GDA_TYPE_DB_TABLE, NULL);
 }
 
 static void
 gda_db_table_finalize (GObject *object)
 {
+  G_DEBUG_HERE();
   GdaDbTable *self = (GdaDbTable *)object;
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
 
@@ -228,6 +230,7 @@ gda_db_table_parse_node (GdaDbBuildable *buildable,
                          xmlNodePtr    node,
                          GError      **error)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (buildable, FALSE);
   g_return_val_if_fail (node, FALSE);
 
@@ -305,6 +308,7 @@ gda_db_table_write_node (GdaDbBuildable *buildable,
                          xmlNodePtr       rootnode,
                          GError         **error)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (buildable, FALSE);
   g_return_val_if_fail (rootnode, FALSE);
 
@@ -353,6 +357,7 @@ void
 gda_db_table_set_comment (GdaDbTable *self,
                           const char  *tablecomment)
 {
+  G_DEBUG_HERE();
   g_return_if_fail (self);
 
   if (tablecomment)
@@ -376,6 +381,7 @@ void
 gda_db_table_set_is_temp (GdaDbTable *self,
                            gboolean istemp)
 {
+  G_DEBUG_HERE();
   g_return_if_fail (self);
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
   priv->m_istemp = istemp;
@@ -392,6 +398,7 @@ gda_db_table_set_is_temp (GdaDbTable *self,
 const char*
 gda_db_table_get_comment (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (self, NULL);
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
   return priv->mp_comment;
@@ -410,6 +417,7 @@ gda_db_table_get_comment (GdaDbTable *self)
 gboolean
 gda_db_table_get_temp (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (self, FALSE);
 
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
@@ -430,6 +438,7 @@ gda_db_table_get_temp (GdaDbTable *self)
 gboolean
 gda_db_table_is_valid (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (self, FALSE);
 
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
@@ -459,6 +468,7 @@ gda_db_table_is_valid (GdaDbTable *self)
 GList*
 gda_db_table_get_columns (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (self, NULL);
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
 
@@ -480,6 +490,7 @@ gda_db_table_get_columns (GdaDbTable *self)
 GList*
 gda_db_table_get_fkeys (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (self, NULL);
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
 
@@ -499,6 +510,7 @@ gda_db_table_get_fkeys (GdaDbTable *self)
 gboolean
 gda_db_table_get_is_temp (GdaDbTable *self)
 {
+  G_DEBUG_HERE();
   g_return_val_if_fail (GDA_IS_DB_TABLE(self), FALSE);
 
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
@@ -524,6 +536,11 @@ gda_db_table_prepare_create (GdaDbTable *self,
                              gboolean ifnotexists,
                              GError **error)
 {
+  G_DEBUG_HERE();
+  g_return_val_if_fail(GDA_IS_DB_TABLE(self), FALSE);
+  g_return_val_if_fail(GDA_IS_SERVER_OPERATION(op), FALSE);
+  g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
+
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
 
   if (!gda_server_operation_set_value_at (op,
@@ -613,13 +630,17 @@ gda_db_table_update (GdaDbTable *self,
                      GdaConnection *cnc,
                      GError **error)
 {
-  g_return_val_if_fail (self, FALSE);
+  g_return_val_if_fail (GDA_IS_DB_TABLE(self), FALSE);
   g_return_val_if_fail (obj, FALSE);
-  g_return_val_if_fail (cnc, 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))
-    return FALSE;
+    {
+      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+                   _("Connection is not opened"));
+      return FALSE;
+    }
 
   GdaDbTablePrivate *priv = gda_db_table_get_instance_private (self);
 
@@ -882,7 +903,8 @@ gda_db_table_add_column (GdaDbTable *self,
 
   if (!gda_connection_is_opened (cnc))
     {
-      g_warning ("Connection is not opened");
+      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+                   _("Connection is not opened"));
       return FALSE;
     }
 
@@ -958,4 +980,186 @@ on_error:
   return FALSE;
 }
 
-G_END_DECLS
+/**
+ * gda_db_table_drop:
+ * @self:
+ * @cnc:
+ * @ifexists:
+ * @error:
+ *
+ * Drop table from the database. This mehod will call "DROP TABLE ..." SQL command.
+ *
+ * Returns: %TRUE if no error and %FALSE otherwise.
+ *
+ * Since: 6.0
+ */
+gboolean
+gda_db_table_drop (GdaDbTable *self,
+                   GdaConnection *cnc,
+                   gboolean ifexists,
+                   GError **error)
+{
+  G_DEBUG_HERE();
+  GdaServerProvider *provider = NULL;
+  GdaServerOperation *op = NULL;
+
+  g_return_val_if_fail (GDA_IS_DB_TABLE (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_TABLE_ERROR,  GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+                   _("Connection is not opened"));
+      return FALSE;
+    }
+
+  gda_lockable_lock (GDA_LOCKABLE (cnc));
+
+  provider = gda_connection_get_provider (cnc);
+
+  op = gda_server_provider_create_operation (provider, cnc, GDA_SERVER_OPERATION_DROP_TABLE,
+                                             NULL, error);
+
+  if (!op)
+    {
+      g_warning("ServerOperation is NULL\n");
+      goto on_error;
+    }
+
+  if (!gda_server_operation_set_value_at (op, gda_db_base_get_full_name(GDA_DB_BASE(self)), error,
+                                          "/TABLE_DESC_P/TABLE_NAME"))
+    goto on_error;
+
+  if (!gda_server_operation_set_value_at (op, GDA_BOOL_TO_STR (ifexists), error,
+                                          "/TABLE_DESC_P/TABLE_IFEXISTS"))
+    goto on_error;
+
+  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;
+
+on_error:
+  if (op) g_object_unref (op);
+
+  gda_lockable_unlock (GDA_LOCKABLE (cnc));
+
+  return FALSE;
+}
+/**
+ * gda_db_table_add_index:
+ * @self: object to use
+ * @index: an instance of #GdaDbIndex to add
+ * @cnc: Connection to use
+ * @ifnotexists: use or not use "IF NOT EXISTS"
+ * @error: error container
+ *
+ * To drop the index see gda_db_index_drop()
+ *
+ * Returns: %TRUE if no error and %FALSE otherwise.
+ *
+ * Since: 6.0
+ */
+gboolean
+gda_db_table_add_index  (GdaDbTable *self,
+                         GdaDbIndex *index,
+                         GdaConnection *cnc,
+                         gboolean ifnotexists,
+                         GError **error)
+{
+  G_DEBUG_HERE();
+  GdaServerProvider *provider = NULL;
+  GdaServerOperation *op = NULL;
+
+  g_return_val_if_fail(GDA_IS_DB_TABLE (self), FALSE);
+  g_return_val_if_fail(GDA_IS_CONNECTION (cnc), FALSE);
+  g_return_val_if_fail(GDA_IS_DB_INDEX(index), FALSE);
+  g_return_val_if_fail(error == NULL || *error == NULL, FALSE);
+
+  if (!gda_connection_is_opened (cnc))
+    {
+      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+                   _("Connection is not opened"));
+      return FALSE;
+    }
+
+  gda_lockable_lock (GDA_LOCKABLE (cnc));
+
+  provider = gda_connection_get_provider (cnc);
+
+  op = gda_server_provider_create_operation (provider, cnc, GDA_SERVER_OPERATION_CREATE_INDEX,
+                                             NULL, error);
+
+  if (!op)
+    {
+      g_set_error (error, GDA_DB_TABLE_ERROR, GDA_DB_TABLE_SERVER_OPERATION,
+                   _("ServerOperation is NULL"));
+      goto on_error;
+    }
+
+  if (gda_db_index_get_unique(index))
+    {
+      if (!gda_server_operation_set_value_at (op, "UNIQUE", error,
+                                              "/INDEX_DEF_P/INDEX_TYPE"))
+        goto on_error;
+    }
+
+  if (!gda_server_operation_set_value_at (op, gda_db_base_get_full_name (GDA_DB_BASE (index)),
+                                          error, "/INDEX_DEF_P/INDEX_NAME"))
+    goto on_error;
+
+  if (!gda_server_operation_set_value_at (op, gda_db_base_get_full_name (GDA_DB_BASE(self)),
+                                          error, "/INDEX_DEF_P/INDEX_ON_TABLE"))
+    goto on_error;
+
+  if (!gda_server_operation_set_value_at (op, GDA_BOOL_TO_STR (ifnotexists),
+                                          error, "/INDEX_DEF_P/INDEX_IFNOTEXISTS"))
+    goto on_error;
+
+  GSList *it = gda_db_index_get_fields (index);
+  gint i = 0;
+
+  for (; it != NULL; it = it->next, i++)
+    {
+      GdaDbColumn *col = gda_db_index_field_get_column (GDA_DB_INDEX_FIELD (it->data));
+
+      if (!gda_server_operation_set_value_at (op,
+                                              gda_db_column_get_name (col),
+                                              error,
+                                              "/INDEX_FIELDS_S/%d/INDEX_FIELD",
+                                              i))
+        goto on_error;
+
+      if (!gda_server_operation_set_value_at (op,
+                                              gda_db_index_field_get_collate_str (it->data),
+                                              error,
+                                              "/INDEX_FIELDS_S/%d/INDEX_COLLATE",
+                                              i))
+        goto on_error;
+
+      if (!gda_server_operation_set_value_at (op,
+                                              gda_db_index_field_get_sort_order_str (it->data),
+                                              error,
+                                              "/INDEX_FIELDS_S/%d/INDEX_SORT_ORDER",
+                                              i))
+        goto on_error;
+    }
+
+  if (!gda_server_provider_perform_operation (provider, cnc, op, error))
+    goto on_error;
+
+  g_object_unref (op);
+
+  return TRUE;
+
+on_error:
+  if (op) g_object_unref (op);
+
+  return FALSE;
+}
+
diff --git a/libgda/gda-db-table.h b/libgda/gda-db-table.h
index f95bb964a..5322de351 100644
--- a/libgda/gda-db-table.h
+++ b/libgda/gda-db-table.h
@@ -28,6 +28,7 @@
 #include "gda-server-operation.h"
 #include <libgda/sql-parser/gda-sql-statement.h>
 #include "gda-meta-struct.h"
+#include "gda-db-index.h"
 
 G_BEGIN_DECLS
 
@@ -46,7 +47,9 @@ struct _GdaDbTableClass {
  */
 typedef enum {
     GDA_DB_TABLE_COLUMN_EMPTY,
-}GdaDbTableError;
+    GDA_DB_TABLE_CONNECTION_NOT_OPENED,
+    GDA_DB_TABLE_SERVER_OPERATION
+} GdaDbTableError;
 
 #define GDA_DB_TABLE_ERROR gda_db_table_error_quark()
 GQuark gda_db_table_error_quark(void);
@@ -91,6 +94,16 @@ gboolean        gda_db_table_add_column (GdaDbTable *self,
                                          GdaConnection *cnc,
                                          GError **error);
 
+gboolean        gda_db_table_drop       (GdaDbTable *self,
+                                         GdaConnection *cnc,
+                                         gboolean ifexists,
+                                         GError **error);
+
+gboolean        gda_db_table_add_index  (GdaDbTable *self,
+                                         GdaDbIndex *index,
+                                         GdaConnection *cnc,
+                                         gboolean ifnotexists,
+                                         GError **error);
 G_END_DECLS
 
 #endif /* end of include guard: GDA-DB-TABLE_H */


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