# Full example

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

        #define DEFAULT_BUFFER_SIZE 1024

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

          list = (GList *) gda_connection_get_errors (connection);

          for (node = g_list_first (list); node != NULL; node = g_list_next (node))
            {
              error = (GdaError *) node->data;
              g_print ("Error no: %d\t", gda_error_get_number (error));
              g_print ("desc: %s\t", gda_error_get_description (error));
              g_print ("source: %s\t", gda_error_get_source (error));
              g_print ("sqlstate: %s\n", gda_error_get_sqlstate (error));
            }
        }

        void
        show_table (GdaDataModel * dm)
        {
          gint row_id;
          gint column_id;
          GdaValue *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 =
                    (GdaValue *) 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;
          GdaValue *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_get_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);
                  gda_value_free(value);
                  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_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_non_query(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_non_query(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_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_non_query(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_non_query(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");
        }

        void process_accounts2(GdaConnection *connection)
        {/*
          GdaBatch *batch;
          GdaCommand *command;

          batch=gda_batch_new();
          gda_batch_add_command(batch,
                                "UPDATE accounts SET balance=balance+300"
                                "WHERE account_code=456"
                               );
          gda_batch_add_command(batch,
                                "UPDATE accounts SET balance=balance-300"
                                "WHERE account_code=12",
                               );
          gda_batch_set_connection(batch,connection);
          gda_batch_set_transaction_mode(batch,TRUE);
          if (gda_batch_start(batch))
            g_print("BATCH OK\n");
          else
            g_print("BATCH failed\n");

          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=g_list_first(list); node != NULL; node=g_list_next(node))
              {
                dm=(GdaDataModel *) node->data;
                if (dm == NULL)
                  {
                    errors=TRUE;
                  }
                else
                  {
                    show_table (dm);
                    g_object_unref(dm);
                  }
              }
          else
            {
              errors=TRUE;
            }
          gda_command_free (command);

          return (errors);
        }

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

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

          gda_command_free (command);

          return (number);
        }

        void
        proving_errors (GdaConnection *connection)
        {

          execute_sql_non_query (connection,
                                 "DELETE FROM cliente"
                                );
          execute_sql_non_query (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_non_query (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_non_query (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);

            }

          gda_config_free_provider_list (prov_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);
          g_print ("CONNECTED\n");

          proving_errors (connection);

          process_accounts(connection);

          process_accounts2(connection);

          gda_client_close_all_connections (client);

          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();

        }