]> saetta.ns0.it Git - libzakdbt/commitdiff
Added create_index and drop_index (but create_index doesn't work).
authorAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 15:42:57 +0000 (17:42 +0200)
committerAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 15:42:57 +0000 (17:42 +0200)
docs/dbtransformer.dtd
src/dbtransformer.c
tests/test.db
tests/test.xml

index 8add38a599c1f49254e9a9c8c152b413e76f1864..3f5feca6110e506a9ae88c98d2a43d3169b66fd6 100644 (file)
@@ -1,33 +1,43 @@
-<!ELEMENT dbtransformer (transformation+)>
+<!ELEMENT dbtransformer (dbtransformation+)>
 
-<!ELEMENT transformation (comment?,
+<!ELEMENT dbtransformation (comment?,
                           gda_op*,
                           sql*,
                           drop_table*,
                           rename_table*,
                           drop_view*,
-                          rename_view*)>
+                          rename_view*,
+                          create_index*,
+                          drop_index*)>
 
-<!ATTLIST transformation
+<!ATTLIST dbtransformation
        id CDATA #REQUIRED
 >
 
 <!ELEMENT comment (#PCDATA)>
 
+<!ELEMENT gda_op (#PCDATA)>
+
 <!ELEMENT sql (#PCDATA)>
 
 <!ELEMENT drop_table (table_name)>
 
 <!ELEMENT rename_table (table_name, new_table_name)>
 
-<!ELEMENT table_name (#PCDATA) #REQUIRED>
+<!ELEMENT table_name (#PCDATA)>
 
-<!ELEMENT new_table_name (#PCDATA) #REQUIRED>
+<!ELEMENT new_table_name (#PCDATA)>
 
 <!ELEMENT drop_view (view_name)>
 
 <!ELEMENT rename_view (view_name, new_view_name)>
 
-<!ELEMENT view_name (#PCDATA) #REQUIRED>
+<!ELEMENT view_name (#PCDATA)>
+
+<!ELEMENT new_view_name (#PCDATA)>
+
+<!ELEMENT create_index (index_name, table_name, column_name+)>
+
+<!ELEMENT column_name (#PCDATA)>
 
-<!ELEMENT new_view_name (#PCDATA) #REQUIRED>
+<!ELEMENT drop_index (index_name)>
index 21333454b27237c3bc648aa8f1cbb667ddded607..717323550c8cd892381b55ff18267b9e5295a7a3 100644 (file)
@@ -1071,6 +1071,186 @@ dbt_parse_rename_view (Dbt *dbt, xmlNodePtr xnode)
        return ret;
 }
 
+static gboolean
+dbt_parse_create_index (Dbt *dbt, xmlNodePtr xnode)
+{
+       DbtPrivate *priv;
+
+       gboolean ret;
+
+       xmlNodePtr cur;
+
+       gchar *index_name;
+       gchar *table_name;
+       GSList *column_names;
+
+       GError *error;
+
+       ret = TRUE;
+
+       priv = DBT_GET_PRIVATE (dbt);
+
+       index_name = NULL;
+       table_name = NULL;
+       column_names = NULL;
+
+       cur = xnode->children;
+       while (cur != NULL && ret)
+               {
+                       if (xmlStrcmp (cur->name, (const xmlChar *)"index_name") == 0)
+                               {
+                                       index_name = g_strstrip (g_strdup ((gchar *)xmlNodeGetContent (cur)));
+                               }
+                       else if (xmlStrcmp (cur->name, (const xmlChar *)"table_name") == 0)
+                               {
+                                       table_name = g_strstrip (g_strdup ((gchar *)xmlNodeGetContent (cur)));
+                               }
+                       else if (xmlStrcmp (cur->name, (const xmlChar *)"column_name") == 0)
+                               {
+                                       column_names = g_slist_append (column_names, g_strstrip (g_strdup ((gchar *)xmlNodeGetContent (cur))));
+                               }
+
+                       cur = cur->next;
+               }
+
+       if (index_name != NULL && g_strcmp0 (index_name, "") != 0
+           && table_name != NULL && g_strcmp0 (table_name, "") != 0
+           && column_names != NULL && g_slist_length (column_names) > 0)
+               {g_debug("%s %s",index_name,table_name);
+                       GdaServerOperation *op;
+                       guint i;
+
+                       error = NULL;
+                       op = gda_server_provider_create_operation (priv->gda_provider,
+                                                                  priv->gda_conn,
+                                                                  GDA_SERVER_OPERATION_CREATE_INDEX,
+                                                                  NULL,
+                                                                  &error);
+
+                       error = NULL;
+                       gda_server_operation_set_value_at (op, index_name, &error, "/INDEX_DESC_P/INDEX_NAME");
+                       if (error != NULL)
+                               {
+                                       g_warning ("%s", error->message);
+                                       return FALSE;
+                               }
+
+                       error = NULL;
+                       gda_server_operation_set_value_at (op, table_name, &error, "/INDEX_DESC_P/INDEX_ON_TABLE");
+                       if (error != NULL)
+                               {
+                                       g_warning ("%s", error->message);
+                                       return FALSE;
+                               }
+
+                       error = NULL;
+g_debug("%s",gda_server_provider_render_operation(priv->gda_provider, priv->gda_conn, op, &error));
+                                       if (error != NULL)
+                                               {
+                                                       g_warning ("%s", error->message);
+                                               }
+
+                       i = 0;
+                       while (column_names != NULL)
+                               {
+                                       error = NULL;
+                                       gda_server_operation_set_value_at (op, (gchar *)column_names->data, &error, "/INDEX_FIELDS_S/%d/INDEX_FIELD", i);
+                                       if (error != NULL)
+                                               {
+                                                       g_warning ("%s", error->message);
+                                               }
+
+                                       i++;
+                                       column_names = g_slist_next (column_names);
+                               }
+
+                       error = NULL;
+g_debug("%s",gda_server_provider_render_operation(priv->gda_provider, priv->gda_conn, op, &error));
+                                       if (error != NULL)
+                                               {
+                                                       g_warning ("%s", error->message);
+                                               }
+
+                       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);                    
+               }
+       else
+               {
+                       g_warning ("You must provide the name of the index, the name of the table and one or more column's name.");
+                       ret = FALSE;
+               }
+
+       return ret;
+}
+
+static gboolean
+dbt_parse_drop_index (Dbt *dbt, xmlNodePtr xnode)
+{
+       DbtPrivate *priv;
+
+       gboolean ret;
+
+       xmlNodePtr cur;
+
+       gchar *index_name;
+
+       GError *error;
+
+       ret = TRUE;
+
+       priv = DBT_GET_PRIVATE (dbt);
+
+       index_name = NULL;
+
+       cur = xnode->children;
+       while (cur != NULL && ret)
+               {
+                       if (xmlStrcmp (cur->name, (const xmlChar *)"index_name") == 0)
+                               {
+                                       index_name = g_strstrip (g_strdup ((gchar *)xmlNodeGetContent (cur)));
+                               }
+
+                       cur = cur->next;
+               }
+
+       if (index_name != NULL && g_strcmp0 (index_name, "") != 0)
+               {
+                       GdaServerOperation *op;
+
+                       error = NULL;
+                       op = gda_server_provider_create_operation (priv->gda_provider,
+                                                                  priv->gda_conn,
+                                                                  GDA_SERVER_OPERATION_DROP_INDEX,
+                                                                  NULL,
+                                                                  &error);
+
+                       error = NULL;
+                       gda_server_operation_set_value_at (op, index_name, &error, "/INDEX_DESC_P/INDEX_NAME");
+
+                       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);                    
+               }
+       else
+               {
+                       g_warning ("You must provide the name of the index.");
+                       ret = FALSE;
+               }
+
+       return ret;
+}
+
 /**
  * dbt_transform:
  * @dbt:
@@ -1174,6 +1354,14 @@ dbt_transform (Dbt *dbt)
                                                                                                {
                                                                                                        tosave = dbt_parse_rename_view (dbt, xnode);
                                                                                                }
+                                                                                       else if (xmlStrcmp (xnode->name, (const xmlChar *)"create_index") == 0)
+                                                                                               {
+                                                                                                       tosave = dbt_parse_create_index (dbt, xnode);
+                                                                                               }
+                                                                                       else if (xmlStrcmp (xnode->name, (const xmlChar *)"drop_index") == 0)
+                                                                                               {
+                                                                                                       tosave = dbt_parse_drop_index (dbt, xnode);
+                                                                                               }
                                                                                        else
                                                                                                {
                                                                                                        g_warning ("Invalid tag: %s.", xnode->name);
index 9a42333f759fa51e4a707e3e860b332abd51d08b..5027352d21c0d07a8bd3ff3588a961908e53bdbd 100644 (file)
Binary files a/tests/test.db and b/tests/test.db differ
index 944aef8e9761b69d43628810388ca5337444e8a9..d748b271e51717f3653be99f56dfd26b76325e4c 100644 (file)
@@ -2,6 +2,21 @@
 <dbtransformer>
 
        <dbtransformation id="5">
+               <create_index>
+                       <index_name>orders_primary</index_name>
+                       <table_name>orders</table_name>
+                       <column_name>id</column_name>
+                       <column_name>id_client</column_name>
+               </create_index>
+       </dbtransformation>
+
+       <dbtransformation id="6">
+               <drop_index>
+                       <index_name>clients_pkey</index_name>
+               </drop_index>
+       </dbtransformation>
+
+       <!--<dbtransformation id="7">
                <drop_table>
                        <table_name>clients</table_name>
                </drop_table>
                <drop_table>
                        <table_name>newtablename</table_name>
                </drop_table>
-       </dbtransformation>
+       </dbtransformation>-->
 
        <dbtransformation id="1">
                <sql>
-                       CREATE TABLE clients (id integer, name varchar(50), CONSTRAINT clients_pkey PRIMARY KEY (id))
+                       CREATE TABLE clients (id integer, name varchar(50))
+               </sql>
+               <sql>
+                       CREATE INDEX clients_pkey ON clients (id)
                </sql>
                <sql>
-                       CREATE TABLE orders (id integer, id_client integer, "date" date, CONSTRAINT orders_pkey PRIMARY KEY (id))
+                       CREATE TABLE orders (id integer, id_client integer, "date" date)
                </sql>
        </dbtransformation>