From: Andrea Zagli Date: Sat, 2 Oct 2010 13:49:41 +0000 (+0200) Subject: Added function Dbt::db_is_updated. X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=c16ceaf0625064f2dbfbc4d7b47fa93953586c57;p=libzakdbt Added function Dbt::db_is_updated. --- diff --git a/src/dbtransformer.c b/src/dbtransformer.c index 3619526..2133345 100644 --- a/src/dbtransformer.c +++ b/src/dbtransformer.c @@ -33,7 +33,7 @@ #include "libdbtransformer.h" -gchar *str_xslt_doc = +static gchar *str_xslt_doc = "\n" "\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)) { diff --git a/src/libdbtransformer.h b/src/libdbtransformer.h index a0993aa..c9aeaeb 100644 --- a/src/libdbtransformer.h +++ b/src/libdbtransformer.h @@ -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); diff --git a/tests/test.c b/tests/test.c index 858288e..f7937b0 100644 --- a/tests/test.c +++ b/tests/test.c @@ -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; diff --git a/tests/test.db b/tests/test.db index 322af8a..9a42333 100644 Binary files a/tests/test.db and b/tests/test.db differ