]> saetta.ns0.it Git - libzakdbt/commitdiff
Sorted input xml by id.
authorAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 13:15:06 +0000 (15:15 +0200)
committerAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 13:15:06 +0000 (15:15 +0200)
configure.ac
src/dbtransformer.c
tests/test.db
tests/test.xml

index 28660691c41813c293ebe64d07ddaa2df91ed954..03b251adc9fea3b6c61fb4b00b4e8be40429993d 100644 (file)
@@ -29,7 +29,8 @@ AC_PROG_RANLIB
 GTK_DOC_CHECK
 
 # Checks for libraries.
-PKG_CHECK_MODULES(DBT, [libgda-4.0 >= 4.1.8])
+PKG_CHECK_MODULES(DBT, [libgda-4.0 >= 4.1.8
+                        libxslt >= 1.0.0])
 
 AC_SUBST(DBT_CFLAGS)
 AC_SUBST(DBT_LIBS)
index 0e549721b71ecfa025e7396bacf737abd3def5cb..36195262fee5decd1ccdab76eec95024728dc6a5 100644 (file)
        #include <config.h>
 #endif
 
+#include <string.h>
+
 #include <libxml/xpath.h>
 #include <libxml/xinclude.h>
+
+#include <libxslt/xslt.h>
+#include <libxslt/xsltInternals.h>
+#include <libxslt/transform.h>
+
 #include <sql-parser/gda-sql-parser.h>
 
 #include "libdbtransformer.h"
 
+gchar *str_xslt_doc =
+"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+"<xsl:stylesheet version=\"1.0\"\n"
+"xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n"
+"<xsl:template match=\"/\">\n"
+"<dbtransformer>\n"
+"      <xsl:for-each select=\"dbtransformer/dbtransformation\">\n"
+"              <xsl:sort select=\"@id\" data-type=\"number\"/>\n"
+"              <xsl:text>&#10;</xsl:text>\n"
+"              <xsl:text>&#09;</xsl:text>\n"
+"              <xsl:copy-of select=\".\"/>\n"
+"      </xsl:for-each>\n"
+"<xsl:text>&#10;</xsl:text>\n"
+"</dbtransformer>\n"
+"</xsl:template>\n"
+"</xsl:stylesheet>";
+
 static void dbt_class_init (DbtClass *class);
 static void dbt_init (Dbt *dbt);
 
@@ -190,6 +214,65 @@ dbt_check_xml_root (xmlNodePtr xml_root)
                }
 }
 
+static gboolean
+dbt_sort_xml (Dbt *dbt)
+{
+       gboolean ret;
+
+       DbtPrivate *priv;
+
+       xmlDocPtr xslt_xdoc;
+       xsltStylesheetPtr xslt;
+
+       ret = FALSE;
+
+       priv = DBT_GET_PRIVATE (dbt);
+
+       xmlSubstituteEntitiesDefault (1);
+
+       xslt_xdoc = xmlParseMemory (str_xslt_doc, strlen (str_xslt_doc));
+       if (xslt_xdoc == NULL)
+               {
+                       g_warning ("Unable to parse the XSLT doc.");
+                       return ret;
+               }
+
+       xslt = xsltParseStylesheetDoc (xslt_xdoc);
+       if (xslt == NULL)
+               {
+                       g_warning ("Unable to parse the XSLT doc.");
+                       return ret;
+               }
+
+       priv->xml_doc = xsltApplyStylesheet (xslt, priv->xml_doc, NULL);
+       if (priv->xml_doc == NULL)
+               {
+                       g_warning ("Unable to apply the XSLT.");
+                       return ret;
+               }
+
+       priv->xml_root = xmlDocGetRootElement (priv->xml_doc);
+       if (priv->xml_root == NULL)
+               {
+                       g_warning ("No root node after applied the XSLT.");
+                       return ret;
+               }
+
+       if (!dbt_check_xml_root (priv->xml_root))
+               {
+                       priv->xml_root = NULL;
+
+                       g_warning ("No root node after applied the XSLT.");
+                       return ret;
+               }
+
+       ret = TRUE;
+
+       xsltFreeStylesheet (xslt);
+
+       return ret;
+}
+
 /**
  * dbt_set_xml:
  * @dbt:
@@ -210,6 +293,7 @@ dbt_set_xml (Dbt *dbt, xmlNodePtr xml_root)
        if (!dbt_check_xml_root (priv->xml_root))
                {
                        priv->xml_root = NULL;
+                       return;
                }
        else
                {
@@ -223,6 +307,8 @@ dbt_set_xml (Dbt *dbt, xmlNodePtr xml_root)
                                        g_warning ("Unable to include xml external files.");
                                }
                }
+
+       dbt_sort_xml (dbt);
 }
 /**
  * dbt_set_xml_from_filename:
@@ -275,7 +361,10 @@ dbt_set_xml_from_filename (Dbt *dbt, const gchar *filename)
        if (!dbt_check_xml_root (priv->xml_root))
                {
                        priv->xml_root = NULL;
+                       return;
                }
+
+       dbt_sort_xml (dbt);
 }
 
 static gboolean
index a61c14bdd724eae9870c1869037efd63015b5f5e..322af8aa49d930074467737ddbc8389516afd20f 100644 (file)
Binary files a/tests/test.db and b/tests/test.db differ
index 2abf1cdf569600091a14a84d7e6baa4929c949d4..944aef8e9761b69d43628810388ca5337444e8a9 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" ?>
 <dbtransformer>
 
-       <dbtransformation id="1">
+       <dbtransformation id="5">
                <drop_table>
                        <table_name>clients</table_name>
                </drop_table>
@@ -9,11 +9,11 @@
                        <table_name>orders</table_name>
                </drop_table>
                <drop_table>
-                       <table_name>newtable</table_name>
+                       <table_name>newtablename</table_name>
                </drop_table>
        </dbtransformation>
 
-       <!--<dbtransformation id="1">
+       <dbtransformation id="1">
                <sql>
                        CREATE TABLE clients (id integer, name varchar(50), CONSTRAINT clients_pkey PRIMARY KEY (id))
                </sql>
                </sql>
        </dbtransformation>
 
-       <dbtransformation id="2">
+       <dbtransformation id="4">
                <sql>
                        ALTER TABLE orders ADD COLUMN total double
                </sql>
-       </dbtransformation>-->
+       </dbtransformation>
 
        <dbtransformation id="3">
+               <rename_table>
+                       <table_name>newtable</table_name>
+                       <new_table_name>newtablename</new_table_name>
+               </rename_table>
+       </dbtransformation>
+
+       <dbtransformation id="2">
                <gda_op>
                        <serv_op_data type="CREATE_TABLE">
                                <op_data path="/TABLE_DEF_P/TABLE_NAME">newtable</op_data>
                </gda_op>
        </dbtransformation>
 
-       <dbtransformation id="4">
-               <rename_table>
-                       <table_name>newtable</table_name>
-                       <new_table_name>newtablename</new_table_name>
-               </rename_table>
-       </dbtransformation>
-
 </dbtransformer>