#include <config.h>
#endif
+#include <libxml/xpath.h>
#include <sql-parser/gda-sql-parser.h>
#include "libdbtransformer.h"
struct _DbtPrivate
{
GdaConnection *gda_conn;
+
+ xmlDocPtr xml_doc;
xmlNodePtr xml_root;
};
DbtPrivate *priv = DBT_GET_PRIVATE (dbt);
priv->gda_conn = NULL;
+ priv->xml_doc = NULL;
priv->xml_root = NULL;
}
/* attach the parser object to the connection */
g_object_set_data_full (G_OBJECT (priv->gda_conn), "parser", parser, g_object_unref);
+
+ return TRUE;
}
void
{
priv->xml_root = NULL;
}
+ else
+ {
+ /* creation of an xmlDoc */
+ priv->xml_doc = xmlNewDoc ("1.0");
+ xmlDocSetRootElement (priv->xml_doc, priv->xml_root);
+ }
}
void
g_return_if_fail (IS_DBT (dbt));
g_return_if_fail (filename != NULL);
- filen = g_strstrip (g_strdup (filen));
+ filen = g_strstrip (g_strdup (filename));
g_return_if_fail (g_strcmp0 (filen, "") != 0);
return;
}
- priv->xml_root = xmlDocGetRootElement (xdoc);
+ priv = DBT_GET_PRIVATE (dbt);
+
+ priv->xml_doc = xdoc;
+ priv->xml_root = xmlDocGetRootElement (priv->xml_doc);
if (priv->xml_root == NULL)
{
g_warning ("No root element in xml file.");
GdaSqlParser *parser;
GdaStatement *stmt;
+ GdaDataModel *dm;
GError *error;
gchar *sql;
stmt = gda_sql_parser_parse_string (parser, sql, NULL, &error);
if (stmt == NULL)
{
- /* table doesn't exist */
- GdaServerProvider *provider;
- GdaServerOperation *op;
- gint i;
-
- /* create a new GdaServerOperation object */
- provider = gda_connection_get_provider (priv->gda_conn);
- op = gda_server_provider_create_operation (provider, priv->gda_conn, GDA_SERVER_OPERATION_CREATE_TABLE, NULL, &error);
- if (!op)
+ g_warning ("Unable to create GdaStatement from sql: %s\n%s",
+ sql, error && error->message ? error->message : "No detail");
+ }
+ else
+ {
+ dm = gda_connection_statement_execute_select (priv->gda_conn, stmt, NULL, &error);
+ g_object_unref (stmt);
+ if (!dm)
{
- g_print ("CREATE TABLE operation is not supported by the provider: %s\n",
- error && error->message ? error->message : "No detail");
- return ret;
- }
-
- /* Set parameter's values */
- /* table name */
- gda_server_operation_set_value_at (op, "dbt_transformations", &error, "/TABLE_DEF_P/TABLE_NAME");
+ /* table doesn't exist */
+ GdaServerProvider *provider;
+ GdaServerOperation *op;
+ gint i;
+
+ /* create a new GdaServerOperation object */
+ provider = gda_connection_get_provider (priv->gda_conn);
+ op = gda_server_provider_create_operation (provider, priv->gda_conn, GDA_SERVER_OPERATION_CREATE_TABLE, NULL, &error);
+ if (!op)
+ {
+ g_print ("CREATE TABLE operation is not supported by the provider: %s\n",
+ error && error->message ? error->message : "No detail");
+ return ret;
+ }
+
+ /* Set parameter's values */
+ /* table name */
+ gda_server_operation_set_value_at (op, "dbt_transformations", &error, "/TABLE_DEF_P/TABLE_NAME");
- /* "id' field */
- i = 0;
- gda_server_operation_set_value_at (op, "id", &error, "/FIELDS_A/@COLUMN_NAME/%d", i);
- gda_server_operation_set_value_at (op, "integer", &error, "/FIELDS_A/@COLUMN_TYPE/%d", i);
- gda_server_operation_set_value_at (op, "TRUE", &error, "/FIELDS_A/@COLUMN_PKEY/%d", i);
-
- /* Actually execute the operation */
- if (!gda_server_provider_perform_operation (provider, priv->gda_conn, op, &error))
- {
- g_print ("Error executing the operation: %s\n",
- error && error->message ? error->message : "No detail");
- return ret;
+ /* "id" field */
+ i = 0;
+ gda_server_operation_set_value_at (op, "id", &error, "/FIELDS_A/@COLUMN_NAME/%d", i);
+ gda_server_operation_set_value_at (op, "integer", &error, "/FIELDS_A/@COLUMN_TYPE/%d", i);
+ gda_server_operation_set_value_at (op, "TRUE", &error, "/FIELDS_A/@COLUMN_PKEY/%d", i);
+
+ /* "operation" field */
+ i++;
+ gda_server_operation_set_value_at (op, "operation", &error, "/FIELDS_A/@COLUMN_NAME/%d", i);
+ gda_server_operation_set_value_at (op, "text", &error, "/FIELDS_A/@COLUMN_TYPE/%d", i);
+
+ /* execute the operation */
+ if (!gda_server_provider_perform_operation (provider, priv->gda_conn, op, &error))
+ {
+ g_print ("Error executing the operation: %s\n",
+ error && error->message ? error->message : "No detail");
+ return ret;
+ }
+ g_object_unref (op);
}
- g_object_unref (op);
}
ret = TRUE;
}
void
-dbt_exec (Dbt *dbt)
+dbt_transform (Dbt *dbt)
{
DbtPrivate *priv;
+ xmlXPathContextPtr xpcontext;
+ xmlXPathObjectPtr xpresult;
+ xmlNodeSetPtr xnodeset;
+ xmlNodePtr xnode;
+
+ guint i;
g_return_if_fail (IS_DBT (dbt));
{
return;
}
+
+ xpcontext = xmlXPathNewContext (priv->xml_doc);
+ xpcontext->node = priv->xml_root;
+
+ xpresult = xmlXPathEvalExpression ((const xmlChar *)"child::dbtransformation", xpcontext);
+ if (!xmlXPathNodeSetIsEmpty (xpresult->nodesetval))
+ {
+ GdaSqlParser *parser = g_object_get_data (G_OBJECT (priv->gda_conn), "parser");
+ if (!parser)
+ {
+ g_warning ("Invalid sql parser.");
+ return;
+ }
+
+ xnodeset = xpresult->nodesetval;
+ for (i = 0; i < xnodeset->nodeNr; i++)
+ {
+ xnode = xnodeset->nodeTab[i];
+ if (xmlStrcmp (xnode->name, (const xmlChar *)"sql") == 0)
+ {
+ gchar *sql = (gchar *)xmlNodeGetContent (xnode);
+
+ GdaStatement *stmt;
+ GError *error = NULL;
+
+ stmt = gda_sql_parser_parse_string (parser, g_strstrip (sql), NULL, &error);
+ if (stmt == NULL)
+ {
+ g_warning ("Unable to create GdaStatement from sql: %s\n%s",
+ sql, error && error->message ? error->message : "No detail");
+ }
+ else
+ {
+ guint nrows = gda_connection_statement_execute_non_select (priv->gda_conn, stmt, NULL, NULL, &error);
+ if (nrows == -1)
+ {
+ g_warning ("NON SELECT error: %s\n", error && error->message ? error->message : "no detail");
+ }
+ g_object_unref (stmt);
+ }
+ }
+ }
+ }
}
/* PRIVATE */