Open Source RDBMS - Seamless, Scalable, Stable and Free

한국어 | Login |Register

Versions available for this page: CUBRID 8.4.3 |  CUBRID 9.0.0 | 

CCI Sample Program

Description

The sample program shows how to write a CCI application by using the demodb database which is included with the CUBRID installation package. You can practice the ways to connect to CAS, prepare queries, execute queries, handle response, disconnect from CAS, etc. by following sample program below. In the sample program, the dynamic link on Linux environment is used.

The code below shows information about olympic table schema in the demodb database which is used for sample program.

csql> ;sc olympic

 

=== <Help: Schema of a Class> ===

 

 

 <Class Name>

 

     olympic

 

 <Attributes>

 

     host_year            INTEGER NOT NULL

     host_nation          CHARACTER VARYING(40) NOT NULL

     host_city            CHARACTER VARYING(20) NOT NULL

     opening_date         DATE NOT NULL

     closing_date         DATE NOT NULL

     mascot               CHARACTER VARYING(20)

     slogan               CHARACTER VARYING(40)

     introduction         CHARACTER VARYING(1500)

 

 <Constraints>

 

     PRIMARY KEY pk_olympic_host_year ON olympic (host_year)

Preparing

Make sure that the demodb database and the broker are running before you execute the sample program. You can start the demodb database and the broker by executing the cubrid utility. The code below shows how to run a database server and broker by executing the cubrid utility.

[tester@testdb ~]$ cubrid server start demodb

@ cubrid master start

++ cubrid master start: success

@ cubrid server start: demodb

 

This may take a long time depending on the amount of recovery works to do.

 

CUBRID 2008 R4.3

 

++ cubrid server start: success

[tester@testdb ~]$ cubrid broker start

@ cubrid broker start

++ cubrid broker start: success

Building

With the program source and the Makefile prepared, executing make will create an executable file named test. If you use a static library, there is no need to deploy additional files and the execution will be faster. However, it increases the program size and memory usage. If you use a dynamic library, there will be some performance overhead but the program size and memory usage can be optimized.

The code below a command line that makes a test program build by using a dynamic library instead of using make on Linux.

cc -o test test.c -I$CUBRID/include -L$CUBRID/lib -lnsl -lcascci

Sample Code

#include <stdio.h>

#include <cas_cci.h>

char *cci_client_name = "test";

int main (int argc, char *argv[])

{

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

    T_CCI_ERROR error;

    T_CCI_COL_INFO *res_col_info;

    T_CCI_CUBRID_STMT stmt_type;

    char *buffer, db_ver[16];

    printf("Program started! ");

    if ((con=cci_connect("localhost", 30000, "demodb", "PUBLIC", ""))<0) {

        printf( "%s(%d): cci_connect fail ", __FILE__, __LINE__);

        return -1;

    }

   

    if ((res=cci_get_db_version(con, db_ver, sizeof(db_ver)))<0) {

        printf( "%s(%d): cci_get_db_version fail ", __FILE__, __LINE__);

        goto handle_error;

    }

    printf("DB Version is %s ",db_ver);

    if ((req=cci_prepare(con, "select * from event", 0,&error))<0) {

        printf( "%s(%d): cci_prepare fail(%d) ", __FILE__, __LINE__,error.err_code);

        goto handle_error;

    }

    printf("Prepare ok!(%d) ",req);

    res_col_info = cci_get_result_info(req, &stmt_type, &col_count);

    if (!res_col_info) {

        printf( "%s(%d): cci_get_result_info fail ", __FILE__, __LINE__);

        goto handle_error;

    }

   

    printf("Result column information "

           "======================================== ");

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

        printf("name:%s  type:%d(precision:%d scale:%d) ",

            CCI_GET_RESULT_INFO_NAME(res_col_info, i),

            CCI_GET_RESULT_INFO_TYPE(res_col_info, i),

            CCI_GET_RESULT_INFO_PRECISION(res_col_info, i),

            CCI_GET_RESULT_INFO_SCALE(res_col_info, i));

    }

    printf("======================================== ");

    if ((res=cci_execute(req, 0, 0, &error))<0) {

        printf( "%s(%d): cci_execute fail(%d) ", __FILE__, __LINE__,error.err_code);

        goto handle_error;

    }

    if ((res=cci_fetch_size(req, 100))<0) {

        printf( "%s(%d): cci_fetch_size fail ", __FILE__, __LINE__);

        goto handle_error;

    }

   

    while (1) {

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

        if (res == CCI_ER_NO_MORE_DATA) {

            printf("Query END! ");

            break;

        }

        if (res<0) {

            printf( "%s(%d): cci_cursor fail(%d) ", __FILE__, __LINE__,error.err_code);

            goto handle_error;

        }

       

        if ((res=cci_fetch(req, &error))<0) {

            printf( "%s(%d): cci_fetch fail(%d) ", __FILE__, __LINE__,error.err_code);

            goto handle_error;

        }

       

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

            if ((res=cci_get_data(req, i, CCI_A_TYPE_STR, &buffer, &ind))<0) {

                printf( "%s(%d): cci_get_data fail ", __FILE__, __LINE__);

                goto handle_error;

            }

            printf("%s |", buffer);

        }

        printf(" ");

    }

    if ((res=cci_close_req_handle(req))<0) {

           printf( "%s(%d): cci_close_req_handle fail", __FILE__, __LINE__);

           goto handle_error;

    }

    if ((res=cci_disconnect(con, &error))<0) {

          printf( "%s(%d): cci_disconnect fail(%d)", __FILE__, __LINE__,error.err_code);

          goto handle_error;

    }

    printf("Program ended! ");

    return 0;

   

handle_error:

    if (req > 0)

        cci_close_req_handle(req);

    if (con > 0)

        cci_disconnect(con, &error);

    printf("Program failed! ");

    return -1;

}