-<!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)>
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:
{
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);
<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>