![]() |
![]() |
![]() |
![]() |
#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"); }