Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.3.1 |  CUBRID 8.4.0 |  CUBRID 8.4.1 | 



Writing CCI Application Program

The basic steps used for writing programs are as follows, and a step for binding the data to a variable is added to use the prepared statement. The steps are implemented in example codes 1 and 2.

You can configure the default value of auto-commit mode by using CCI_DEFAULT_AUTOCOMMIT (broker parameter) upon startup of an application. If configuration on broker parameter is omitted, the default value is ON; use the cci_set_autocommit() function to change auto-commit mode within an application. If auto-commit mode is OFF, you must explicitly commit or roll back transaction by using the cci_end_tran() function.

Example 1

//Example to execute a simple query

#include <stdio.h>

#include "cas_cci.h"  

#define BUFSIZE  (1024)

 

int

main (void)

{

  int con = 0, req = 0, col_count = 0, i, ind;

  int error;

  char *data;

  T_CCI_ERROR cci_error;

  T_CCI_COL_INFO *col_info;

  T_CCI_SQLX_CMD cmd_type;

  char *query = "select * from code";

 

//getting a connection handle for a connection with a server

  con = cci_connect ("localhost", 33000, "demodb", "dba", "");

  if (con < 0)

    {

      printf ("cannot connect to database ");

      return 1;

    }

 

//preparing the SQL statement

  req = cci_prepare (con, query, 0, &cci_error);

  if (req < 0)

    {

      printf ("prepare error: %d, %s ", cci_error.err_code,

              cci_error.err_msg);

      goto handle_error;

    }

 

//getting column information when the prepared statement is the SELECT query

  col_info = cci_get_result_info (req, &cmd_type, &col_count);

  if (col_info == NULL)

    {

      printf ("get_result_info error: %d, %s ", cci_error.err_code,

              cci_error.err_msg);

      goto handle_error;

    }

 

//Executing the prepared SQL statement

  error = cci_execute (req, 0, 0, &cci_error);

  if (error < 0)

    {

      printf ("execute error: %d, %s ", cci_error.err_code,

              cci_error.err_msg);

      goto handle_error;

    }

  while (1)

    {

 

//Moving the cursor to access a specific tuple of results

      error = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &cci_error);

      if (error == CCI_ER_NO_MORE_DATA)

        {

          break;

        }

      if (error < 0)

        {

          printf ("cursor error: %d, %s ", cci_error.err_code,

                  cci_error.err_msg);

          goto handle_error;

        }

 

//Fetching the query result into a client buffer

      error = cci_fetch (req, &cci_error);

      if (error < 0)

        {

          printf ("fetch error: %d, %s ", cci_error.err_code,

                  cci_error.err_msg);

          goto handle_error;

        }

      for (i = 1; i <= col_count; i++)

        {

 

//Getting data from the fetched result

          error = cci_get_data (req, i, CCI_A_TYPE_STR, &data, &ind);

          if (error < 0)

            {

              printf ("get_data error: %d, %d ", error, i);

              goto handle_error;

            }

          printf ("%s |", data);

        }

      printf (" ");

    }

 

//Closing the request handle

  error = cci_close_req_handle (req);

  if (error < 0)

    {

      printf ("close_req_handle error: %d, %s ", cci_error.err_code,

              cci_error.err_msg);

      goto handle_error;

    }

 

//Disconnecting with the server

  error = cci_disconnect (con, &cci_error);

  if (error < 0)

    {

      printf ("error: %d, %s ", cci_error.err_code, cci_error.err_msg);

      goto handle_error;

    }

 

  return 0;

 

handle_error:

  if (req > 0)

    cci_close_req_handle (req);

  if (con > 0)

    cci_disconnect (con, &cci_error);

 

  return 1;

}

Example 2

//Example to execute a query with a bind variable

 

char *query = "select * from nation where name = ?";

  char namebuf[128];

 

//getting a connection handle for a connection with a server

  con = cci_connect ("localhost", 33000, "demodb", "dba", "");

  if (con < 0)

    {

      printf ("cannot connect to database ");

      return 1;

    }

 

//preparing the SQL statement

  req = cci_prepare (con, query, 0, &cci_error);

  if (req < 0)

    {

      printf ("prepare error: %d, %s ", cci_error.err_code,

              cci_error.err_msg);

      goto handle_error;

    }

 

//Binding date into a value

  strcpy (namebuf, "Korea");

  error =

    cci_bind_param (req, 1, CCI_A_TYPE_STR, &namebuf, CCI_U_TYPE_STRING,

                    CCI_BIND_PTR);

  if (error < 0)

    {

      printf ("bind_param error: %d ", error);

      goto handle_error;

    }

Example 3

#include <stdio.h>

#include "cas_cci.h"

 

//Example to use connection/statement pool in CCI

int main ()

{

  T_CCI_PROPERTIES *ps = NULL;

  T_CCI_DATASOURCE *ds = NULL;

  T_CCI_ERROR err;

  T_CCI_CONN cons[20];

  int rc = 1, i;

 

  ps = cci_property_create ();

  if (ps == NULL)

    {

      fprintf (stderr, "Could not create T_CCI_PROPERTIES. ");

      rc = 0;

      goto cci_pool_end;

    }

 

  cci_property_set (ps, "user", "dba");

  cci_property_set (ps, "url", "cci:cubrid:localhost:33000:demodb:::");

  cci_property_set (ps, "pool_size", "10");

  cci_property_set (ps, "max_wait", "1200");

  cci_property_set (ps, "pool_prepared_statement", "true");

  cci_property_set (ps, "default_autocommit", "false");

  cci_property_set (ps, "default_isolation", "TRAN_REP_CLASS_UNCOMMIT_INSTANCE");

  cci_property_set (ps, "default_lock_timeout", "10");

  cci_property_set (ps, "login_timeout", "300000");

  cci_property_set (ps, "query_timeout", "3000");

 

  ds = cci_datasource_create (ps, &err);

  if (ds == NULL)

    {

      fprintf (stderr, "Could not create T_CCI_DATASOURCE. ");

      fprintf (stderr, "E[%d,%s] ", err.err_code, err.err_msg);

      rc = 0;

      goto cci_pool_end;

    }

 

  for (i = 0; i < 3; i++)

    {

      cons[i] = cci_datasource_borrow (ds, &err);

      if (cons[i] < 0)

        {

          fprintf (stderr,

                   "Could not borrow a connection from the data source. ");

          fprintf (stderr, "E[%d,%s] ", err.err_code, err.err_msg);

          continue;

        }

      // put working code here.

      cci_work (cons[i]);

    }

 

  sleep (1);

 

  for (i = 0; i < 3; i++)

    {

      if (cons[i] < 0)

        {

          continue;

        }

      cci_datasource_release (ds, cons[i], &err);

    }

cci_pool_end:

  cci_property_destroy (ps);

  cci_datasource_destroy (ds);

 

  return 0;

}

 

// working code

int cci_work (T_CCI_CONN con)

{

  T_CCI_ERROR err;

  char sql[4096];

  int req, res, error, ind;

  int data;

 

  cci_set_autocommit (con, CCI_AUTOCOMMIT_TRUE);

  cci_set_lock_timeout (con, 100, &err);

  cci_set_isolation_level (con, TRAN_REP_CLASS_COMMIT_INSTANCE, &err);

 

  error = 0;

  snprintf (sql, 4096, "SELECT host_year FROM record WHERE athlete_code=11744");

  req = cci_prepare (con, sql, 0, &err);

  if (req < 0)

    {

      printf ("prepare error: %d, %s ", err.err_code, err.err_msg);

      return error;

    }

 

  res = cci_execute (req, 0, 0, &err);

  if (res < 0)

    {

      printf ("execute error: %d, %s ", err.err_code, err.err_msg);

      goto cci_work_end;

    }

 

  while (1)

    {

      error = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &err);

      if (error == CCI_ER_NO_MORE_DATA)

        {

          break;

        }

      if (error < 0)

        {

          printf ("cursor error: %d, %s ", err.err_code, err.err_msg);

          goto cci_work_end;

        }

 

      error = cci_fetch (req, &err);

      if (error < 0)

        {

          printf ("fetch error: %d, %s ", err.err_code, err.err_msg);

          goto cci_work_end;

        }

 

      error = cci_get_data (req, 1, CCI_A_TYPE_INT, &data, &ind);

      if (error < 0)

        {

          printf ("get data error: %d ", error);

          goto cci_work_end;

        }

      printf ("%d ", data);

    }

 

  error = 1;

cci_work_end:

  cci_close_req_handle (req);

  return error;

}