[libgda: 8/17] DB: New API added for GdaDbTable
- From: Daniel Espinosa Ortiz <despinosa src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda: 8/17] DB: New API added for GdaDbTable
- Date: Mon, 25 Nov 2019 18:22:48 +0000 (UTC)
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]