GList *datasources;
GHashTable *fields_updated;
+
+ gchar *guidir;
+ gchar *guifile;
+ GtkBuilder *gtkbuilder;
};
/* PRIVATE */
*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;
}
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)
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);