From: Andrea Zagli Date: Wed, 18 Dec 2013 11:50:17 +0000 (+0100) Subject: Continued GUI to view changes. X-Git-Url: https://saetta.ns0.it/gitweb?a=commitdiff_plain;h=f4ac81a0b35dbc2880480edb1842b307f7e0d850;p=zakaudit%2Flibzakaudit Continued GUI to view changes. --- diff --git a/.cproject b/.cproject index 8913d51..c9ddf97 100644 --- a/.cproject +++ b/.cproject @@ -29,6 +29,7 @@ + diff --git a/.project b/.project index 3744bb5..37cd93d 100644 --- a/.project +++ b/.project @@ -25,7 +25,7 @@ - 1387288872089 + 1387289817648 22 @@ -34,7 +34,7 @@ - 1387288872094 + 1387289817661 30 @@ -43,7 +43,7 @@ - 1387288872099 + 1387289817665 22 @@ -52,7 +52,7 @@ - 1387288872104 + 1387289817675 22 @@ -61,7 +61,7 @@ - 1387288872110 + 1387289817681 22 @@ -70,7 +70,7 @@ - 1387288872114 + 1387289817685 22 @@ -79,7 +79,7 @@ - 1387288872119 + 1387289817687 22 @@ -88,7 +88,7 @@ - 1387288872123 + 1387289817690 22 @@ -97,7 +97,7 @@ - 1387288872127 + 1387289817692 22 @@ -106,7 +106,7 @@ - 1387288872133 + 1387289817694 22 @@ -115,7 +115,7 @@ - 1387288872138 + 1387289817697 22 @@ -124,7 +124,7 @@ - 1387288872142 + 1387289817715 22 @@ -133,7 +133,7 @@ - 1387288872147 + 1387289817727 22 @@ -142,7 +142,7 @@ - 1387288872153 + 1387289817730 22 @@ -151,7 +151,7 @@ - 1387288872158 + 1387289817743 22 @@ -160,7 +160,7 @@ - 1387288872162 + 1387289817746 22 @@ -169,7 +169,7 @@ - 1387288872169 + 1387289817758 22 @@ -178,7 +178,7 @@ - 1387288872173 + 1387289817761 22 @@ -187,7 +187,7 @@ - 1387288872178 + 1387289817802 22 @@ -196,7 +196,7 @@ - 1387288872183 + 1387289817806 22 @@ -205,7 +205,7 @@ - 1387288872188 + 1387289817809 22 @@ -214,7 +214,7 @@ - 1387288872193 + 1387289817823 22 @@ -223,7 +223,7 @@ - 1387288872197 + 1387289817830 22 @@ -232,7 +232,7 @@ - 1387288872201 + 1387289817842 22 @@ -241,7 +241,7 @@ - 1387288872206 + 1387289817845 22 diff --git a/src/audit.c b/src/audit.c index 885c1eb..54ffd97 100644 --- a/src/audit.c +++ b/src/audit.c @@ -98,6 +98,10 @@ struct _ZakAuditPrivate GList *datasources; GHashTable *fields_updated; + + gchar *guidir; + gchar *guifile; + GtkBuilder *gtkbuilder; }; /* PRIVATE */ @@ -127,9 +131,42 @@ static ZakAudit *zak_audit_new_ () { ZakAudit *zak_audit; + ZakAuditPrivate *priv; zak_audit = ZAK_AUDIT (g_object_new (zak_audit_get_type (), NULL)); + priv = ZAK_AUDIT_GET_PRIVATE (zak_audit); + + /* gui */ +#ifdef G_OS_WIN32 + + gchar *moddir; + gchar *p; + + moddir = g_win32_get_package_installation_directory_of_module (NULL); + + p = g_strrstr (moddir, g_strdup_printf ("%c", G_DIR_SEPARATOR)); + if (p != NULL + && (g_ascii_strcasecmp (p + 1, "src") == 0 + || g_ascii_strcasecmp (p + 1, ".libs") == 0)) + { + priv->guidir = g_strdup (GUIDIR); + } + else + { + priv->guidir = g_build_filename (moddir, "share", PACKAGE, "gui", NULL); + } + +#else + + priv->guidir = g_strdup (GUIDIR); + +#endif + + priv->guifile = g_build_filename (priv->guidir, "libzakaudit.ui", NULL); + + priv->gtkbuilder = gtk_builder_new (); + return zak_audit; } @@ -1188,9 +1225,158 @@ zak_audit_action_from_gdastatement (ZakAudit *zak_audit, return ret; } + /** - * zak_audit_destroy: + * zak_audit_get_changes_widget: + * @zak_audit: an #ZakAudit object. + * @datasource_name: + * @table_name: + * @key_values: * + * Returns: the #GtkWidget. + */ +GtkWidget +*zak_audit_get_changes_widget (ZakAudit *zak_audit, + const gchar *datasource_name, + const gchar *table_name, + const gchar **key_values) +{ + GError *error; + + GtkWidget *ret; + + Datasource *datasource; + Table *table; + Field *field; + + guint l; + guint strpart; + + gchar *field_name; + gchar *field_value; + + gchar *sql; + GString *sql_where; + GdaDataModel *dm; + + GtkTreeStore *tstore; + GtkTreeIter iter; + GtkTreeIter iter_parent; + + ZakAuditPrivate *priv = ZAK_AUDIT_GET_PRIVATE (zak_audit); + + datasource = get_datasource_from_name (zak_audit, datasource_name); + if (datasource == NULL) + { + return NULL; + } + + table = get_table_from_name (zak_audit, datasource, table_name); + if (table == NULL) + { + return NULL; + } + + l = g_strv_length ((gchar **)key_values); + for (strpart = 0; strpart < l; strpart++) + { + field_name = (gchar *)key_values[strpart]; + if (field_name == NULL) break; + + field = get_field_from_name (zak_audit, table, field_name); + + if (strpart + 1 >= l) break; + + field_value = (gchar *)key_values[++strpart]; + if (field_value == NULL) break; + + /* TODO the db field can be other type than string */ + g_string_append_printf (sql_where, " AND (v.id_fields = %d" + " AND (v.value = '%s' OR v.value LIKE '%s|%%'))", + field->id, + field_value, + field_value); + } + + if (sql_where->len == 0) + { + return NULL; + } + else + { + g_string_erase (sql_where, 0, 5); + } + + sql = g_strdup_printf ("(SELECT a.id, a.type, a.username, a.date," + " v.value" + " FROM actions AS a" + " INNER JOIN values AS v ON a.id = v.id_actions" + " INNER JOIN fields AS f ON v.id_fields = f.id" + " WHERE a.type = %d" + " AND a.id_tables = %d" + " AND %s" + " AND f.is_key = TRUE)" + " UNION" + " (SELECT a.id, a.type, a.username, a.date," + " v.value" + " FROM actions AS a" + " INNER JOIN values AS v ON a.id = v.id_actions" + " INNER JOIN fields AS f ON v.id_fields = f.id" + " WHERE a.type = %d" + " AND a.id_tables = %d" + " AND %s" + " AND f.is_key = TRUE)" + " UNION", + " (SELECT a.id, a.type, a.username, a.date," + " v.value" + " FROM actions AS a" + " INNER JOIN values AS v ON a.id = v.id_actions" + " INNER JOIN fields AS f ON v.id_fields = f.id" + " WHERE a.type = %d" + " AND a.id_tables = %d" + " AND %s" + " AND f.is_key = TRUE)", + ZAK_AUDIT_ACTION_INSERT, + table->id, + sql_where->str, + ZAK_AUDIT_ACTION_AFTER_UPDATE, + table->id, + sql_where->str, + ZAK_AUDIT_ACTION_DELETE, + table->id, + sql_where->str); + + dm = gdaex_query (priv->gdaex, sql); + g_free (sql); + if (dm != NULL && gda_data_model_get_n_rows (dm) > 0) + { + error = NULL; + gtk_builder_add_objects_from_file (priv->gtkbuilder, priv->guifile, + g_strsplit ("tstore_changes" + "|w_changes", + "|", -1), + &error); + + tstore = gtk_builder_get_object (priv->gtkbuilder, "tstore_changes"); + + /* TODO check if key field value is changed */ + + + } + if (dm != NULL) + { + g_object_unref (dm); + } + + ret = NULL; + g_warning ("The function is still to be implemented"); + + return ret; +} + +/** + * zak_audit_destroy: + * @zak_audit: an #ZakAudit object. */ void zak_audit_destroy (ZakAudit *zak_audit) diff --git a/src/libzakaudit.h b/src/libzakaudit.h index 5b3f76d..2680638 100644 --- a/src/libzakaudit.h +++ b/src/libzakaudit.h @@ -70,24 +70,29 @@ ZakAudit *zak_audit_new_from_string (const gchar *cnc_string); gboolean zak_audit_action (ZakAudit *zak_audit, enum ZakAuditActions action, - const gchar *dn, + const gchar *username, const gchar *datasource_name, const gchar *table_name, ...); gboolean zak_audit_action_v (ZakAudit *zak_audit, enum ZakAuditActions action, - const gchar *dn, + const gchar *username, const gchar *datasource_name, const gchar *table_name, const gchar **fields_values); gboolean zak_audit_action_from_gdastatement (ZakAudit *zak_audit, enum ZakAuditActions action, - const gchar *dn, + const gchar *username, const gchar *datasource_name, GdaStatement *gda_statement); +GtkWidget *zak_audit_get_changes_widget (ZakAudit *zak_audit, + const gchar *datasource_name, + const gchar *table_name, + const gchar **key_values); + void zak_audit_destroy (ZakAudit *zak_audit);