]> saetta.ns0.it Git - libzakdbt/commitdiff
Added function Dbt::db_is_updated.
authorAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 13:49:41 +0000 (15:49 +0200)
committerAndrea Zagli <azagli@libero.it>
Sat, 2 Oct 2010 13:49:41 +0000 (15:49 +0200)
src/dbtransformer.c
src/libdbtransformer.h
tests/test.c
tests/test.db

index 36195262fee5decd1ccdab76eec95024728dc6a5..21333454b27237c3bc648aa8f1cbb667ddded607 100644 (file)
@@ -33,7 +33,7 @@
 
 #include "libdbtransformer.h"
 
-gchar *str_xslt_doc =
+static 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"
@@ -62,6 +62,8 @@ static void dbt_get_property (GObject *object,
                                GValue *value,
                                GParamSpec *pspec);
 
+static gboolean dbt_check_db (Dbt *dbt, gboolean create_tables);
+
 #define DBT_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), TYPE_DBT, DbtPrivate))
 
 typedef struct _DbtPrivate DbtPrivate;
@@ -367,8 +369,100 @@ dbt_set_xml_from_filename (Dbt *dbt, const gchar *filename)
        dbt_sort_xml (dbt);
 }
 
+/**
+ * dbt_db_is_updated:
+ * @dbt:
+ *
+ */
+gboolean
+dbt_db_is_updated (Dbt *dbt)
+{
+       gboolean ret;
+
+       DbtPrivate *priv;
+
+       xmlXPathContextPtr xpcontext;
+       xmlXPathObjectPtr xpresult;
+       xmlNodeSetPtr xnodeset;
+
+       gchar *str_id;
+       guint id;
+
+       gchar *sql;
+       GdaStatement *stmt;
+       GdaDataModel *dm;
+       GError *error;
+
+       g_return_val_if_fail (IS_DBT (dbt), FALSE);
+
+       priv = DBT_GET_PRIVATE (dbt);
+
+       ret = FALSE;
+
+       if (!dbt_check_db (dbt, FALSE))
+               {
+                       return ret;
+               }
+
+       xpcontext = xmlXPathNewContext (priv->xml_doc);
+       xpcontext->node = priv->xml_root;
+
+       xpresult = xmlXPathEvalExpression ((const xmlChar *)"child::dbtransformation[last()]", xpcontext);
+       if (!xmlXPathNodeSetIsEmpty (xpresult->nodesetval)
+           && xpresult->nodesetval->nodeNr == 1)
+               {
+                       xnodeset = xpresult->nodesetval;
+                       str_id = xmlGetProp (xnodeset->nodeTab[0], (const gchar *)"id");
+                       if (str_id == NULL)
+                               {
+                                       return ret;
+                               }
+                       id = strtol (str_id, NULL, 10);
+                       if (id <= 0)
+                               {
+                                       return ret;
+                               }
+
+                       if (!GDA_IS_SQL_PARSER (priv->gda_parser))
+                               {
+                                       g_warning ("Invalid sql parser.");
+                                       return ret;
+                               }
+
+                       sql = g_strdup_printf ("SELECT id FROM dbt_transformations"
+                                              " WHERE id = %d",
+                                              id);
+                       error = NULL;
+                       stmt = gda_sql_parser_parse_string (priv->gda_parser, 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");
+                                       return ret;
+                               }
+                       else
+                               {
+                                       dm = gda_connection_statement_execute_select (priv->gda_conn, stmt, NULL, &error);
+                                       g_object_unref (stmt);
+                                       if (!dm || gda_data_model_get_n_rows (dm) == 0)
+                                               {
+                                                       return ret;
+                                               }
+                               }
+               }
+       else
+               {
+                       g_warning ("No last transformation found.");
+                       return ret;
+               }
+
+       ret = TRUE;
+
+       return ret;
+}
+
 static gboolean
-dbt_check_db (Dbt *dbt)
+dbt_check_db (Dbt *dbt, gboolean create_tables)
 {
        DbtPrivate *priv;
 
@@ -396,7 +490,7 @@ dbt_check_db (Dbt *dbt)
        stmt = gda_sql_parser_parse_string (priv->gda_parser, sql, NULL, &error);
        if (stmt == NULL)
                {
-                       g_warning ("Unable to create GdaStatement from sql: %s\n%s",
+                       g_warning ("Unable to create GdaStatement from sql: %s\n%s.",
                                   sql, error && error->message ? error->message : "No detail");
                }
        else
@@ -405,6 +499,11 @@ dbt_check_db (Dbt *dbt)
                        g_object_unref (stmt);
                        if (!dm)
                                {
+                                       if (!create_tables)
+                                               {
+                                                       return ret;
+                                               }
+                                       
                                        /* table doesn't exist */
                                        GdaServerOperation *op;
                                        gint i;
@@ -414,7 +513,7 @@ dbt_check_db (Dbt *dbt)
                                        if (!op)
                                                {
                                                        g_warning ("CREATE TABLE operation is not supported by the provider: %s.",
-                                                                        error != NULL && error->message != NULL ? error->message : "no detail");
+                                                                  error != NULL && error->message != NULL ? error->message : "no detail");
                                                        return ret;
                                                }
 
@@ -444,7 +543,7 @@ dbt_check_db (Dbt *dbt)
                                        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");
+                                                                  error != NULL && error->message != NULL ? error->message : "no detail");
                                                        return ret;
                                                }
                                        g_object_unref (op);                    
@@ -1001,7 +1100,7 @@ dbt_transform (Dbt *dbt)
        g_return_if_fail (priv->gda_conn != NULL);
        g_return_if_fail (priv->xml_root != NULL);
 
-       if (!dbt_check_db (dbt))
+       if (!dbt_check_db (dbt, TRUE))
                {
                        return;
                }
@@ -1010,7 +1109,8 @@ dbt_transform (Dbt *dbt)
        xpcontext->node = priv->xml_root;
 
        xpresult = xmlXPathEvalExpression ((const xmlChar *)"child::dbtransformation", xpcontext);
-       if (!xmlXPathNodeSetIsEmpty (xpresult->nodesetval) || xpresult->nodesetval->nodeNr < 1)
+       if (!xmlXPathNodeSetIsEmpty (xpresult->nodesetval)
+           || xpresult->nodesetval->nodeNr < 1)
                {
                        xnodeset = xpresult->nodesetval;
 
@@ -1018,13 +1118,18 @@ dbt_transform (Dbt *dbt)
                                {
                                        tosave = TRUE;
 
-                                       str_id= xmlGetProp (xnodeset->nodeTab[i], (const gchar *)"id");
+                                       str_id = xmlGetProp (xnodeset->nodeTab[i], (const gchar *)"id");
                                        if (str_id == NULL)
                                                {
                                                        g_warning ("Operation id cannot be minor equal to zero.");
                                                        continue;
                                                }
                                        id = strtol (str_id, NULL, 10);
+                                       if (id <= 0)
+                                               {
+                                                       g_warning ("Operation id cannot be minor equal to zero.");
+                                                       continue;
+                                               }
 
                                        if (dbt_check_to_execute (dbt, id))
                                                {
index a0993aa1c902844fe3ad774c642f0e5be55250e7..c9aeaeb8d92e91c1b0a2b8da3f172fa7690e7cbe 100644 (file)
@@ -59,6 +59,8 @@ void dbt_set_db_connection_from_string (Dbt *dbt, const gchar *cnc_string);
 void dbt_set_xml (Dbt *dbt, xmlNodePtr xml_root);
 void dbt_set_xml_from_filename (Dbt *dbt, const gchar *filename);
 
+gboolean dbt_db_is_updated (Dbt *dbt);
+
 void dbt_transform (Dbt *dbt);
 
 
index 858288e277201fb15ef19699fe313c747b4825d5..f7937b0afbfc0e3e5b215dcc9099416b6a1cd0fe 100644 (file)
@@ -30,6 +30,16 @@ main (int argc, char **argv)
        dbt_set_db_connection_from_string (dbt, "SQLite://DB_DIR=tests;DB_NAME=test.db");
        dbt_set_xml_from_filename (dbt, "tests/test.xml");
 
+       if (dbt_db_is_updated (dbt))
+               {
+                       g_message ("Database is updated.");
+                       return;
+               }
+       else
+               {
+                       g_message ("Database is not updated.");
+               }
+
        dbt_transform (dbt);
 
        return 0;
index 322af8aa49d930074467737ddbc8389516afd20f..9a42333f759fa51e4a707e3e860b332abd51d08b 100644 (file)
Binary files a/tests/test.db and b/tests/test.db differ