return NULL;
}
+ sql_where = g_string_new ("");
+
l = g_strv_length ((gchar **)key_values);
for (strpart = 0; strpart < l; strpart++)
{
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 fields AS f ON v.id_fields = f.id"
" WHERE a.type = %d"
" AND a.id_tables = %d"
- " AND %s"
+ "%s"
" AND f.is_key = TRUE)"
" UNION"
" (SELECT a.id, a.type, a.username, a.date,"
" INNER JOIN fields AS f ON v.id_fields = f.id"
" WHERE a.type = %d"
" AND a.id_tables = %d"
- " AND %s"
+ "%s"
" AND f.is_key = TRUE)"
" UNION",
" (SELECT a.id, a.type, a.username, a.date,"
" INNER JOIN fields AS f ON v.id_fields = f.id"
" WHERE a.type = %d"
" AND a.id_tables = %d"
- " AND %s"
+ "%s"
" AND f.is_key = TRUE)",
ZAK_AUDIT_ACTION_INSERT,
table->id,
"|", -1),
&error);
- tstore = gtk_builder_get_object (priv->gtkbuilder, "tstore_changes");
+ tstore = (GtkTreeStore *)gtk_builder_get_object (priv->gtkbuilder, "tstore_changes");
/* TODO check if key field value is changed */
return ret;
}
+/**
+ * zak_audit_get_user_insertion:
+ * @zak_audit: an #ZakAudit object.
+ * @datasource_name:
+ * @table_name:
+ * @key_values:
+ *
+ */
+const gchar
+*zak_audit_get_user_insertion (ZakAudit *zak_audit,
+ const gchar *datasource_name,
+ const gchar *table_name,
+ const gchar **key_values)
+{
+ Datasource *datasource;
+ Table *table;
+ Field *field;
+
+ guint l;
+ guint strpart;
+
+ gchar *field_name;
+ gchar *field_value;
+
+ gchar *sql;
+ GString *sql_where;
+ GdaDataModel *dm;
+
+ const gchar *ret;
+
+ 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;
+ }
+
+ sql_where = g_string_new ("");
+
+ 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'",
+ field->id,
+ field_value,
+ field_value);
+ }
+
+ sql = g_strdup_printf ("SELECT a.username"
+ " FROM actions AS a"
+ " INNER JOIN values AS v ON a.id = v.id_actions"
+ " WHERE a.type = %d"
+ " AND a.id_tables = %d"
+ "%s",
+ ZAK_AUDIT_ACTION_INSERT,
+ 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)
+ {
+ ret = (const gchar *)gdaex_data_model_get_value_stringify_at (dm, 0, 0);
+ }
+ if (dm != NULL)
+ {
+ g_object_unref (dm);
+ }
+
+ g_string_free (sql_where, TRUE);
+
+ return ret;
+}
+
/**
* zak_audit_destroy:
* @zak_audit: an #ZakAudit object.
zak_audit_action_from_gdastatement (audit, ZAK_AUDIT_ACTION_DELETE, "I", "audit_test1", stmt);
gda_connection_statement_execute_non_select (conn, stmt, NULL, NULL, NULL);
+ g_warning ("User insertion: %s",
+ zak_audit_get_user_insertion (audit, "audit_test1", "test1", g_strsplit ("id|2", "|", -1)));
+
zak_audit_destroy (audit);
return 0;