]> saetta.ns0.it Git - libzakdbt/commitdiff
Added transformation create_table.
authorAndrea Zagli <azagli@libero.it>
Sun, 21 Jan 2018 11:39:39 +0000 (12:39 +0100)
committerAndrea Zagli <azagli@libero.it>
Sun, 21 Jan 2018 11:39:39 +0000 (12:39 +0100)
docs/zakdbt.dtd
src/dbt.c
tests/test.xml

index 2e328e1f3d15e69754b938b2b98476bcbfc84b73..4b36c590d5684f5b7a52bcb91691acca2d6b946d 100644 (file)
@@ -21,6 +21,8 @@
 
 <!ELEMENT sql (#PCDATA)>
 
+<!ELEMENT create_table (table_name, add_column*, create_index*)>
+
 <!ELEMENT drop_table (table_name)>
 
 <!ELEMENT rename_table (table_name, new_table_name)>
index 8dfed8403f36523c5cf9339ae1ea65945a7dd615..a01c47af7310f368020b6d4b77f0bad611cd535c 100644 (file)
--- a/src/dbt.c
+++ b/src/dbt.c
@@ -64,6 +64,10 @@ static void zak_dbt_dbt_get_property (GObject *object,
 
 static gboolean zak_dbt_dbt_check_db (ZakDbtDbt *zak_dbt_dbt, gboolean create_tables);
 
+static gboolean zak_dbt_dbt_parse_create_index (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode);
+static gboolean zak_dbt_dbt_parse_add_column (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode);
+static gboolean zak_dbt_dbt_parse_drop_column (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode);
+
 #define ZAK_DBT_DBT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ZAK_DBT_TYPE_DBT, ZakDbtDbtPrivate))
 
 typedef struct _ZakDbtDbtPrivate ZakDbtDbtPrivate;
@@ -795,6 +799,123 @@ zak_dbt_dbt_parse_gda_op (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
        return ret;
 }
 
+static gboolean
+zak_dbt_dbt_parse_create_table (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
+{
+       ZakDbtDbtPrivate *priv;
+
+       gboolean ret;
+
+       xmlNodePtr cur;
+       gchar *table_name;
+
+       xmlNode *node;
+
+       GError *error;
+
+       ret = TRUE;
+
+       priv = ZAK_DBT_DBT_GET_PRIVATE (zak_dbt_dbt);
+
+       table_name = NULL;
+
+       cur = xnode->children;
+       while (cur != NULL && ret)
+               {
+                       if (xmlStrcmp (cur->name, (const xmlChar *)"table_name") == 0)
+                               {
+                                       table_name = g_strstrip (g_strdup ((gchar *)xmlNodeGetContent (cur)));
+                               }
+
+                       cur = cur->next;
+               }
+
+       if (table_name != NULL && g_strcmp0 (table_name, "") != 0)
+               {
+                       GdaServerOperation *op;
+
+                       error = NULL;
+                       op = gda_server_provider_create_operation (priv->gda_provider,
+                                                                  priv->gda_conn,
+                                                                  GDA_SERVER_OPERATION_CREATE_TABLE,
+                                                                  NULL,
+                                                                  &error);
+                       if (op == NULL
+                           || error != NULL)
+                               {
+                                       g_warning ("Unable to create GdaServerOperation create_table: %s.",
+                                                  error != NULL && error->message != NULL ? error->message : "no detail");
+                                       ret = FALSE;
+                               }
+                       else
+                               {
+                                       error = NULL;
+                                       gda_server_operation_set_value_at (op, table_name, &error, "/TABLE_DEF_P/TABLE_NAME");
+
+                                       error = NULL;
+                                       gda_server_operation_set_value_at (op, "zdbt_to_be_delete", &error, "/FIELDS_A/@COLUMN_NAME/0");
+
+                                       error = NULL;
+                                       gda_server_operation_set_value_at (op, "integer", &error, "/FIELDS_A/@COLUMN_TYPE/0");
+
+                                       error = NULL;
+                                       if (!gda_server_provider_perform_operation (priv->gda_provider, priv->gda_conn, op, &error))
+                                               {
+                                                       g_warning ("Error executing the operation: %s.",
+                                                                  error != NULL && error->message != NULL ? error->message : "no detail");
+                                                       ret = FALSE;
+                                               }
+                                       g_object_unref (op);
+
+                                       if (ret)
+                                               {
+                                                       cur = xnode->children;
+                                                       while (cur != NULL && ret)
+                                                               {
+                                                                       if (xmlStrcmp (cur->name, (const xmlChar *)"add_column") == 0)
+                                                                               {
+                                                                                       node = xmlNewNode (NULL, (const xmlChar *)"table_name");
+                                                                                       xmlNodeSetContent (node, (xmlChar *)table_name);
+                                                                                       xmlAddChild (cur, node);
+
+                                                                                       zak_dbt_dbt_parse_add_column (zak_dbt_dbt, cur);
+                                                                               }
+                                                                       else if (xmlStrcmp (cur->name, (const xmlChar *)"create_index") == 0)
+                                                                               {
+                                                                                       node = xmlNewNode (NULL, (const xmlChar *)"table_name");
+                                                                                       xmlNodeSetContent (node, (xmlChar *)table_name);
+                                                                                       xmlAddChild (cur, node);
+
+                                                                                       zak_dbt_dbt_parse_create_index (zak_dbt_dbt, cur);
+                                                                               }
+
+                                                                       cur = cur->next;
+                                                               }
+
+                                                       /* drop of temp column zdbt_to_be_delete */
+                                                       cur = xmlNewNode (NULL, (const xmlChar *)"drop_colum");
+
+                                                       node = xmlNewNode (NULL, (const xmlChar *)"table_name");
+                                                       xmlNodeSetContent (node, (const xmlChar *)table_name);
+                                                       xmlAddChild (cur, node);
+
+                                                       node = xmlNewNode (NULL, (const xmlChar *)"column_name");
+                                                       xmlNodeSetContent (node, (const xmlChar *)"zdbt_to_be_delete");
+                                                       xmlAddChild (cur, node);
+
+                                                       zak_dbt_dbt_parse_drop_column (zak_dbt_dbt, cur);
+                                               }
+                               }
+               }
+       else
+               {
+                       g_warning ("You must provide the name of the table to create.");
+                       ret = FALSE;
+               }
+
+       return ret;
+}
+
 static gboolean
 zak_dbt_dbt_parse_drop_table (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
 {
@@ -1340,7 +1461,7 @@ zak_dbt_dbt_parse_add_column (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
                            || error != NULL)
                                {
                                        g_warning ("Unable to create GdaServerOperation add_column: %s.",
-                                                  error != NULL && error->message != NULL ? error->message : "no details");
+                                                  error != NULL && error->message != NULL ? error->message : "no detail");
                                        ret = FALSE;
                                }
                        else
@@ -1456,7 +1577,7 @@ zak_dbt_dbt_parse_drop_column (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
                            || error != NULL)
                                {
                                        g_warning ("Unable to create GdaServerOperation drop_column: %s.",
-                                                  error != NULL && error->message != NULL ? error->message : "no details");
+                                                  error != NULL && error->message != NULL ? error->message : "no detail");
                                        ret = FALSE;
                                }
                        else
@@ -1471,7 +1592,7 @@ zak_dbt_dbt_parse_drop_column (ZakDbtDbt *zak_dbt_dbt, xmlNodePtr xnode)
                                        if (!gda_server_provider_perform_operation (priv->gda_provider, priv->gda_conn, op, &error))
                                                {
                                                        g_warning ("Error executing the operation: %s.",
-                                                                  error != NULL && error->message != NULL ? error->message : "no details");
+                                                                  error != NULL && error->message != NULL ? error->message : "no detail");
                                                        ret = FALSE;
                                                }
                                        g_object_unref (op);
@@ -1574,6 +1695,10 @@ zak_dbt_dbt_transform (ZakDbtDbt *zak_dbt_dbt)
                                                                                                {
                                                                                                        tosave = zak_dbt_dbt_parse_gda_op (zak_dbt_dbt, xnode);
                                                                                                }
+                                                                                       else if (xmlStrcmp (xnode->name, (const xmlChar *)"create_table") == 0)
+                                                                                               {
+                                                                                                       tosave = zak_dbt_dbt_parse_create_table (zak_dbt_dbt, xnode);
+                                                                                               }
                                                                                        else if (xmlStrcmp (xnode->name, (const xmlChar *)"drop_table") == 0)
                                                                                                {
                                                                                                        tosave = zak_dbt_dbt_parse_drop_table (zak_dbt_dbt, xnode);
index fb90101ca842acf6017e2fa59a816e72d2ee0ba1..399e67b1e5ece3b761213226b5d3dceead069223 100644 (file)
          </drop_column>
        </dbtransformation>
 
+       <dbtransformation id="10">
+               <create_table>
+                 <table_name>newtablename_create_table</table_name>
+                 <add_column>
+                       <table_name>wrong_table_name</table_name>
+                       <column_name>id_create_table</column_name>
+                       <column_type>integer</column_type>
+                       <column_not_null>TRUE</column_not_null>
+                       <column_default>0</column_default>
+                 </add_column>
+                 <add_column>
+                       <column_name>new_col_create_table</column_name>
+                       <column_type>varchar</column_type>
+                       <column_size>255</column_size>
+                       <column_not_null>TRUE</column_not_null>
+                       <column_default>''</column_default>
+                 </add_column>
+                 <create_index>
+                       <table_name>wrong_table_name</table_name>
+                       <index_name>newtablename_create_table_idx</index_name>
+                       <column_name>id</column_name>
+                 </create_index>
+               </create_table>
+       </dbtransformation>
+
 </dbtransformer>