Full example

    #include <libgda/libgda.h>
#include <stdio.h>

#define DEFAULT_BUFFER_SIZE 1024


gboolean
get_errors (GdaConnection * connection)
{
	GList *list;
	GList *node;
	GdaConnectionEvent *error;

	list = (GList *) gda_connection_get_events (connection);

	for (node = g_list_first (list); node != NULL; node = g_list_next (node)) {
		error = (GdaConnectionEvent *) node->data;
		g_print ("Error no: %d\t", gda_connection_event_get_code (error));
		g_print ("desc: %s\t", gda_connection_event_get_description (error));
		g_print ("source: %s\t", gda_connection_event_get_source (error));
		g_print ("sqlstate: %s\n", gda_connection_event_get_sqlstate (error));
	}
}



void
show_table (GdaDataModel * dm)
{
	gint row_id;
	gint column_id;
	GValue *value;
	gchar *string;

	for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
	     column_id++)
		g_print ("%s\t", gda_data_model_get_column_title (dm, column_id));
	g_print ("\n");

	for (row_id = 0; row_id < gda_data_model_get_n_rows (dm); row_id++) {
		for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
		     column_id++)
			{
				value =
					(GValue *) gda_data_model_get_value_at (dm, column_id, row_id);
				string = gda_value_stringify (value);
				g_print ("%s\t", string);
				g_free (string);
			}
		g_print ("\n");
	}
}



void
show_table2 (GdaDataModel * dm)
{
	gint row_id;
	gint column_id;
	const GValue *value;
	GdaRow *row;
	gchar *string;

	for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
	     column_id++)
		g_print ("%s\t", gda_data_model_get_column_title (dm, column_id));
	g_print ("\n");

	for (row_id = 0; row_id < gda_data_model_get_n_rows (dm); row_id++) {
		row = (GdaRow *) gda_data_model_row_get_row (GDA_DATA_MODEL_ROW (dm), row_id);
		for (column_id = 0; column_id < gda_data_model_get_n_columns (dm);
		     column_id++) {
			value = gda_row_get_value (row, column_id);
			string = gda_value_stringify (value);
			g_print ("%s\t", string);
			g_free (string);
		}
		g_print ("\n");
	}
}



void
process_accounts (GdaConnection * connection)
{
	GdaTransaction *transaction_one, *transaction_two;
	GdaCommand *command;

	transaction_one = gda_transaction_new ("accounts1");
	gda_transaction_set_isolation_level (transaction_one,
					     GDA_TRANSACTION_ISOLATION_SERIALIZABLE);
	gda_connection_begin_transaction (connection, transaction_one);

	command = gda_command_new ("UPDATE accounts SET balance=balance+50"
				   "WHERE account_code=456",
				   GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	gda_command_set_transaction (command, transaction_one);
	gda_connection_execute_select_command (connection, command, NULL);
	gda_command_free (command);

	command = gda_command_new ("UPDATE accounts SET balance=balance-50"
				   "WHERE account_code=12",
				   GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	gda_command_set_transaction (command, transaction_one);
	gda_connection_execute_select_command (connection, command, NULL);
	gda_command_free (command);

	gda_connection_commit_transaction (connection, transaction_one);
	g_object_unref (transaction_one);

	transaction_two = gda_transaction_new ("accounts2");
	gda_transaction_set_isolation_level (transaction_two,
					     GDA_TRANSACTION_ISOLATION_SERIALIZABLE);
	gda_connection_begin_transaction (connection, transaction_two);

	command = gda_command_new ("UPDATE accounts SET balance=balance+400"
				   "WHERE account_code=456",
				   GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	gda_command_set_transaction (command, transaction_two);
	gda_connection_execute_select_command (connection, command, NULL);
	gda_command_free (command);

	command = gda_command_new ("UPDATE accounts SET balance=balance-400"
				   "WHERE account_code=12",
				   GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	gda_command_set_transaction (command, transaction_two);
	gda_connection_execute_select_command (connection, command, NULL);
	gda_command_free (command);

	gda_connection_rollback_transaction (connection, transaction_two);
	g_object_unref (transaction_two);

	execute_sql_command (connection, "SELECT * FROM accounts");
}


gint
execute_sql_command (GdaConnection * connection, const gchar * buffer)
{
	GdaCommand *command;
	GList *list;
	GList *node;
	gboolean errors = FALSE;

	GdaDataModel *dm;


	command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	list = gda_connection_execute_command (connection, command, NULL);
	if (list != NULL) {
		for (node = list; node != NULL; node = g_list_next (node)) {
			if (GDA_IS_DATA_MODEL (list->data)) {
				dm = (GdaDataModel *) node->data;
				show_table2 (dm);
				g_object_unref (dm);
			}
			else if (list->data)
				g_object_unref (list->data);
		}
		g_list_free (list);
	}
	else {
		errors = TRUE;
		get_errors (connection);
	}
	gda_command_free (command);

	return (errors);
}



void
execute_sql (GdaConnection * connection, const gchar * buffer)
{
	GdaCommand *command;
	gint number;

	command = gda_command_new (buffer, GDA_COMMAND_TYPE_SQL,
				   GDA_COMMAND_OPTION_STOP_ON_ERRORS);
	gda_connection_execute_select_command (connection, command, NULL);

	gda_command_free (command);
}



void
execute_some_queries (GdaConnection * connection)
{

	execute_sql (connection, "DELETE FROM cliente");
	execute_sql (connection,
			       "INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
			       "VALUES ('1', '1234', 'Xabier',"
			       "'Rua Unha calquera', '123')"
			       "; INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
			       "VALUES ('2', '2345', 'Rodriguez',"
			       "'Rua Outra calquera', '234')");
	execute_sql (connection,
			       "INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
			       "VALUES ('1', '1234', 'Xabier',"
			       "'Rua Unha calquera', '123')"
			       "; INSERT INTO cliente(cd_cli, dni, nombr, direc, telef) "
			       "VALUES ('2', '2345', 'Rodriguez',"
			       "'Rua Outra calquera', '234')");

	execute_sql_command (connection, "SELECT * FROM cliente");


	execute_sql (connection,
			       "DELETE FROM accounts;"
			       "INSERT INTO accounts"
			       "(client_code, account_code, balance)"
			       "VALUES (123, 456, 1000);"
			       "INSERT INTO accounts"
			       "(client_code, account_code, balance)"
			       "VALUES (789, 012, 5000);");

	execute_sql_command (connection, "SELECT * FROM accounts");
}



void
list_datasources (void)
{
	GList *ds_list;
	GList *node;
	GdaDataSourceInfo *info;

	ds_list = gda_config_get_data_source_list ();

	g_print ("\n");
	for (node = g_list_first (ds_list); node != NULL; node = g_list_next (node)) {
		info = (GdaDataSourceInfo *) node->data;
		
		g_print
			("NAME: %s PROVIDER: %s CNC: %s DESC: %s USER: %s PASSWORD: %s\n",
			 info->name, info->provider, info->cnc_string, info->description,
			 info->username, info->password);
		
	}
	g_print ("\n");

	gda_config_free_data_source_list (ds_list);

}



void
list_providers (void)
{
	GList *prov_list;
	GList *node;
	GdaProviderInfo *info;

	prov_list = gda_config_get_provider_list ();

	for (node = g_list_first (prov_list); node != NULL;
	     node = g_list_next (node))	{
		info = (GdaProviderInfo *) node->data;
		
		g_print ("ID: %s\n", info->id);
	}
}


void
play_with_parameters ()
{
	GdaParameterList *list;
	GdaParameter *parameter;
	GValue *value;

	list = gda_parameter_list_new (NULL);

	g_value_set_int (value = gda_value_new (G_TYPE_INT), 10);
	parameter = gda_parameter_new_from_value ("p1", value);
	gda_parameter_list_add_param (list, parameter);
	gda_value_free (value);
	g_object_unref (parameter);

	g_value_set_int (value = gda_value_new (G_TYPE_INT), 2);
	parameter = gda_parameter_new_from_value ("p2", value);
	gda_parameter_list_add_param (list, parameter);
	gda_value_free (value);
	g_object_unref (parameter);

	g_object_unref (list);
}



void
do_stuff ()
{
	GdaClient *client;
	GdaConnection *connection;

	list_providers ();
	list_datasources ();

	client = gda_client_new ();

	g_print ("CONNECTING\n");
	connection = gda_client_open_connection (client, "calvaris", NULL, NULL,
						 GDA_CONNECTION_OPTIONS_READ_ONLY);

	g_print ("CONNECTED\n");

	execute_some_queries (connection);

	g_print ("ERRORS PROVED!\n");

	process_accounts (connection);

	gda_client_close_all_connections (client);

	g_object_unref (G_OBJECT (client));

	play_with_parameters ();

	gda_main_quit ();
}



void
save_ds ()
{
	gda_config_save_data_source ("calvaris", "PostgreSQL", "DATABASE=calvaris",
				     "cosa de calvaris", NULL, NULL);
}



void
remove_ds ()
{
	gda_config_remove_data_source ("calvaris");
}



int
main (int argc, char **argv)
{

	g_print ("STARTING\n");
	gda_init ("TestGDA", "0.1", argc, argv);

	save_ds ();
	/*  remove_ds(); */

	gda_main_run ((GdaInitFunc) do_stuff, (gpointer) NULL);
	/* do_stuff(); */
	g_print ("ENDING\n");

}