:meta-keywords: CCI driver, CCI api, cubrid cci :meta-description: CUBRID CCI API Reference for your C-based back-end application. CCI API ë ˆí¼ëŸ°ìФ ================ .. contents:: cci_bind_param -------------- .. c:function:: int cci_bind_param (int req_handle, int index, T_CCI_A_TYPE a_type, void *value, T_CCI_U_TYPE u_type, char flag) prepared statementì—서 *bind* ë³€ìˆ˜ì— ë°ì´í„°ë¥¼ ë°”ì¸ë”©í•˜ê¸° 위하여 사용ë˜ëŠ” 함수ì´ë‹¤. ì´ë•Œ, 주어진 *a_type* ì˜ *value* ì˜ ê°’ì„ ì‹¤ì œ ë°”ì¸ë”©ë˜ì–´ì•¼ 하는 타입으로 변환하여 ì €ìž¥í•œë‹¤. ì´í›„, :c:func:`cci_execute`\ ê°€ 호출ë 때 ì €ìž¥ëœ ë°ì´í„°ê°€ 서버로 ì „ì†¡ëœë‹¤. ê°™ì€ *index* ì— ëŒ€í•´ì„œ 여러 번 :c:func:`cci_bind_param`\ ì„ í˜¸ì¶œí• ê²½ìš° 마지막으로 ì„¤ì •í•œ ê°’ì´ ìœ íš¨í•˜ë‹¤. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤. :param index: (IN) ë°”ì¸ë”©ë 위치ì´ë©°, 1부터 시작. :param a_type: (IN) *value* ì˜ íƒ€ìž…. :param value: (IN) ë°”ì¸ë”©ë ë°ì´í„° ê°’. :param u_type: (IN) ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ë ë°ì´í„° 타입. :param flag: (IN) bind_flag(:c:type:`CCI_BIND_PTR`). :return: ì—러 코드(0: 성공) * **CCI_ER_BIND_INDEX** * **CCI_ER_CON_HANDLE** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_REQ_HANDLE** * **CCI_ER_TYPE_CONVERSION** * **CCI_ER_USED_CONNECTION** ë°ì´í„°ë² ì´ìŠ¤ì— **NULL**\ ì„ ë°”ì¸ë”©í•˜ë ¤ë©´ 다ìŒì˜ ë‘ ê°€ì§€ 중 하나를 ì„¤ì •í•œë‹¤. * *value* ê°’ì„ **NULL** í¬ì¸í„°ë¡œ ì„¤ì • * *u_type*\ ì„ :c:macro:`CCI_U_TYPE_NULL`\로 ì„¤ì • 다ìŒì€ NULLì„ ë°”ì¸ë”©í•˜ëŠ” ì½”ë“œì˜ ì¼ë¶€ì´ë‹¤. .. code-block:: c res = cci_bind_param (req, 2 /* binding index */, CCI_A_TYPE_STR, NULL, CCI_U_TYPE_STRING, CCI_BIND_PTR); ë˜ëŠ” .. code-block:: c res = cci_bind_param (req, 2 /* binding index */, CCI_A_TYPE_STR, data, CCI_U_TYPE_NULL, CCI_BIND_PTR); ê°€ 사용ë 수 있다. *flag*\ì— :c:type:`CCI_BIND_PTR`\ ì´ ì„¤ì •ë˜ì–´ ìžˆì„ ê²½ìš° *value* ë³€ìˆ˜ì˜ í¬ì¸í„°ë§Œ ë³µì‚¬í•˜ê³ (shallow copy) ê°’ì€ ë³µì‚¬í•˜ì§€ 않는다. *flag*\ê°€ ì„¤ì •ë˜ì§€ 않는 경우 메모리를 í• ë‹¹í•˜ì—¬ *value* ë³€ìˆ˜ì˜ ê°’ì„ ë³µì‚¬(deep copy)한다. 만약 ê°™ì€ ë©”ëª¨ë¦¬ 버í¼ë¥¼ ì´ìš©í•˜ì—¬ 여러 ê°œì˜ ì¹¼ëŸ¼ì„ ë°”ì¸ë”©í• 경우ë¼ë©´, :c:type:`CCI_BIND_PTR` *flag*\를 ì„¤ì •í•˜ì§€ 않아야 한다. :c:type:`T_CCI_A_TYPE`\ ì€ CCI ì‘ìš© 프로그램 ë‚´ì—서 ë°ì´í„° ë°”ì¸ë”©ì— 사용ë˜ëŠ” C ì–¸ì–´ì˜ íƒ€ìž…ì„ ì˜ë¯¸í•˜ë©°, int, float ë“±ì˜ primitive 타입과 :c:type:`T_CCI_BIT`, :c:type:`T_CCI_DATE` ë“±ì˜ CCI ê°€ ì •ì˜í•œ user-defined 타입으로 구성ëœë‹¤. ê° íƒ€ìž…ì— ëŒ€í•œ ì‹ë³„ìžëŠ” ì•„ëž˜ì˜ í‘œì™€ ê°™ì´ ì •ì˜ë˜ì–´ 있다. +-----------------------------+-----------------------------+ | a_type | value 타입 | +=============================+=============================+ | **CCI_A_TYPE_STR** | char \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_INT** | int \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_FLOAT** | float \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_DOUBLE** | double \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BIT** | **T_CCI_BIT** \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_SET** | **T_CCI_SET** | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_DATE** | **T_CCI_DATE** \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BIGINT** | int64_t \* | | | (For Windows: __int64 \*) | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BLOB** | **T_CCI_BLOB** | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_CLOB** | **T_CCI_CLOB** | +-----------------------------+-----------------------------+ :c:type:`T_CCI_U_TYPE`\ ì€ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì¹¼ëŸ¼ 타입으로, value ì¸ìžë¥¼ 통해 ë°”ì¸ë”©ëœ ë°ì´í„°ë¥¼ ì´ íƒ€ìž…ìœ¼ë¡œ 변환한다. :c:func:`cci_bind_param` 함수는 C 언어가 ì´í•´í•˜ëŠ” A íƒ€ìž…ì˜ ë°ì´í„°ë¥¼ ë°ì´í„°ë² ì´ìŠ¤ê°€ ì´í•´í• 수 있는 U íƒ€ìž…ì˜ ë°ì´í„°ë¡œ 변환하기 위한 ì •ë³´ë¥¼ ì „ë‹¬í•˜ê¸° 위해서 ë‘ ê°€ì§€ íƒ€ìž…ì„ ì‚¬ìš©í•œë‹¤. U íƒ€ìž…ì´ í—ˆìš©í•˜ëŠ” A íƒ€ìž…ì€ ì—¬ëŸ¬ 가지ì´ë‹¤. 예를 들어 **CCI_U_TYPE_INT** 는 **CCI_A_TYPE_INT** ì™¸ì— **CCI_A_TYPE_STR** ë„ A 타입으로 ë°›ì„ ìˆ˜ 있다. 타입 ë³€í™˜ì€ :ref:`implicit-type-conversion`\ ì„ ë”°ë¥¸ë‹¤. :c:type:`T_CCI_A_TYPE` ë° :c:type:`T_CCI_U_TYPE` enumì€ ëª¨ë‘ **cas_cci.h** 파ì¼ì— ì •ì˜ë˜ì–´ 있다. ê° íƒ€ìž…ì— ëŒ€í•œ ì‹ë³„ìž ì •ì˜ëŠ” 아래 표를 ì°¸ê³ í•œë‹¤. +--------------------------+-----------------------+ | u_type | 대ì‘ë˜ëŠ” 기본 a_type | +==========================+=======================+ | **CCI_U_TYPE_CHAR** | **CCI_A_TYPE_STR** | +--------------------------+-----------------------+ | **CCI_U_TYPE_STRING** | **CCI_A_TYPE_STR** | +--------------------------+-----------------------+ | **CCI_U_TYPE_BIT** | **CCI_A_TYPE_BIT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_VARBIT** | **CCI_A_TYPE_BIT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_NUMERIC** | **CCI_A_TYPE_STR** | +--------------------------+-----------------------+ | **CCI_U_TYPE_INT** | **CCI_A_TYPE_INT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_SHORT** | **CCI_A_TYPE_INT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_FLOAT** | **CCI_A_TYPE_FLOAT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_DOUBLE** | **CCI_A_TYPE_DOUBLE** | +--------------------------+-----------------------+ | **CCI_U_TYPE_DATE** | **CCI_A_TYPE_DATE** | +--------------------------+-----------------------+ | **CCI_U_TYPE_TIME** | **CCI_A_TYPE_DATE** | +--------------------------+-----------------------+ | **CCI_U_TYPE_TIMESTAMP** | **CCI_A_TYPE_DATE** | +--------------------------+-----------------------+ | **CCI_U_TYPE_OBJECT** | **CCI_A_TYPE_STR** | +--------------------------+-----------------------+ | **CCI_U_TYPE_BIGINT** | **CCI_A_TYPE_BIGINT** | +--------------------------+-----------------------+ | **CCI_U_TYPE_DATETIME** | **CCI_A_TYPE_DATE** | +--------------------------+-----------------------+ | **CCI_U_TYPE_BLOB** | **CCI_A_TYPE_BLOB** | +--------------------------+-----------------------+ | **CCI_U_TYPE_CLOB** | **CCI_A_TYPE_CLOB** | +--------------------------+-----------------------+ | **CCI_U_TYPE_ENUM** | **CCI_A_TYPE_STR** | +--------------------------+-----------------------+ ë‚ ì§œë¥¼ í¬í•¨í•˜ëŠ” 문ìžì—´ì„ **DATE**, **DATETIME** ë˜ëŠ” **TIMESTAMP** ì˜ ìž…ë ¥ ì¸ìžë¡œ í• ë•Œ, ë‚ ì§œ 문ìžì—´ì˜ 형ì‹ì€ "YYYY/MM/DD" í˜•ì‹ ë˜ëŠ” "YYYY-MM-DD" 형ì‹ë§Œ 허용한다. 즉, "2012/01/31" ë˜ëŠ” "2012-01-31"ê³¼ ê°™ì€ í˜•ì‹ì€ 허용하지만 "01/31/2012"와 ê°™ì€ í˜•ì‹ì€ 허용하지 않는다. ë‚ ì§œë¥¼ í¬í•¨í•˜ëŠ” 문ìžì—´ì„ ë‚ ì§œ íƒ€ìž…ì˜ ìž…ë ¥ ì¸ìžë¡œ 하는 예는 다ìŒê³¼ 같다. .. code-block:: c // "CREATE TABLE tbl(aa date, bb datetime)"; char *values[][2] = { {"1994/11/30", "1994/11/30 20:08:08"}, {"2008-10-31", "2008-10-31 20:08:08"} }; req = cci_prepare(conn, "insert into tbl (aa, bb) values (?, ?)", CCI_PREPARE_INCLUDE_OID, &error); for(i=0; i< 2; i++) { res = cci_bind_param(req, 1, CCI_A_TYPE_STR, values[i][0], CCI_U_TYPE_DATE, (char)0); res = cci_bind_param(req, 2, CCI_A_TYPE_STR, values[i][1], CCI_U_TYPE_DATETIME, (char)0); cci_execute(req, CCI_EXEC_QUERY_ALL, 0, err_buf); } cci_bind_param_array -------------------- .. c:function:: int cci_bind_param_array(int req_handle, int index, T_CCI_A_TYPE a_type, void *value, int *null_ind, T_CCI_U_TYPE u_type) prepareëœ *req_handle* ì— ëŒ€í•´ì„œ 파ë¼ë¯¸í„° ë°°ì—´ì„ ë°”ì¸ë”©í•œë‹¤. ì´í›„, :c:func:`cci_execute_array`\ ê°€ 호출ë 때 ì €ìž¥ëœ *value* í¬ì¸í„°ì— ì˜í•´ ë°ì´í„°ê°€ 서버로 ì „ì†¡ëœë‹¤. ê°™ì€ *index* ì— ëŒ€í•´ì„œ 여러 번 :c:func:`cci_bind_param_array`\ ê°€ 호출ë 경우 마지막 ì„¤ì •ëœ ê°’ì´ ìœ íš¨í•˜ë‹¤. ë°ì´í„°ì— **NULL**\ ì„ ë°”ì¸ë”©í• 경우 *null_ind*\ ì— 0ì´ ì•„ë‹Œ ê°’ì„ ì„¤ì •í•œë‹¤. *value* ê°’ì´ **NULL** í¬ì¸í„°ì¸ 경우, ë˜ëŠ” *u_type*\ ì´ **CCI_U_TYPE_NULL**\ ì¸ ê²½ìš° ëª¨ë“ ë°ì´í„°ê°€ **NULL**\ 로 ë°”ì¸ë”©ë˜ë©° *value*\ ì— ì˜í•´ 사용ë˜ëŠ” ë°ì´í„° 버í¼ëŠ” 재사용ë 수 없다. *a_type*\ ì— ëŒ€í•œ *value*\ ì˜ ë°ì´í„° íƒ€ìž…ì€ :c:func:`cci_bind_param`\ ì˜ ì„¤ëª…ì„ ì°¸ì¡°í•œë‹¤. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param index: (IN) ë°”ì¸ë”©ë 위치 :param a_type: (IN) *value* ì˜ íƒ€ìž… :param value: (IN) ë°”ì¸ë”©ë ë°ì´í„° ê°’ :param null_ind: (IN) **NULL** ì‹ë³„ìž ë°°ì—´(0 : not **NULL**, 1 : **NULL**) :param u_type: (IN) ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ë ë°ì´í„° 타입 :return: ì—러 코드(0: 성공) * **CCI_ER_BIND_INDEX** * **CCI_ER_BIND_ARRAY_SIZE** * **CCI_ER_CON_HANDLE** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_REQ_HANDLE** * **CCI_ER_TYPE_CONVERSION** * **CCI_ER_USED_CONNECTION** cci_bind_param_array_size ------------------------- .. c:function:: int cci_bind_param_array_size(int req_handle, int array_size) :c:func:`cci_bind_param_array`\ ì—서 사용ë arrayì˜ í¬ê¸°ë¥¼ ê²°ì •í•œë‹¤. :c:func:`cci_bind_param_array`\ ê°€ 사용ë˜ê¸° ì „ì— ë°˜ë“œì‹œ :c:func:`cci_bind_param_array_size`\ ê°€ ë¨¼ì € 호출 ë˜ì–´ì•¼ 한다. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param array_size: (IN) ë°”ì¸ë”©í• ë°°ì—´ í¬ê¸° :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_REQ_HANDLE** * **CCI_ER_USED_CONNECTION** cci_bind_param_ex ----------------- .. c:function:: int cci_bind_param_ex (int req_handle, int index, T_CCI_A_TYPE a_type, void *value, int length, T_CCI_U_TYPE u_type, char flag) :c:func:`cci_bind_param`\ê³¼ ë™ì¼í•œ ë™ìž‘ì„ ìˆ˜í–‰í•œë‹¤. 다만 문ìžì—´ íƒ€ìž…ì¸ ê²½ìš° 문ìžì—´ì˜ ë°”ì´íЏ 길ì´ë¥¼ ì§€ì •í•˜ëŠ” *length* ì¸ìžê°€ 추가로 존재한다. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param index: (IN) ë°”ì¸ë”©ë 위치ì´ë©°, 1부터 시작 :param a_type: (IN) *value* ì˜ íƒ€ìž… :param value: (IN) ë°”ì¸ë”©í• ë°ì´í„° ê°’ :param length: (IN) ë°”ì¸ë”©í• 문ìžì—´ì˜ ë°”ì´íЏ ê¸¸ì´ :param u_type: (IN) ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ë ë°ì´í„° 타입 :param flag: (IN) bind_flag(:c:type:`CCI_BIND_PTR`) :return: ì—러 코드(0: 성공) *length* ì¸ìžëŠ” 아래와 ê°™ì´ '\\0'ì„ í¬í•¨í•˜ëŠ” 문ìžì—´ì„ ë°”ì¸ë”©í•˜ê¸° 위해 ì‚¬ìš©í• ìˆ˜ 있다. .. code-block:: c cci_bind_param_ex(req, 1, CCI_A_TYPE_STR, "aaa\0bbb", 7, CCI_U_TYPE_STRING, 0); cci_blob_free ------------- .. c:function:: int cci_blob_free(T_CCI_BLOB blob) **BLOB** êµ¬ì¡°ì²´ì— ëŒ€í•œ 메모리를 í•´ì œí•œë‹¤. :return: ì—러 코드(0: 성공) * **CCI_ER_INVALID_LOB_HANDLE** cci_blob_new ------------ .. c:function:: int cci_blob_new(int conn_handle, T_CCI_BLOB* blob, T_CCI_ERROR* error_buf) **LOB** ë°ì´í„°ê°€ ì €ìž¥ë 빈 파ì¼ì„ 하나 ìƒì„±í•˜ê³ , 해당 파ì¼ì„ 참조하는 Locator를 *blob* êµ¬ì¡°ì²´ì— ë°˜í™˜í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param blob: (OUT) **LOB** Locator :param error_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_USED_CONNECTION** cci_blob_read ------------- .. c:function:: int cci_blob_read(int conn_handle, T_CCI_BLOB blob, long long start_pos, int length, char *buf, T_CCI_ERROR* error_buf) *blob* ì— ëª…ì‹œí•œ **LOB** ë°ì´í„° 파ì¼ì˜ *start_pos* 부터 *length* ë§Œí¼ ë°ì´í„°ë¥¼ ì½ì–´ *buf* ì— ì €ìž¥í•œ 후 ì´ë¥¼ 반환한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param blob: (IN) **LOB** Locator :param start_pos: (IN) **LOB** ë°ì´í„° 파ì¼ì˜ 위치 ì¸ë±ìФ :param length: (IN) 파ì¼ë¡œë¶€í„° ê°€ì ¸ì˜¬ **LOB** ë°ì´í„° ê¸¸ì´ :param buf: (IN) ë°ì´í„° ì½ê¸° ë²„í¼ :param error_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_INVALID_LOB_READ_POS** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_USED_CONNECTION** cci_blob_size ------------- .. c:function:: long long cci_blob_size(T_CCI_BLOB blob) *blob* ì— ëª…ì‹œí•œ ë°ì´í„° 파ì¼ì˜ í¬ê¸°ë¥¼ 반환한다. :param blob: (IN) **LOB** Locator :return: **BLOB** ë°ì´í„° 파ì¼ì˜ í¬ê¸°(>=0 : 성공), ì—러 코드(<0 : ì—러) * **CCI_ER_INVALID_LOB_HANDLE** cci_blob_write -------------- .. c:function:: int cci_blob_write(int conn_handle, T_CCI_BLOB blob, long long start_pos, int length, const char *buf, T_CCI_ERROR* error_buf) *buf* 로부터 *length* ë§Œí¼ ë°ì´í„°ë¥¼ ì½ì–´ *blob* ì— ëª…ì‹œí•œ **LOB** ë°ì´í„° 파ì¼ì˜ *start_pos* 부터 ì €ìž¥í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param blob: (IN) **LOB** Locator :param start_pos: (IN) **LOB** ë°ì´í„° 파ì¼ì˜ 위치 ì¸ë±ìФ :param length: (IN) 버í¼ë¡œë¶€í„° ê°€ì ¸ì˜¬ ë°ì´í„° ê¸¸ì´ :param buf: (OUT) ë°ì´í„° 쓰기 ë²„í¼ :param error_buf: (OUT) ì—러 ë²„í¼ :return: write한 í¬ê¸°(>=0 : 성공), ì—러 코드(<0 : ì—러) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_USED_CONNECTION** cci_cancel ---------- .. c:function:: int cci_cancel(int conn_handle) 다른 ìŠ¤ë ˆë“œì—서 실행 ì¤‘ì¸ ì§ˆì˜ë¥¼ 취소시킨다. Javaì˜ Statement.cancel() 메서드와 ê°™ì€ ê¸°ëŠ¥ì„ ìˆ˜í–‰í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :return: ì—러 코드 * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** 다ìŒì€ main 함수ì—서 ìŠ¤ë ˆë“œì˜ ì§ˆì˜ ì‹¤í–‰ì„ ì·¨ì†Œí•˜ëŠ” 예ì´ë‹¤. .. code-block:: c /* gcc -o pthr pthr.c -m64 -I${CUBRID}/include -lnsl ${CUBRID}/lib/libcascci.so -lpthread */ #include <stdio.h> #include <cas_cci.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <time.h> #define QUERY "select * from db_class A, db_class B, db_class C, db_class D, db_class E" static void *thread_main (void *arg); static void *execute_statement (int con, char *sql_stmt); int main (int argc, char *argv[]) { int thr_id = 0, conn_handle = 0, res = 0; void *jret; pthread_t th; char url[1024]; T_CCI_ERROR error; snprintf (url, 1024, "cci:CUBRID:localhost:33000:demodb:PUBLIC::"); conn_handle = cci_connect_with_url_ex (url, NULL, NULL, &error); if (conn_handle < 0) { printf ("ERROR: %s\n", error.err_msg); return -1; } res = pthread_create (&th, NULL, &thread_main, (void *) &conn_handle); if (res < 0) { printf ("thread fork failed.\n"); return -1; } else { printf ("thread started\n"); } sleep (5); // If thread_main is still running, below cancels the query of thread_main. res = cci_cancel (conn_handle); if (res < 0) { printf ("cci_cancel failed\n"); return -1; } else { printf ("The query was canceled by cci_cancel.\n"); } res = pthread_join (th, &jret); if (res < 0) { printf ("thread join failed.\n"); return -1; } printf ("thread_main was cancelled with\n\t%s\n", (char *) jret); free (jret); res = cci_disconnect (conn_handle, &error); if (res < 0) { printf ("ERROR: %s\n", error.err_msg); return res; } return 0; } void * thread_main (void *arg) { int con = *((int *) arg); int ret_val; void *ret_ptr; T_CCI_ERROR error; cci_set_autocommit (con, CCI_AUTOCOMMIT_TRUE); ret_ptr = execute_statement (con, QUERY); return ret_ptr; } static void * execute_statement (int con, char *sql_stmt) { int col_count = 1, ind, i, req; T_CCI_ERROR error; char *buffer; char *error_msg; int res = 0; error_msg = (char *) malloc (128); if ((req = cci_prepare (con, sql_stmt, 0, &error)) < 0) { snprintf (error_msg, 128, "cci_prepare ERROR: %s\n", error.err_msg); goto conn_err; } if ((res = cci_execute (req, 0, 0, &error)) < 0) { snprintf (error_msg, 128, "cci_execute ERROR: %s\n", error.err_msg); goto execute_error; } if (res >= 0) { while (1) { res = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &error); if (res == CCI_ER_NO_MORE_DATA) { break; } if (res < 0) { snprintf (error_msg, 128, "cci_cursor ERROR: %s\n", error.err_msg); return error_msg; } if ((res = cci_fetch (req, &error)) < 0) { snprintf (error_msg, 128, "cci_fetch ERROR: %s\n", error.err_msg); return error_msg; } for (i = 1; i <= col_count; i++) { if ((res = cci_get_data (req, i, CCI_A_TYPE_STR, &buffer, &ind)) < 0) { snprintf (error_msg, 128, "cci_get_data ERROR\n"); return error_msg; } } } } if ((res = cci_close_query_result (req, &error)) < 0) { snprintf (error_msg, 128, "cci_close_query_result ERROR: %s\n", error.err_msg); return error_msg; } execute_error: if ((res = cci_close_req_handle (req)) < 0) { snprintf (error_msg, 128, "cci_close_req_handle ERROR\n"); } conn_err: return error_msg; } cci_clob_free ------------- .. c:function:: int cci_clob_free(T_CCI_CLOB clob) **CLOB** êµ¬ì¡°ì²´ì— ëŒ€í•œ 메모리를 í•´ì œí•œë‹¤. :param clob: (IN) **LOB** Locator :return: ì—러 코드(0: 성공) * **CCI_ER_INVALID_LOB_HANDLE** cci_clob_new ------------ .. c:function:: int cci_clob_new(int conn_handle, T_CCI_CLOB* clob, T_CCI_ERROR* error_buf) **LOB** ë°ì´í„°ê°€ ì €ìž¥ë 빈 파ì¼ì„ 하나 ìƒì„±í•˜ê³ , 해당 파ì¼ì„ 참조하는 Locator를 *clob* êµ¬ì¡°ì²´ì— ë°˜í™˜í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param clob: (OUT) **LOB** Locator :param error_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(<0 : ì—러) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_USED_CONNECTION** cci_clob_read ------------- .. c:function:: int cci_clob_read(int conn_handle, T_CCI_CLOB clob, long start_pos, int length, char *buf, T_CCI_ERROR* error_buf) *clob* ì— ëª…ì‹œí•œ **LOB** ë°ì´í„° 파ì¼ì˜ *start_pos* 부터 *length* ë§Œí¼ ë°ì´í„°ë¥¼ ì½ì–´ *buf* ì— ì €ìž¥í•œ 후 ì´ë¥¼ 반환한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param clob: (IN) **LOB** Locator :param start_pos: (IN) **LOB** ë°ì´í„° 파ì¼ì˜ 위치 ì¸ë±ìФ :param length: (IN) 파ì¼ë¡œë¶€í„° ê°€ì ¸ì˜¬ **LOB** ë°ì´í„° ê¸¸ì´ :param buf: (IN) ë°ì´í„° ì½ê¸° ë²„í¼ :param error_buf: (OUT) ì—러 ë²„í¼ :return: read한 í¬ê¸°(>=0 : 성공), ì—러 코드(<0 : ì—러) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_INVALID_LOB_READ_POS** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_USED_CONNECTION** cci_clob_size ------------- .. c:function:: long long cci_clob_size(T_CCI_CLOB* clob) *clob* ì— ëª…ì‹œí•œ ë°ì´í„° 파ì¼ì˜ í¬ê¸°ë¥¼ 반환한다. :param clob: (IN) **LOB** Locator :return: **CLOB** ë°ì´í„° 파ì¼ì˜ í¬ê¸°(>=0 : 성공), ì—러 코드(<0 : ì—러) * **CCI_ER_INVALID_LOB_HANDLE** cci_clob_write -------------- .. c:function:: int cci_clob_write(int conn_handle, T_CCI_CLOB clob, long start_pos, int length, const char *buf, T_CCI_ERROR* error_buf) *buf* 로부터 *length* ë§Œí¼ ë°ì´í„°ë¥¼ ì½ì–´ *clob* ì— ëª…ì‹œí•œ **LOB** ë°ì´í„° 파ì¼ì˜ *start_pos* 부터 ì €ìž¥í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param clob: (IN) **LOB** Locator :param start_pos: (IN) **LOB** ë°ì´í„° 파ì¼ì˜ 위치 ì¸ë±ìФ :param length: (IN) 버í¼ë¡œë¶€í„° ê°€ì ¸ì˜¬ ë°ì´í„° ê¸¸ì´ :param buf: (OUT) ë°ì´í„° 쓰기 ë²„í¼ :param error_buf: (OUT) ì—러 ë²„í¼ :return: write한 í¬ê¸°(>=0 : 성공), ì—러 코드(<0 : ì—러) * **CCI_ER_COMMUNICATION** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_INVALID_LOB_HANDLE** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_USED_CONNECTION** cci_close_query_result ---------------------- .. c:function:: int cci_close_query_result(int req_handle, T_CCI_ERROR *err_buf) :c:func:`cci_execute`, :c:func:`cci_execute_array` ë˜ëŠ” :c:func:`cci_execute_batch` 함수가 반환한 resultsetì„ ì¢…ë£Œ(close)한다. ìš”ì² í•¸ë“¤(req_handle)ì˜ ì¢…ë£Œ ì—†ì´ :c:func:`cci_prepare`\ 를 반복 수행하는 경우 :c:func:`cci_close_req_handle` 함수를 호출하기 ì „ì— ì´ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí• ê²ƒì„ ê¶Œìž¥í•œë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 (0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_DBMS** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_REQ_HANDLE** * **CCI_ER_RESULT_SET_CLOSED** * **CCI_ER_USED_CONNECTION** cci_close_req_handle -------------------- .. c:function:: int cci_close_req_handle(int req_handle) :c:func:`cci_prepare`\ 로 íšë“한 ìš”ì² í•¸ë“¤ì„ ì¢…ë£Œ(close)한다. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :return: ì—러 코드(0 : 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_REQ_HANDLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_DBMS** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_USED_CONNECTION** cci_col_get ----------- .. c:function:: int cci_col_get (int conn_handle, char *oid_str, char *col_attr, int *col_size, int *col_type, T_CCI_ERROR *err_buf) collection typeì˜ ì†ì„± ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. í´ëž˜ìФ ì´ë¦„ì´ Cì´ê³ set_attrì˜ domainì´ set(multiset, sequence)ì¸ ê²½ìš° 다ìŒì˜ 질ì˜ì™€ 같다. .. code-block:: sql SELECT a FROM C, TABLE(set_attr) AS t(a) WHERE C = oid; 즉, 멤버 개수가 ë ˆì½”ë“œ 개수가 ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param col_size: (OUT) collection í¬ê¸° (-1 : null) :param col_type: (OUT) collection 타입 (set, multiset, sequence : u_type) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ìš”ì² í•¸ë“¤ * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_col_seq_drop ---------------- .. c:function:: int cci_col_seq_drop (int conn_handle, char *oid_str, char *col_attr, int index, T_CCI_ERROR *err_buf) sequence ì†ì„± ê°’ì— index(base:1) ë²ˆì§¸ì˜ ë©¤ë²„ë¥¼ drop시킨다. 다ìŒì€ seq ì†ì„± ê°’ì—서 첫 번째 ê°’ì„ ì‚ì œí•˜ëŠ” 예ì´ë‹¤. :: cci_col_seq_drop(conn_handle, oid_str, seq_attr, 1, err_buf); :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param index: (IN) ì¸ë±ìФ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_col_seq_insert ------------------ .. c:function:: int cci_col_seq_insert (int conn_handle, char *oid_str, char *col_attr, int index, char *value, T_CCI_ERROR *err_buf) sequence ì†ì„± ê°’ì—서 index(base:1) ë²ˆì§¸ì— ë©¤ë²„ë¥¼ 추가시킨다. 다ìŒì€ seq ì†ì„± ê°’ì—서 1ë²ˆì— ê°’ 'a'를 추가하는 예ì´ë‹¤. :: cci_col_seq_insert(conn_handle, oid_str, seq_attr, 1, "a", err_buf); :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param index: (IN) ì¸ë±ìФ :param value: (IN) 순차ì 엘리먼트(스트ë§) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_col_seq_put --------------- .. c:function:: int cci_col_seq_put (int conn_handle, char *oid_str, char *col_attr, int index, char *value, T_CCI_ERROR *err_buf) sequence ì†ì„± ê°’ì— index(base:1) ë²ˆì§¸ì˜ ë©¤ë²„ë¥¼ 새로운 값으로 대체한다.. 다ìŒì€ seq ì†ì„± ê°’ì—서 1번 ê°’ì„ 'a'로 대체하는 예ì´ë‹¤. :: cci_col_seq_put(conn_handle, oid_str, seq_attr, 1, "a", err_buf); :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param index: (IN) ì¸ë±ìФ :param value: (IN) 순차ì ê°’ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_col_set_add --------------- .. c:function:: int cci_col_set_add (int conn_handle, char *oid_str, char *col_attr, char *value, T_CCI_ERRROR *err_buf) set ì†ì„± ê°’ì— member 하나를 추가한다. 다ìŒì€ set ì†ì„± ê°’ì— 'a'를 추가하는 예ì´ë‹¤. :: cci_col_set_add(conn_handle, oid_str, set_attr, "a", err_buf); :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param value: (IN) set 엘리먼트 :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_col_set_drop ---------------- .. c:function:: int cci_col_set_drop (int conn_handle, char *oid_str, char *col_attr, char *value, T_CCI_ERROR *err_buf) set ì†ì„± ê°’ì—서 멤버 하나를 drop시킨다. 다ìŒì€ set ì†ì„± ê°’ì—서 'a'를 ì‚ì œí•˜ëŠ” 예ì´ë‹¤. :: cci_col_set_drop(conn_handle, oid_str, set_attr, "a", err_buf); :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param value: (IN) set 엘리먼트(스트ë§) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_COMMUNICATION** cci_col_size ------------ .. c:function:: int cci_col_size (int conn_handle, char *oid_str, char *col_attr, int *col_size, T_CCI_ERROR *err_buf) set(seq) ì†ì„±ì˜ 개수를 ê°€ì ¸ì˜¨ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param col_attr: (IN) collection ì†ì„± ì´ë¦„ :param col_size: (OUT) collection í¬ê¸° (-1 : NULL) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0 : 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_connect ----------- .. c:function:: int cci_connect(char *ip, int port, char *db_name, char *db_user, char *db_password) DB ì„œë²„ì— ëŒ€í•œ ì—°ê²° í•¸ë“¤ì„ í• ë‹¹ë°›ê³ í•´ë‹¹ 서버와 ì—°ê²°ì„ ì‹œë„한다. 서버 ì—°ê²°ì— ì„±ê³µí•˜ë©´ ì—°ê²° 핸들 ID를 ë°˜í™˜í•˜ê³ , 실패하면 ì—러 코드를 반환한다. :param ip: (IN) 서버 IP ë¬¸ìž ìŠ¤íŠ¸ë§ (호스트 ì´ë¦„) :param port: (IN) 브로커 í¬íЏ( **$CUBRID/conf/cubrid_broker.conf** 파ì¼ì— ì„¤ì •ëœ í¬íŠ¸ë¥¼ 사용) :param db_name: (IN) DB ì´ë¦„ :param db_user: (IN) DB ì‚¬ìš©ìž ì´ë¦„ :param db_passwd: (IN) DB ì‚¬ìš©ìž ì•”í˜¸ :return: ì—°ê²° 핸들 ID(성공), ì—러 코드(실패) * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_HOSTNAME** * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** cci_connect_ex -------------- .. c:function:: int cci_connect_ex(char *ip, int port, char *db_name, char *db_user, char *db_password, T_CCI_ERROR * err_buf) **CCI_ER_DBMS** ì—러를 반환하면 세부 ì—러 ë‚´ìš©ì„ DB ì—러 버í¼(*err_buf*)를 통해 확ì¸í• 수 있다는 ì ë§Œ :c:func:`cci_connect`\ 와 ë‹¤ë¥´ê³ ë‚˜ë¨¸ì§€ëŠ” ë™ì¼í•˜ë‹¤. :param ip: (IN) 서버 IP ë¬¸ìž ìŠ¤íŠ¸ë§ (호스트 ì´ë¦„) :param port: (IN) 브로커 í¬íЏ( **$CUBRID/conf/cubrid_broker.conf** 파ì¼ì— ì„¤ì •ëœ í¬íŠ¸ë¥¼ 사용) :param db_name: (IN) DB ì´ë¦„ :param db_user: (IN) DB ì‚¬ìš©ìž ì´ë¦„ :param db_passwd: (IN) DB ì‚¬ìš©ìž ì•”í˜¸ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—°ê²° 핸들 ID(성공), ì—러 코드(실패) * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_HOSTNAME** * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** .. _cci_connect_with_url: cci_connect_with_url -------------------- .. c:function:: int cci_connect_with_url (char *url, char *db_user, char *db_password) *url* ì¸ìžë¡œ ì „ë‹¬ëœ ì ‘ì† ì •ë³´ë¥¼ ì´ìš©í•˜ì—¬ ë°ì´í„°ë² ì´ìŠ¤ë¡œ ì—°ê²°ì„ ì‹œë„한다. CCIì—서 ë¸Œë¡œì»¤ì˜ HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ëŠ” 경우 ì´ í•¨ìˆ˜ì˜ *url* ì¸ìž ë‚´ì˜ altHosts ì†ì„±ì„ ì´ìš©í•˜ì—¬, ìž¥ì• ë°œìƒ ì‹œ failoverí• standby 브로커 ì„œë²„ì˜ ì—°ê²° ì •ë³´ë¥¼ 명시해야 한다. 서버 ì—°ê²°ì— ì„±ê³µí•˜ë©´ ì—°ê²° 핸들 ID를 ë°˜í™˜í•˜ê³ , 실패하면 ì—러 코드를 반환한다. ë¸Œë¡œì»¤ì˜ HA ê¸°ëŠ¥ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`duplexing-brokers`\를 ì°¸ê³ í•œë‹¤. :param url: (IN) 서버 ì—°ê²° ì •ë³´ ë¬¸ìž ìŠ¤íŠ¸ë§ :param db_user: (IN) DB ì‚¬ìš©ìž ì´ë¦„. NULLì´ë©´ *url* ì˜ <*db_user*>ê°€ 사용ëœë‹¤. ì´ ê°’ì´ ë¹ˆ 문ìžì—´("")ì´ê±°ë‚˜ *url* ë‚´ì˜ <*db_user*>ê°€ ì •ì˜ë˜ì§€ ì•Šì€ ê²½ìš° DB ì‚¬ìš©ìž ì´ë¦„ì€ **PUBLIC** ì´ ëœë‹¤. :param db_passwd: (IN) DB ì‚¬ìš©ìž ì•”í˜¸. NULLì´ë©´ *url* ì˜ <*db_password*>ê°€ 사용ëœë‹¤. *url* ë‚´ì˜ <*db_password*>ê°€ ì •ì˜ë˜ì§€ ì•Šì€ ê²½ìš° 암호는 빈 문ìžì—´("")ì´ ëœë‹¤. :return: ì—°ê²° 핸들 ID(성공), ì—러 코드(실패) * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_HOSTNAME** * **CCI_ER_INVALID_URL** * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_LOGIN_TIMEOUT** :: <url> ::= cci:CUBRID:<host>:<port>:<db_name>:<db_user>:<db_password>:[?<properties>] <properties> ::= <property> [&<property>] <property> ::= altHosts=<alternative_hosts> [ &rcTime=<time>] [ &loadBalance=true|false] |{login_timeout|loginTimeout}=<milli_sec> |{query_timeout|queryTimeout}=<milli_sec> |{disconnect_on_query_timeout|disconnectOnQueryTimeout}=true|false | logFile=<file_name> | logBaseDir=<dir_name> | logSlowQueries=true|false[&slowQueryThresholdMillis=<milli_sec>] | logTraceApi=true|false | logTraceNetwork=true|false | useSSL=true|false <alternative_hosts> ::= <host>:<port> [,<host>:<port>] <host> := HOSTNAME | IP_ADDR <time> := SECOND <milli_sec> := MILLI SECOND ì—°ê²° 대ìƒê³¼ ê´€ë ¨ëœ ì†ì„±ì€ **altHosts** ì´ë©°, 타임아웃과 ê´€ë ¨ëœ ì†ì„±ì€ **loginTimeout**, **queryTimeout**, **disconnectOnQueryTimeout** ì´ë‹¤. 디버깅용 로그 ì •ë³´ ì„¤ì •ê³¼ ê´€ë ¨ëœ ì†ì„±ì€ **logSlowQueries**, **logTraceApi**, **logTraceNetwork** ì´ë‹¤. *url* ì¸ìžì— ìž…ë ¥í•˜ëŠ” ëª¨ë“ ì†ì„±(property) ì´ë¦„ì€ ëŒ€ì†Œë¬¸ìž êµ¬ë³„ì„ í•˜ì§€ 않는다. * *host*: 마스터 ë°ì´í„°ë² ì´ìŠ¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ ë˜ëŠ” IP 주소 * *port*: í¬íЏ 번호 * *db_name*: ë°ì´í„°ë² ì´ìФ ì´ë¦„ * *db_user*: ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì´ë¦„ * *db_password*: ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ìž ì•”í˜¸. *url* ë‚´ì˜ ì•”í˜¸ì—는 ':'를 í¬í•¨í• 수 없다. * **altHosts** = *standby_broker1_host*, *standby_broker2_host*, ...: active ì„œë²„ì— ì—°ê²°í• ìˆ˜ 없는 경우, ê·¸ 다ìŒìœ¼ë¡œ ì—°ê²°ì„ ì‹œë„(failover)í• standby ì„œë²„ì˜ ë¸Œë¡œì»¤ ì •ë³´ë¥¼ 나타낸다. failoverí• ë¸Œë¡œì»¤ë¥¼ 여러 ê°œ ì§€ì •í• ìˆ˜ ìžˆê³ , **altHosts** ì— ë‚˜ì—´í•œ 순서대로 ì—°ê²°ì„ ì‹œë„한다. .. note:: ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts** ë¸Œë¡œì»¤ë“¤ì˜ **ACCESS_MODE**\ ì„¤ì •ì— **RW**\ 와 **RO**\ ê°€ 섞여 있다 하ë”ë¼ë„, ì‘ìš© í”„ë¡œê·¸ëž¨ì€ **ACCESS_MODE**\ 와 무관하게 ì ‘ì† ëŒ€ìƒ í˜¸ìŠ¤íŠ¸ë¥¼ ê²°ì •í•œë‹¤. ë”°ë¼ì„œ 사용ìžëŠ” ì ‘ì† ëŒ€ìƒ ë¸Œë¡œì»¤ì˜ **ACCESS_MODE**\ 를 ê°ì•ˆí•´ì„œ ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts**\ 를 ì •í•´ì•¼ 한다. * **rcTime**: 첫 번째로 ì ‘ì†í–ˆë˜ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí•œ ì´í›„ **altHosts** ì— ëª…ì‹œí•œ 브로커로 ì ‘ì†í•œë‹¤(브로커 failover). ì´í›„, **rcTime** ë§Œí¼ ì‹œê°„ì´ ê²½ê³¼í• ë•Œë§ˆë‹¤ ì›ëž˜ì˜ ë¸Œë¡œì»¤ì— ìž¬ì ‘ì†ì„ 시ë„한다(기본값 600ì´ˆ). * **loadBalance**: ì´ ê°’ì´ trueë©´ ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts**\ì— ì§€ì •í•œ í˜¸ìŠ¤íŠ¸ë“¤ì— ëžœë¤í•œ 순서로 연결한다(기본값: false) * **login_timeout** | **loginTimeout**: ë°ì´í„°ë² ì´ìŠ¤ì— ë¡œê·¸ì¸ ì‹œ 타임아웃 ê°’ (단위: msec). ì´ ì‹œê°„ì„ ì´ˆê³¼í•˜ë©´ **CCI_ER_LOGIN_TIMEOUT** (-38) ì—러를 반환한다. ê¸°ë³¸ê°’ì€ **30,000**\ (30ì´ˆ)ì´ë‹¤. ì´ ê°’ì´ 0ì¸ ê²½ìš° 무한 대기를 ì˜ë¯¸í•œë‹¤. ì´ ê°’ì€ ìµœì´ˆ ì ‘ì† ì´í›„ ë‚´ë¶€ì ì¸ ìž¬ì ‘ì†ì´ ë°œìƒí•˜ëŠ” 경우ì—ë„ ì ìš©ëœë‹¤. * **query_timeout** | **queryTimeout**: :c:func:`cci_prepare`, :c:func:`cci_execute` ë“±ì˜ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí–ˆì„ ë•Œ ì´ ê°’ìœ¼ë¡œ ì„¤ì •í•œ ì‹œê°„ì´ ì§€ë‚˜ë©´ 서버로 보낸 ì§ˆì˜ ìš”ì²ì— 대한 취소 메시지를 ë³´ë‚´ê³ í˜¸ì¶œëœ í•¨ìˆ˜ëŠ” **CCI_ER_QUERY_TIMEOUT** (-39) ì—러를 반환한다. ê¸°ë³¸ê°’ì€ 0ì´ë©°, 0ì¸ ê²½ìš° 무한 대기를 ì˜ë¯¸í•œë‹¤. 질ì˜ë¥¼ 수행한 함수ì—서 타임아웃 ë°œìƒ ì‹œ í•¨ìˆ˜ì˜ ë°˜í™˜ ê°’ì€ **disconnect_on_query_timeout**\ ì˜ ì„¤ì •ì— ë”°ë¼ ë‹¬ë¼ì§ˆ 수 있다. ìžì„¸í•œ ë‚´ìš©ì€ ë‹¤ìŒì˜ **disconnect_on_query_timeout**\ ì„ ì°¸ê³ í•œë‹¤. .. note:: :c:func:`cci_execute`\ ì— CCI_EXEC_QUERY_ALL 플래그를 ì„¤ì •í•˜ê±°ë‚˜ :c:func:`cci_execute_batch` ë˜ëŠ” :c:func:`cci_execute_array`\ 를 사용하여 여러 ê°œì˜ ì§ˆì˜ë¥¼ 한 ë²ˆì— ì‹¤í–‰í•˜ëŠ” 경우, ì§ˆì˜ íƒ€ìž„ ì•„ì›ƒì€ ì§ˆì˜ í•˜ë‚˜ì— ëŒ€í•´ ì ìš©ë˜ëŠ” ê²ƒì´ ì•„ë‹ˆë¼ í•¨ìˆ˜ í•˜ë‚˜ì— ëŒ€í•´ ì ìš©ëœë‹¤. 즉, 함수 시작 ì´í›„ íƒ€ìž„ì•„ì›ƒì´ ë°œìƒí•˜ë©´ 함수 ìˆ˜í–‰ì´ ì¤‘ë‹¨ëœë‹¤. * **disconnect_on_query_timeout** | **disconnectOnQueryTimeout** : ì§ˆì˜ ìš”ì² íƒ€ìž„ì•„ì›ƒ 시 즉시 소켓 ì—°ê²° 종료 여부. :c:func:`cci_prepare`, :c:func:`cci_execute` ë“±ì˜ í•¨ìˆ˜ë¥¼ í˜¸ì¶œí–ˆì„ ë•Œ **query_timeout** 으로 ì„¤ì •í•œ ì‹œê°„ì´ ì§€ë‚˜ë©´ ì§ˆì˜ ì·¨ì†Œ ìš”ì² í›„ 즉시 소켓 ì—°ê²°ì„ ì¢…ë£Œí• ê²ƒì¸ì§€, 아니면 ì§ˆì˜ ì·¨ì†Œ ìš”ì²ì„ 받아들ì¸ë‹¤ëŠ” ì„œë²„ì˜ ì‘ë‹µì„ ê¸°ë‹¤ë¦´ 것ì¸ì§€ë¥¼ ì„¤ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **false** 로, ì„œë²„ì˜ ì‘ë‹µì„ ê¸°ë‹¤ë¦°ë‹¤. ì´ ê°’ì´ **true** ì´ë©´ :c:func:`cci_prepare`, :c:func:`cci_execute` ë“±ì˜ í•¨ìˆ˜ 호출 ë„중 ì§ˆì˜ íƒ€ìž„ì•„ì›ƒì´ ë°œìƒí• 때 ì„œë²„ì— ì§ˆì˜ ì·¨ì†Œ 메시지를 보낸 후, ì†Œì¼“ì„ ë‹«ê³ **CCI_ER_QUERY_TIMEOUT** (-39) ì—러를 반환한다. (브로커가 아닌 ë°ì´í„°ë² ì´ìФ 서버 쪽ì—서 ì—러가 ë°œìƒí•œ 경우 -1ì„ ë°˜í™˜í•œë‹¤. ìƒì„¸ ì—러를 확ì¸í•˜ê³ 싶으면 "ë°ì´í„°ë² ì´ìФ ì—러 버í¼"ì˜ ì—러 코드를 확ì¸í•œë‹¤. ë°ì´í„°ë² ì´ìФ ì—러 버í¼ì—서 ì—러 코드를 확ì¸í•˜ëŠ” ë°©ë²•ì€ :ref:`CCI ì—러 코드와 ì—러 메시지 <cci-error-codes>` 를 ì°¸ê³ í•œë‹¤.) ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ì§ˆì˜ ì·¨ì†Œ 메시지를 보낸 후 ì—러를 반환했ìŒì—ë„ ë¶ˆêµ¬í•˜ê³ , ë°ì´í„°ë² ì´ìФ 서버는 ê·¸ 메시지를 받지 ëª»í•˜ê³ í•´ë‹¹ 질ì˜ë¥¼ ìˆ˜í–‰í• ìˆ˜ 있ìŒì„ 주ì˜í•œë‹¤. **false** ì´ë©´ ì„œë²„ì— ì·¨ì†Œ 메시지를 보낸 후, ì„œë²„ì˜ ì§ˆì˜ ìš”ì²ì— 대한 ì‘ë‹µì´ ì˜¬ 때 까지 대기한다. * **logFile**: 디버깅용 로그 íŒŒì¼ ì´ë¦„(기본값: *cci_<handle_id>.log*). <*handle_id*>는 ì´ í•¨ìˆ˜ê°€ 반환하는 ì—°ê²° 핸들 IDì´ë‹¤. * **logBaseDir**: 디버깅용 로그 파ì¼ì´ ìƒì„±ë˜ëŠ” ë””ë ‰í„°ë¦¬. 경로를 í¬í•¨í•œ íŒŒì¼ ì´ë¦„ì˜ í˜•ì‹ì€ logBaseDir/logFileì´ ë˜ë©°, ìƒëŒ€ 경로로 ì§€ì •í• ìˆ˜ 있다. * **logSlowQueries**: 디버깅용 슬로우 쿼리 로깅 여부(기본값: **false**) * **slowQueryThresholdMillis**: 디버깅용 슬로우 쿼리 로깅 시 슬로우 쿼리 ì œí•œ 시간(기본값: **60000**). 단위는 밀리 ì´ˆì´ë‹¤. * **logTraceApi**: CCI 함수 시작과 ëì˜ ë¡œê¹… 여부 * **logTraceNetwork**: CCI 함수 ë„¤íŠ¸ì›Œí¬ ë°ì´í„° ì „ì†¡ ë‚´ìš©ì˜ ë¡œê¹… 여부 * **useSSL**: 패킷 암호화 여부 (기본값: false) * 패킷 암호화: useSSL = true * ì¼ë°˜ í‰ë¬¸: useSSL = false **ì˜ˆì œ** :: --connection URL string when a property(altHosts) is specified for HA URL=cci:CUBRID:192.168.0.1:33000:demodb:::?altHosts=192.168.0.2:33000,192.168.0.3:33000 --connection URL string when properties(altHosts,rcTime) is specified for HA URL=cci:CUBRID:192.168.0.1:33000:demodb:::?altHosts=192.168.0.2:33000,192.168.0.3:33000&rcTime=600 --connection URL string when properties(logSlowQueries,slowQueryThresholdMills, logTraceApi, logTraceNetwork) are specified for interface debugging URL = "cci:cubrid:192.168.0.1:33000:demodb:::?logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true" --connection URL string when useSSL property specified for encrypted connection URL = "cci:cubrid:192.168.0.1:33000:demodb:::?useSSL=true .. warning:: * useSSLì˜ flag는 **브로커 모드와 ì¼ì¹˜í•´ì•¼ 한다**. 아래와 ê°™ì´ ë¸Œë¡œì»¤ì˜ ì•”í˜¸í™” 모드와 다른 flag로 ì ‘ì†ì„ ìš”ì²í•˜ëŠ” 경우 **ì—°ê²°ë˜ì§€ 않는다**. * useSSL=true, 브로커 'ì¼ë°˜ 모드' ì¼ ë•Œ ì—°ê²° 불가 (**cubrid_broker.conf**: SSL = OFF) * useSSL=false, 브로커 '암호화 모드' ì¼ë•Œ ì—°ê²° 불가 (**cubrid_broker.conf**: SSL = ON) cci_connect_with_url_ex ----------------------- .. c:function:: int cci_connect_with_url_ex (char *url, char *db_user, char *db_password, T_CCI_ERROR * err_buf) **CCI_ER_DBMS** ì—러를 반환하면 세부 ì—러 ë‚´ìš©ì„ ë°ì´í„°ë² ì´ìФ ì—러 버í¼(*err_buf*)를 통해 확ì¸í• 수 있다는 ì ë§Œ :c:func:`cci_connect_with_url`\ ê³¼ ë‹¤ë¥´ê³ ë‚˜ë¨¸ì§€ëŠ” ë™ì¼í•˜ë‹¤. :param err_buf: (OUT) ì—러 ë²„í¼ cci_cursor ---------- .. c:function:: int cci_cursor(int req_handle, int offset, T_CCI_CURSOR_POS origin, T_CCI_ERROR *err_buf) :c:func:`cci_execute`\ 로 실행한 ì§ˆì˜ ê²°ê³¼ ë‚´ì˜ íŠ¹ì • ë ˆì½”ë“œì— ì ‘ê·¼í•˜ê¸° 위하여 ìš”ì² í•¸ë“¤ì— ì„¤ì •ëœ ì»¤ì„œë¥¼ ì´ë™ì‹œí‚¨ë‹¤. ì¸ìžë¡œ ì§€ì •ë˜ëŠ” *origin* 변수 ê°’ê³¼ *offset* ê°’ì„ í†µí•´ ì»¤ì„œì˜ ìœ„ì¹˜ê°€ ì´ë™ë˜ë©°, ì´ë™í• ì»¤ì„œì˜ ìœ„ì¹˜ê°€ ìœ íš¨í•˜ì§€ ì•Šì„ ê²½ìš° **CCI_ER_NO_MORE_DATA** 를 반환한다. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param offset: (IN) ì´ë™í• 오프셋 :param origin: (IN) 커서 위치를 나타내는 변수로서, íƒ€ìž…ì€ **T_CCI_CURSOR_POS** ì´ë‹¤. **T_CCI_CURSOR_POS** enumì€ **CCI_CURSOR_FIRST**, **CCI_CURSOR_CURRENT**, **CCI_CURSOR_LAST** ì˜ ì„¸ 가지 값으로 구성ëœë‹¤. :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 (0: 성공) * **CCI_ER_REQ_HANDLE** * **CCI_ER_NO_MORE_DATA** * **CCI_ER_COMMUNICATION** **ì˜ˆì œ** .. code-block:: c //the cursor moves to the first record cci_cursor(req, 1, CCI_CURSOR_FIRST, &err_buf); //the cursor moves to the next record cci_cursor(req, 1, CCI_CURSOR_CURRENT, &err_buf); //the cursor moves to the last record cci_cursor(req, 1, CCI_CURSOR_LAST, &err_buf); //the cursor moves to the previous record cci_cursor(req, -1, CCI_CURSOR_CURRENT, &err_buf); cci_cursor_update ----------------- .. c:function:: int cci_cursor_update(int req_handle, int cursor_pos, int index, T_CCI_A_TYPE a_type, void *value, T_CCI_ERROR *err_buf) *cursor_pos* ì˜ ì»¤ì„œ ìœ„ì¹˜ì— ëŒ€í•´ì„œ *index* ë²ˆì§¸ì˜ ì¹¼ëŸ¼ ê°’ì„ *value* 값으로 update한다. ë°ì´í„°ë² ì´ìŠ¤ì— **NULL** 로 updateí• ê²½ìš° *value* 를 **NULL** 로 한다. updateí• ìˆ˜ 있는 ì¡°ê±´ì€ :c:func:`cci_prepare`\ 를 참조한다. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param cursor_pos: (IN) 커서 위치 :param index: (IN) 칼럼 ì¸ë±ìФ :param a_type: (IN) *value* 타입 :param value: (IN) 새로운 ê°’ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 (0: 성공) * **CCI_ER_REQ_HANDLE** * **CCI_ER_TYPE_CONVERSION** * **CCI_ER_ATYPE** *a_type* ì— ëŒ€í•œ *value* ì˜ ë°ì´í„° íƒ€ìž…ì€ ë‹¤ìŒê³¼ 같다. +-----------------------------+-----------------------------+ | a_type | value 타입 | +=============================+=============================+ | **CCI_A_TYPE_STR** | char \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_INT** | int \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_FLOAT** | float \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_DOUBLE** | double \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BIT** | **T_CCI_BIT** \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_SET** | **T_CCI_SET** | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_DATE** | **T_CCI_DATE** \* | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BIGINT** | int64_t \* | | | (For Windows: __int64 \*) | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_BLOB** | **T_CCI_BLOB** | +-----------------------------+-----------------------------+ | **CCI_A_TYPE_CLOB** | **T_CCI_CLOB** | +-----------------------------+-----------------------------+ cci_datasource_borrow --------------------- .. c:function:: T_CCI_CONN cci_datasource_borrow (T_CCI_DATASOURCE *datasource, T_CCI_ERROR *err_buf) **T_CCI_DATASOURCE** 구조체ì—서 ì‚¬ìš©í• CCI ì—°ê²°ì„ íšë“한다. :param datasource: (IN) CCI ì—°ê²°ì„ íšë“í• **T_CCI_DATASOURCE** 구조체 í¬ì¸í„° :param err_buf: (OUT) ì—러 ë²„í¼ (ì—러가 ë°œìƒí•˜ë©´ ì—러 코드와 메시지를 반환) :return: CCI ì—°ê²° 핸들 ì‹ë³„ìž (성공), -1 (실패) .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release`, :c:func:`cci_datasource_change_property` cci_datasource_change_property ------------------------------ .. c:function:: int cci_datasource_change_property (T_CCI_DATASOURCE *datasource, const char *key, const char *val) DATASOURCEì˜ ì†ì„±(property) ì´ë¦„ì€ *key*ì— ëª…ì‹œí•˜ê³ , ê°’ì„ *val*\ì— ì„¤ì •í•œë‹¤. ì´ í•¨ìˆ˜ë¥¼ 사용하여 변경한 ì†ì„± ê°’ì€ *datasource* ë‚´ ëª¨ë“ ì—°ê²°ì— ì ìš©ëœë‹¤. :param datasource: (IN) CCI ì—°ê²°ì„ íšë“í• T_CCI_DATASOURCE 구조체 í¬ì¸í„° :param key: (IN) ì†ì„± ì´ë¦„ 문ìžì—´ì— 대한 í¬ì¸í„° :param val: (IN) ì†ì„± ê°’ 문ìžì—´ì— 대한 í¬ì¸í„° :return: ì—러 코드(0: 성공) * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_NO_PROPERTY** * **CCI_ER_PROPERTY_TYPE** 변경 가능한 ì†ì„±(property)ì˜ ì´ë¦„ ë° ê°’ì€ ë‹¤ìŒê³¼ 같다. ========================= =========== ============================== =========================================================================================================== ì†ì„± ì´ë¦„ 타입 ê°’ ì˜ë¯¸ ========================= =========== ============================== =========================================================================================================== default_autocommit bool true/false autocommit 여부. ê¸°ë³¸ê°’ì€ cubrid_broker.confì˜ CCI_DEFAULT_AUTOCOMMITì´ë©°, ì´ ê°’ì˜ ê¸°ë³¸ê°’ì€ ON(true)ìž„. default_lock_timeout msec ìˆ«ìž lock timeout default_isolation string :c:func:`cci_property_set`\ì˜ isolation level. ê¸°ë³¸ê°’ì€ cubrid.confì˜ isolation_levelì´ë©°, 표 ì°¸ê³ ì´ ê°’ì˜ ê¸°ë³¸ê°’ì€ "READ_COMMITTED"ìž„. login_timeout msec ìˆ«ìž login timeout. ê¸°ë³¸ê°’ì€ 0(무한대기)ìž„. prepare ë˜ëŠ” execute 함수 호출 시 ë‚´ë¶€ì 으로 ìž¬ì ‘ì†ì´ ë°œìƒí• 수 있으며, ì´ ë•Œì—ë„ ì‚¬ìš©ë¨. ========================= =========== ============================== =========================================================================================================== **ì˜ˆì œ** .. code-block:: c ... ps = cci_property_create (); ... ds = cci_datasource_create (ps, &err); ... cci_datasource_change_property(ds, "login_timeout", "5000"); cci_datasource_change_property(ds, "default_lock_timeout", "2000"); cci_datasource_change_property(ds, "default_isolation", "TRAN_REP_CLASS_COMMIT_INSTANCE"); cci_datasource_change_property(ds, "default_autocommit", "true"); ... .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_borrow`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release` cci_datasource_create --------------------- .. c:function:: T_CCI_DATASOURCE *cci_datasource_create (T_CCI_PROPERTIES *properties, T_CCI_ERROR *err_buf) CCIì˜ DATASOURCE를 ìƒì„±í•œë‹¤. :param properties: (IN) ì„¤ì •ì´ ì €ìž¥ëœ **T_CCI_PROPERTIES** 구조체 í¬ì¸í„°. :c:func:`cci_property_set`\ 으로 ì†ì„± ê°’ë“¤ì„ ì„¤ì •í•œë‹¤. :param err_buf: (OUT) ì—러 ë²„í¼ (ì—러가 ë°œìƒí•˜ë©´ ì—러 코드와 메시지를 반환) :return: ìƒì„±ëœ **T_CCI_DATASOURCE** 구조체 í¬ì¸í„° (성공), NULL (실패) .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_borrow`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release`, :c:func:`cci_datasource_change_property` cci_datasource_destroy ---------------------- .. c:function:: void cci_datasource_destroy (T_CCI_DATASOURCE *datasource) CCIì˜ DATASOURCE를 ì‚ì œí•œë‹¤. :param datasource: (IN) ì‚ì œí• **T_CCI_DATASOURCE** 구조체 í¬ì¸í„° :return: void .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_borrow`, :c:func:`cci_datasource_release`, :c:func:`cci_datasource_change_property` cci_datasource_release ---------------------- .. c:function:: int cci_datasource_release (T_CCI_DATASOURCE *datasource, T_CCI_CONN conn, T_CCI_ERROR *err_buf) **T_CCI_DATASOURCE** êµ¬ì¡°ì²´ì— ì‚¬ìš©ì„ ë낸 CCI ì—°ê²°ì„ ë°˜í™˜í•œë‹¤. ì—°ê²°ì´ ì—°ê²° í’€ì— ë°˜í™˜ëœ ì´í›„ ìž¬ì‚¬ìš©í•˜ë ¤ë©´ 반드시 :c:func:`cci_datasource_borrow` 함수를 재호출해야 한다. :param datasource: (IN) CCI ì—°ê²°ì„ ë°˜í™˜í• **T_CCI_DATASOURCE** 구조체 í¬ì¸í„° :param conn: (IN) ì‚¬ìš©ì„ ë낸 CCI ì—°ê²°ì˜ í•¸ë“¤ ì‹ë³„ìž :param err_buf: (OUT) ì—러 ë²„í¼ (ì—러가 ë°œìƒí•˜ë©´ ì—러 코드와 메시지를 반환) :return: 1 (성공), 0 (실패) .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_borrow`, :c:func:`cci_datasource_change_property` cci_disconnect -------------- .. c:function:: int cci_disconnect(int conn_handle, T_CCI_ERROR *err_buf) *conn_handle* ì— ëŒ€í•´ ìƒì„±ëœ ëª¨ë“ ìš”ì² í•¸ë“¤ì„ ì‚ì œí•œë‹¤. 트랜ìžì…˜ì´ ì§„í–‰ ì¤‘ì¼ ê²½ìš° :c:func:`cci_end_tran`\ ì„ ì‹¤í–‰í•œ ë‹¤ìŒ ì‚ì œëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0 : 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** cci_end_tran ------------ .. c:function:: int cci_end_tran(int conn_handle, char type, T_CCI_ERROR *err_buf) 현재 ì§„í–‰ ì¤‘ì¸ íŠ¸ëžœìžì…˜ì— 대해서 커밋(commit)ì´ë‚˜ 롤백(rollback)ì„ ìˆ˜í–‰í•œë‹¤. ì´ë•Œ, ì—´ë ¤ 있는 ìš”ì² í•¸ë“¤ì€ ëª¨ë‘ ì¢…ë£Œë˜ê³ , ë°ì´í„°ë² ì´ìФ 서버와 ì—°ê²°ì´ í•´ì œëœë‹¤. 단, 서버와 ì—°ê²°ì´ ëŠì–´ì§„ 후ì—ë„ í•´ë‹¹ ì—°ê²° í•¸ë“¤ì€ ìœ íš¨í•˜ë©°, ì´ëŠ” :c:func:`cci_connect` 함수로 ì—°ê²° í•¸ë“¤ì„ í•˜ë‚˜ í• ë‹¹ ë°›ì€ ê²½ìš°ì™€ ë™ì¼í•œ ìƒíƒœë‹¤. *type* ì´ **CCI_TRAN_COMMIT** 으로 ì§€ì •ë˜ë©´ 트랜ìžì…˜ì„ ì»¤ë°‹í•˜ê³ , **CCI_TRAN_ROLLBACK** 으로 ì§€ì •ë˜ë©´ 트랜ìžì…˜ì„ 롤백한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param type: (IN) **CCI_TRAN_COMMIT** ë˜ëŠ” **CCI_TRAN_ROLLBACK** :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0 : 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_TRAN_TYPE** 브로커 파ë¼ë¯¸í„°ì¸ :ref:`CCI_DEFAULT_AUTOCOMMIT <cci_default_autocommit>`\ 으로 ì‘ìš© 프로그램 시작 시 ìžë™ 커밋 ëª¨ë“œì˜ ê¸°ë³¸ê°’ì„ ì„¤ì •í• ìˆ˜ 있으며, 브로커 파ë¼ë¯¸í„° ì„¤ì •ì„ ìƒëžµí•˜ë©´ ê¸°ë³¸ê°’ì€ **ON**\ ì´ë‹¤. ì‘ìš© 프로그램 ë‚´ì—서 ìžë™ 커밋 모드를 ë³€ê²½í•˜ë ¤ë©´ :c:func:`cci_set_autocommit` 함수를 ì´ìš©í•˜ë©°, ìžë™ 커밋 모드가 **OFF** ì´ë©´ :c:func:`cci_end_tran` 함수를 ì´ìš©í•˜ì—¬ 명시ì 으로 트랜ìžì…˜ì„ 커밋하거나 롤백해야 한다. cci_escape_string ----------------- .. c:function:: long cci_escape_string(int conn_handle, char *to, const char *from, unsigned long length, T_CCI_ERROR *err_buf) ìž…ë ¥ 문ìžì—´ì„ CUBRID 질ì˜ë¬¸ì—서 ì‚¬ìš©í• ìˆ˜ 있는 문ìžì—´ë¡œ 변환한다. ì´ í•¨ìˆ˜ì˜ ì¸ìžë¡œ ì—°ê²° 핸들 ë˜ëŠ” **no_backslash_escapes** ì„¤ì • ê°’, ì¶œë ¥ 문ìžì—´ í¬ì¸í„°, ìž…ë ¥ 문ìžì—´ í¬ì¸í„°, ìž…ë ¥ 문ìžì—´ì˜ ë°”ì´íЏ 길ì´, 오류 ì •ë³´ë¥¼ ë‹´ì„ **T_CCI_ERROR** 구조체 ë³€ìˆ˜ì˜ ì£¼ì†Œê°€ ì§€ì •ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 ë˜ëŠ” **no_backslash_escapes** ì„¤ì • ê°’. ì—°ê²° í•¸ë“¤ì´ ì£¼ì–´ì§€ëŠ” 경우, ì—°ê²°ëœ ì„œë²„ì˜ **no_backslash_escapes** 파ë¼ë¯¸í„° ì„¤ì • ê°’ì„ ì½ì–´ì„œ 변환 ë°©ë²•ì„ ê²°ì •í•œë‹¤. ì—°ê²° 핸들 ëŒ€ì‹ **CCI_NO_BACKSLASH_ESCAPES_TRUE** ë˜ëŠ” **CCI_NO_BACKSLASH_ESCAPES_FALSE** ì„¤ì • ê°’ì„ ì „ë‹¬í•˜ì—¬ 변환 ë°©ë²•ì„ ê²°ì •í• ìˆ˜ 있다. :param to: (OUT) ê²°ê³¼ 문ìžì—´ :param from: (IN) ìž…ë ¥ 문ìžì—´ :param length: (IN) ìž…ë ¥ 문ìžì—´ì˜ 최대 ë°”ì´íЏ ê¸¸ì´ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ë³€ê²½ëœ ë¬¸ìžì—´ì˜ ë°”ì´íЏ 길ì´(성공), ì—러 코드(실패) * **CCI_ER_CON_HANDLE** * **CCI_ER_COMMUNICATION** 시스템 파ë¼ë¯¸í„° **no_backslash_escapesì˜** ê°’ì´ yes(기본값)ì´ê±°ë‚˜ ì—°ê²° 핸들 ìœ„ì¹˜ì— **CCI_NO_BACKSLASH_ESCAPES_TRUE** ê°’ì„ ì „ë‹¬í•˜ëŠ” 경우, 변환ë˜ëŠ” 문ìžëŠ” 다ìŒê³¼ 같다. * ' (single quote) => ' + ' (escaped single quote) 시스템 파ë¼ë¯¸í„° **no_backslash_escapesì˜** ê°’ì´ noì´ê±°ë‚˜ ì—°ê²° 핸들 ìœ„ì¹˜ì— **CCI_NO_BACKSLASH_ESCAPES_FALSE** ê°’ì„ ì „ë‹¬í•˜ëŠ” 경우, 변환ë˜ëŠ” 문ìžëŠ” 다ìŒê³¼ 같다. * \\n (new line character, ASCII 10) => \\ + n (백슬래시 + 알파벳 n) * \\r (carriage return, ASCII 13) => \\ + r (백슬래시 + 알파벳 r) * \\0 (ASCII 0) => \\ + 0 (백슬래시 + 0(ASCII 48) * \\ (백슬래시) => \\ + \\ ê²°ê³¼ 문ìžì—´ì„ ì €ìž¥í• ê³µê°„ì€ *length* ì¸ìžë¡œ 사용ìžê°€ ì§ì ‘ í• ë‹¹í•˜ë©°, 최대 ìž…ë ¥ 문ìžì—´ì˜ ë°”ì´íЏ ê¸¸ì´ * 2 + 1ë§Œí¼ì´ í•„ìš”í• ìˆ˜ 있다. cci_execute ----------- .. c:function:: int cci_execute(int req_handle, char flag, int max_col_size, T_CCI_ERROR *err_buf) :c:func:`cci_prepare`\ 를 수행한 SQL 문(prepared statement)ì„ ì‹¤í–‰í•œë‹¤. ì´ í•¨ìˆ˜ì˜ ì¸ìžë¡œ ìš”ì² í•¸ë“¤, *flag*, fetch하는 ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´, 오류 ì •ë³´ë¥¼ ë‹´ì„ **T_CCI_ERROR** 구조체 ë³€ìˆ˜ì˜ ì£¼ì†Œê°€ ì§€ì •ëœë‹¤. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param flag: (IN) exec flag ( **CCI_EXEC_QUERY_ALL** ) :param max_col_size: (IN) 문ìžì—´ íƒ€ìž…ì¸ ê²½ìš° fetch하는 ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´(단위: ë°”ì´íЏ). ì´ ê°’ì´ 0ì´ë©´ ì „ì²´ 길ì´ë¥¼ fetch한다. :param err_buf: (OUT) ì—러 ë²„í¼ :return: * **SELECT** : ê²°ê³¼ í–‰ì˜ ê°œìˆ˜ë¥¼ 반환 * **INSERT**, **UPDATE** : ë°˜ì˜ëœ í–‰ì˜ ê°œìˆ˜ * 기타 ì§ˆì˜ : 0 * 실패 : ì—러 코드 * **CCI_ER_REQ_HANDLE** * **CCI_ER_BIND** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_LOGIN_TIMEOUT** *flag*\를 통해 질ì˜ë¬¸ 수행 ë°©ì‹ì„ ëª¨ë‘ ìˆ˜í–‰í•˜ê²Œ 하거나 첫번째 질ì˜ë¬¸ë§Œ 수행하ë„ë¡ ì§€ì •í• ìˆ˜ 있다. .. note:: 2008 R4.4와 9.2 ì´ìƒ ë²„ì „ì—서 *flag* ì„¤ì • 시 비ë™ê¸° ë°©ì‹ìœ¼ë¡œ 결과를 ê°€ì ¸ì˜¤ê²Œ 하는 **CCI_EXEC_ASYNC**\ 를 ë” ì´ìƒ ì§€ì›í•˜ì§€ 않는다. *flag*\ì— **CCI_EXEC_QUERY_ALL**\ ì„ ì„¤ì •í•˜ë©´ prepare ì‹œì— ì „ë‹¬ëœ ì—¬ëŸ¬ ê°œì˜ ì§ˆì˜ë¬¸(ì„¸ë¯¸ì½œë¡ ìœ¼ë¡œ 여러 ê°œì˜ ì§ˆì˜ë¬¸ì„ 구분)ì„ ëª¨ë‘ ìˆ˜í–‰í•˜ë©°, ê·¸ë ‡ì§€ ì•Šì€ ê²½ìš° ì œì¼ ì•žì— ìžˆëŠ” 질ì˜ë¬¸ë§Œ 수행한다. *flag*\ì— **CCI_EXEC_QUERY_ALL**\ ì„ ì„¤ì •í•˜ë©´ 다ìŒì˜ ê·œì¹™ì´ ì ìš©ëœë‹¤. * 리턴 ê°’ì€ ì²« 번째 질ì˜ì— 대한 ê²°ê³¼ì´ë‹¤. * ì–´ëŠ í•˜ë‚˜ì˜ ì§ˆì˜ì—서 ì—러가 ë°œìƒí• 경우 execute는 실패한 것으로 처리ëœë‹¤. * q1; q2; q3와 ê°™ì´ êµ¬ì„±ëœ ì§ˆì˜ì— 대해서 q1ì„ ì„±ê³µí•˜ê³ q2ì—서 ì—러가 ë°œìƒí•´ë„ q1ì˜ ìˆ˜í–‰ 결과는 ìœ íš¨í•˜ë‹¤. 즉, ì—러가 ë°œìƒí–ˆì„ 때, 앞서 성공한 ì§ˆì˜ ìˆ˜í–‰ì— ëŒ€í•´ì„œ 롤백하지 않는다. * 질ì˜ê°€ 성공ì 으로 ìˆ˜í–‰ëœ ê²½ìš° ë‘ ë²ˆì§¸ 질ì˜ì— 대한 결과는 :c:func:`cci_next_result`\ 를 통해서 ì–»ì„ ìˆ˜ 있다. *max_col_size* 는 prepared statementì˜ ì¹¼ëŸ¼ì´ **CHAR**, **VARCHAR**, **BIT**, **VARBIT** ì¼ ê²½ìš° í´ë¼ì´ì–¸íŠ¸ë¡œ ì „ì†¡ë˜ëŠ” ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´ë¥¼ ê²°ì •í•˜ê¸° 위한 ê°’ì´ë©°, ì´ ê°’ì´ 0ì´ë©´ ì „ì²´ 길ì´ë¥¼ fetch한다. cci_execute_array ----------------- .. c:function:: int cci_execute_array(int req_handle, T_CCI_QUERY_RESULT **query_result, T_CCI_ERROR *err_buf) prepared statementì— í•˜ë‚˜ ì´ìƒì˜ ê°’ì´ ë°”ì¸ë”©ë˜ëŠ” 경우, ë°”ì¸ë”©ë˜ëŠ” ë³€ìˆ˜ì˜ ê°’ì„ ë°°ì—´(array)로 ì „ë‹¬ë°›ì•„ ê°ê°ì˜ ê°’ì„ ë³€ìˆ˜ì— ë°”ì¸ë”©í•˜ì—¬ 질ì˜ë¥¼ 실행한다. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param query_result: (OUT) ì§ˆì˜ ê²°ê³¼ :param err_buf: (OUT) ë°ì´í„°ë² ì´ìФ ì—러 ë²„í¼ :return: * 성공 : ìˆ˜í–‰ëœ ì§ˆì˜ì˜ 개수(ì§ˆì˜ ìˆ˜í–‰ 성공/실패 여부와 ìƒê´€ì—†ìŒ) * 실패 : ì—러 코드 * **CCI_ER_REQ_HANDLE** * **CCI_ER_BIND** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_LOGIN_TIMEOUT** ë°ì´í„°ë¥¼ ë°”ì¸ë”©í•˜ê¸° 위해서는 :c:func:`cci_bind_param_array_size` 함수를 호출하여 ë°°ì—´ì˜ í¬ê¸°ë¥¼ ì§€ì •í•œ 후, :c:func:`cci_bind_param_array` 함수를 ì´ìš©í•˜ì—¬ ê°ê°ì˜ ê°’ì„ ë³€ìˆ˜ì— ë°”ì¸ë”©í•˜ê³ , :c:func:`cci_execute_array` 함수를 호출하여 질ì˜ë¥¼ 실행한다. ì§ˆì˜ ê²°ê³¼ëŠ” T_CCI_QUERY_RESULT êµ¬ì¡°ì²´ì˜ ë°°ì—´ì— ì €ìž¥ëœë‹¤. :c:func:`cci_execute_array` 함수는 *query_result* ë³€ìˆ˜ì— ì§ˆì˜ ê²°ê³¼ë¥¼ 반환한다. 실행 ê²°ê³¼ì— ëŒ€í•œ ì •ë³´ë¥¼ 얻기 위해서는 아래와 ê°™ì€ ë§¤í¬ë¡œë¥¼ ì´ìš©í• 수 있다. 매í¬ë¡œì—서는 ìž…ë ¥ë°›ëŠ” ê° ì¸ìžì— 대한 ìœ íš¨ì„± 검사가 ì´ë£¨ì–´ì§€ì§€ 않으므로 주ì˜í•œë‹¤. *query_result* ë³€ìˆ˜ì˜ ì‚¬ìš©ì´ ë나면 :c:func:`cci_query_result_free` 함수를 ì´ìš©í•˜ì—¬ ì§ˆì˜ ê²°ê³¼ë¥¼ ì‚ì œí•´ì•¼ 한다. +---------------------------------------+---------------------------------+-------------------------------+ | 매í¬ë¡œ | 리턴 타입 | ì˜ë¯¸ | +=======================================+=================================+===============================+ | :c:macro:`CCI_QUERY_RESULT_RESULT` | int | ì˜í–¥ì„ ë¼ì¹œ í–‰ì˜ ê°œìˆ˜ | | | | ë˜ëŠ” ì—러 ì‹ë³„ìž | | | | (-1: CAS ì—러, -2: DBMS ì—러) | +---------------------------------------+---------------------------------+-------------------------------+ | :c:macro:`CCI_QUERY_RESULT_ERR_NO` | int | 질ì˜ì— 대한 ì—러 번호 | +---------------------------------------+---------------------------------+-------------------------------+ | :c:macro:`CCI_QUERY_RESULT_ERR_MSG` | char \* | 질ì˜ì— 대한 ì—러 메시지 | +---------------------------------------+---------------------------------+-------------------------------+ | :c:macro:`CCI_QUERY_RESULT_STMT_TYPE` | int(**T_CCI_CUBRID_STMT** enum) | 질ì˜ë¬¸ì˜ 타입 | +---------------------------------------+---------------------------------+-------------------------------+ ìžë™ ì»¤ë°‹ì´ ONì¸ ê²½ìš° ë°°ì—´ ë‚´ì˜ ê° ì§ˆì˜ê°€ 수행ë 때마다 커밋ëœë‹¤. .. note :: * 2008 R4.3 미만 ë²„ì „ì—서 ìžë™ ì»¤ë°‹ì´ ONì¸ ê²½ìš° ë°°ì—´ ë‚´ì˜ ëª¨ë“ ì§ˆì˜ê°€ ìˆ˜í–‰ëœ ì´í›„ì— ì»¤ë°‹ë˜ì—ˆìœ¼ë‚˜, 2008 R4.3부터는 ì§ˆì˜ í•˜ë‚˜ê°€ 수행ë 때마다 커밋ëœë‹¤. * ìžë™ ì»¤ë°‹ì´ OFFì¼ ë•Œ 질ì˜ë¬¸ì„ ì¼ê´„ 처리하는 cci_execute_array 함수ì—서 ë°°ì—´ ë‚´ì˜ ì§ˆì˜ ì¼ë¶€ì— ì¼ë°˜ì ì¸ ì˜¤ë¥˜ê°€ ë°œìƒí•˜ëŠ” 경우, ì´ë¥¼ ê±´ë„ˆë›°ê³ ë‹¤ìŒ ì§ˆì˜ë¥¼ ê³„ì† ìˆ˜í–‰í•œë‹¤. 그러나, êµì°© ìƒíƒœê°€ ë°œìƒí•˜ë©´ 트랜ìžì…˜ì„ ë¡¤ë°±í•˜ê³ ì˜¤ë¥˜ 처리한다. .. code-block:: c char *query = "update participant set gold = ? where host_year = ? and nation_code = 'KOR'"; int gold[2]; char *host_year[2]; int null_ind[2]; T_CCI_QUERY_RESULT *result; int n_executed; ... req = cci_prepare (con, query, 0, &cci_error); if (req < 0) { printf ("prepare error: %d, %s\n", cci_error.err_code, cci_error.err_msg); goto handle_error; } gold[0] = 20; host_year[0] = "2004"; gold[1] = 15; host_year[1] = "2008"; null_ind[0] = null_ind[1] = 0; error = cci_bind_param_array_size (req, 2); if (error < 0) { printf ("bind_param_array_size error: %d\n", error); goto handle_error; } error = cci_bind_param_array (req, 1, CCI_A_TYPE_INT, gold, null_ind, CCI_U_TYPE_INT); if (error < 0) { printf ("bind_param_array error: %d\n", error); goto handle_error; } error = cci_bind_param_array (req, 2, CCI_A_TYPE_STR, host_year, null_ind, CCI_U_TYPE_INT); if (error < 0) { printf ("bind_param_array error: %d\n", error); goto handle_error; } n_executed = cci_execute_array (req, &result, &cci_error); if (n_executed < 0) { printf ("execute error: %d, %s\n", cci_error.err_code, cci_error.err_msg); goto handle_error; } for (i = 1; i <= n_executed; i++) { printf ("query %d\n", i); printf ("result count = %d\n", CCI_QUERY_RESULT_RESULT (result, i)); printf ("error message = %s\n", CCI_QUERY_RESULT_ERR_MSG (result, i)); printf ("statement type = %d\n", CCI_QUERY_RESULT_STMT_TYPE (result, i)); } error = cci_query_result_free (result, n_executed); if (error < 0) { printf ("query_result_free: %d\n", error); goto handle_error; } error = cci_end_tran(con, CCI_TRAN_COMMIT, &cci_error); if (error < 0) { printf ("end_tran: %d, %s\n", cci_error.err_code, cci_error.err_msg); goto handle_error; } cci_execute_batch ----------------- .. c:function:: int cci_execute_batch(int conn_handle, int num_sql_stmt, char **sql_stmt, T_CCI_QUERY_RESULT **query_result, T_CCI_ERROR *err_buf) CCIì—서 **INSERT** / **UPDATE** / **DELETE** 와 ê°™ì€ DML 질ì˜ë¥¼ 사용하는 경우ì—는 여러 ìž‘ì—…ì„ í•œ ë²ˆì— ì²˜ë¦¬í• ìˆ˜ 있는ë°, ì´ëŸ¬í•œ 배치 ìž‘ì—…ì„ ìœ„í•´ì„œ :c:func:`cci_execute_array` 함수와 :c:func:`cci_execute_batch` 함수가 ì´ìš©ë 수 있다. 단, :c:func:`cci_execute_batch` 함수ì—서는 prepared statement를 ì‚¬ìš©í• ìˆ˜ 없다. ì§ˆì˜ ê²°ê³¼ëŠ” **T_CCI_QUERY_RESULT** êµ¬ì¡°ì²´ì˜ ë°°ì—´ì— ì €ìž¥ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param num_sql_stmt: (IN) *sql_stmt* ì˜ ê°œìˆ˜ :param sql_stmt: (IN) SQL 문 array :param query_result: (OUT) *sql_stmt* ì˜ ê²°ê³¼ :param err_buf: (OUT) ë°ì´í„°ë² ì´ìФ ì—러 ë²„í¼ :return: * 성공 : ìˆ˜í–‰ëœ ì§ˆì˜ì˜ 개수(ì§ˆì˜ ìˆ˜í–‰ 성공/실패 여부와 ìƒê´€ì—†ìŒ) * 실패 : ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_CONNECT** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_LOGIN_TIMEOUT** ì¸ìžë¡œ ì§€ì •ëœ *num_sql_stmt* ê°œì˜ *sql_stmt* 를 수행하며, *query_result* 변수로 ìˆ˜í–‰ëœ ì§ˆì˜ ê°œìˆ˜ë¥¼ 반환한다. ê°ê°ì˜ 질ì˜ì— 대한 결과는 :c:macro:`CCI_QUERY_RESULT_RESULT`, :c:macro:`CCI_QUERY_RESULT_ERR_NO`, :c:macro:`CCI_QUERY_RESULT_ERR_MSG`, :c:macro:`CCI_QUERY_RESULT_STMT_TYPE`\ 매í¬ë¡œë¥¼ ì´ìš©í• 수 있다. ì „ì²´ 매í¬ë¡œì— 대한 요약 ì„¤ëª…ì€ :c:func:`cci_execute_array`\ 를 ì°¸ê³ í•œë‹¤. 매í¬ë¡œì—서는 ìž…ë ¥ë°›ì€ ì¸ìžì— 대한 ìœ íš¨ì„±ì„ ê²€ì‚¬í•˜ì§€ 않으므로 주ì˜í•œë‹¤. *query_result* ë³€ìˆ˜ì˜ ì‚¬ìš©ì´ ë나면 :c:func:`cci_query_result_free` 함수를 ì´ìš©í•˜ì—¬ ì§ˆì˜ ê²°ê³¼ë¥¼ ì‚ì œí•´ì•¼ 한다. ìžë™ ì»¤ë°‹ì´ ONì¸ ê²½ìš° ë°°ì—´ ë‚´ì˜ ê° ì§ˆì˜ê°€ 수행ë 때마다 커밋ëœë‹¤. .. note :: * 2008 R4.3 ì´ì „ ë²„ì „ì—서 ìžë™ ì»¤ë°‹ì´ ONì¸ ê²½ìš° ë°°ì—´ ë‚´ì˜ ëª¨ë“ ì§ˆì˜ê°€ ìˆ˜í–‰ëœ ì´í›„ì— ì»¤ë°‹ë˜ì—ˆìœ¼ë‚˜, 2008 R4.3부터는 ì§ˆì˜ í•˜ë‚˜ê°€ 수행ë 때마다 커밋ëœë‹¤. * ìžë™ ì»¤ë°‹ì´ OFFì¼ ë•Œ 질ì˜ë¬¸ì„ ì¼ê´„ 처리하는 cci_execute_batch 함수ì—서 ë°°ì—´ ë‚´ì˜ ì§ˆì˜ ì¼ë¶€ì— ì¼ë°˜ì ì¸ ì˜¤ë¥˜ê°€ ë°œìƒí•˜ëŠ” 경우, ì´ë¥¼ ê±´ë„ˆë›°ê³ ë‹¤ìŒ ì§ˆì˜ë¥¼ ê³„ì† ìˆ˜í–‰í•œë‹¤. 그러나, êµì°© ìƒíƒœê°€ ë°œìƒí•˜ë©´ 트랜ìžì…˜ì„ ë¡¤ë°±í•˜ê³ ì˜¤ë¥˜ 처리한다. .. code-block:: c ... char **queries; T_CCI_QUERY_RESULT *result; int n_queries, n_executed; ... count = 3; queries = (char **) malloc (count * sizeof (char *)); queries[0] = "insert into athlete(name, gender, nation_code, event) values('Ji-sung Park', 'M', 'KOR', 'Soccer')"; queries[1] = "insert into athlete(name, gender, nation_code, event) values('Joo-young Park', 'M', 'KOR', 'Soccer')"; queries[2] = "select * from athlete order by code desc limit 2"; //calling cci_execute_batch() n_executed = cci_execute_batch (con, count, queries, &result, &cci_error); if (n_executed < 0) { printf ("execute_batch: %d, %s\n", cci_error.err_code, cci_error.err_msg); goto handle_error; } printf ("%d statements were executed.\n", n_executed); for (i = 1; i <= n_executed; i++) { printf ("query %d\n", i); printf ("result count = %d\n", CCI_QUERY_RESULT_RESULT (result, i)); printf ("error message = %s\n", CCI_QUERY_RESULT_ERR_MSG (result, i)); printf ("statement type = %d\n", CCI_QUERY_RESULT_STMT_TYPE (result, i)); } error = cci_query_result_free (result, n_executed); if (error < 0) { printf ("query_result_free: %d\n", error); goto handle_error; } ... cci_execute_result ------------------ .. c:function:: int cci_execute_result(int req_handle, T_CCI_QUERY_RESULT **query_result, T_CCI_ERROR *err_buf) 질ì˜ê°€ 여러 ê°œì¸ ê²½ìš° 수행 ê²°ê³¼(statement type, result count)를 **T_CCI_QUERY_RESULT** êµ¬ì¡°ì²´ì˜ ë°°ì—´ì— ì €ìž¥í•œë‹¤. ê°ê°ì˜ 질ì˜ì— 대한 결과는 :c:macro:`CCI_QUERY_RESULT_RESULT`, :c:macro:`CCI_QUERY_RESULT_ERR_NO`, :c:macro:`CCI_QUERY_RESULT_ERR_MSG`, :c:macro:`CCI_QUERY_RESULT_STMT_TYPE`\ 매í¬ë¡œë¥¼ ì´ìš©í• 수 있다. ì „ì²´ 매í¬ë¡œì— 대한 요약 ì„¤ëª…ì€ :c:func:`cci_execute_array`\를 ì°¸ê³ í•œë‹¤. 매í¬ë¡œì—서는 ìž…ë ¥ë°›ì€ ì¸ìžì— 대한 ìœ íš¨ì„±ì„ ê²€ì‚¬í•˜ì§€ 않으므로 주ì˜í•œë‹¤. ì‚¬ìš©ëœ ì§ˆì˜ ê²°ê³¼ì˜ ë©”ëª¨ë¦¬ëŠ” :c:func:`cci_query_result_free`\를 통해 í•´ì œë˜ì–´ì•¼ 한다. :param req_handle: (IN) prepared statementì˜ ìš”ì² í•¸ë“¤ :param query_result: (OUT) 쿼리 ê²°ê³¼ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ìˆ˜í–‰ëœ ì§ˆì˜ì˜ 개수(성공), ì—러 코드(실패) * **CCI_ER_REQ_HANDLE** * **CCI_ER_COMMUNICATION** .. code-block:: c ... T_CCI_QUERY_RESULT *qr; ... cci_execute( ... ); res = cci_execute_result(req_h, &qr, &err_buf); if (res < 0) { /* error */ } else { for (i=1 ; i <= res ; i++) { result_count = CCI_QUERY_RESULT_RESULT(qr, i); stmt_type = CCI_QUERY_RESULT_STMT_TYPE(qr, i); } cci_query_result_free(qr, res); } ... cci_fetch --------- .. c:function:: int cci_fetch(int req_handle, T_CCI_ERROR *err_buf) :c:func:`cci_execute`\ 로 실행한 ì§ˆì˜ ê²°ê³¼ë¥¼ 서버 측 CAS로부터 fetch하여 í´ë¼ì´ì–¸íЏ 버í¼ì— ì €ìž¥í•œë‹¤. fetchëœ ì§ˆì˜ ê²°ê³¼ì—서 íŠ¹ì • ì¹¼ëŸ¼ì˜ ë°ì´í„°ëŠ” :c:func:`cci_get_data` 함수를 ì´ìš©í•´ì„œ 확ì¸í• 수 있다. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_REQ_HANDLE** * **CAS_ER_HOLDABLE_NOT_ALLOWED** * **CCI_ER_NO_MORE_DATA** * **CCI_ER_RESULT_SET_CLOSED** * **CCI_ER_DELETED_TUPLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_NO_MORE_MEMORY** cci_fetch_buffer_clear ---------------------- .. c:function:: int cci_fetch_buffer_clear(int req_handle) í´ë¼ì´ì–¸íЏ 버í¼ì— 임시 ì €ìž¥ëœ ë ˆì½”ë“œë¥¼ ì‚ì œí•œë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :return: ì—러 코드(0: 성공) * **CCI_ER_REQ_HANDLE** cci_fetch_sensitive ------------------- .. c:function:: int cci_fetch_sensitive(int req_handle, T_CCI_ERROR *err_buf) 서버ì—서 í´ë¼ì´ì–¸íŠ¸ë¡œ **SELECT** 질ì˜ì˜ 결과가 ì „ì†¡ë 때 sensitive columnì— ëŒ€í•´ì„œ ë³€ê²½ëœ ê°’ìœ¼ë¡œ ì „ì†¡ë˜ë„ë¡ í•œë‹¤. *req_handle* ì— ì˜í•œ 결과가 sensitive resultê°€ ì•„ë‹ ê²½ìš° :c:func:`cci_fetch`\ 와 ë™ì¼í•˜ë‹¤. 리턴 ê°’ì´ **CCI_ER_DELETED_TUPLE**\ ì¼ ê²½ìš° 해당 ë ˆì½”ë“œëŠ” ì‚ì œëœ ê²½ìš°ì´ë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param err_buf: (OUT) ë°ì´í„°ë² ì´ìФ ì—러 ë²„í¼ :return: ì—러 코드 (0: 성공) * **CCI_ER_REQ_HANDLE** * **CCI_ER_NO_MORE_DATA** * **CCI_ER_COMMUNICATION** * **CCI_ER_DBMS** * **CCI_ER_DELETED_TUPLE** sensitive columnì´ëž€ **SELECT** 리스트 í•목 중 ê²°ê³¼ ìž¬ìš”ì² ì‹œ ì—…ë°ì´íŠ¸ëœ ê°’ì„ ì œê³µí• ìˆ˜ 있는 í•ëª©ì„ ë§í•œë‹¤. 주로 ì–´ë– í•œ ì—°ì‚° ì—†ì´, 예를 들면 집계 ì—°ì‚°ê³¼ ê°™ì€ ê³¼ì •ì´ ì—†ì´ ì¹¼ëŸ¼ì„ **SELECT** ë¦¬ìŠ¤íŠ¸ì˜ í•목으로 그대로 쓰는 경우 ê·¸ ì¹¼ëŸ¼ì„ sensitive columnì´ë¼ê³ ë§í• 수 있다. ì§ˆì˜ ê²°ê³¼ë¥¼ 다시 fetchí• ë•Œ, sensitive result는 í´ë¼ì´ì–¸íЏ 버í¼ì— ì €ìž¥ëœ ë ˆì½”ë“œë¥¼ 받지 ì•Šê³ , 서버로부터 ë³€ê²½ëœ ê°’ì„ ë°›ëŠ”ë‹¤. cci_fetch_size -------------- .. c:function:: int cci_fetch_size(int req_handle, int fetch_size) ì´ í•¨ìˆ˜ëŠ” ë” ì´ìƒ 사용ë˜ì§€ 않으며(deprecated), ì œê±°ë ì˜ˆì •ì´ë‹¤. 호출ë˜ë”ë¼ë„ 무시ë˜ì–´ ë™ìž‘ì— ì–´ë– í•œ ë³€í™”ë„ ë°œìƒí•˜ì§€ 않는다. cci_get_autocommit ------------------ .. c:function:: CCI_AUTOCOMMIT_MODE cci_get_autocommit(int conn_handle) 현재 ì„¤ì •í•œ ìžë™ 커밋 모드(autocommit mode)를 반환한다. :param conn_handle: (IN) ì—°ê²° 핸들 :return: * **CCI_AUTOCOMMIT_TRUE**: ìžë™ 커밋 모드 ON * **CCI_AUTOCOMMIT_FALSE**: ìžë™ 커밋 모드 OFF * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** cci_get_bind_num ---------------- .. c:function:: int cci_get_bind_num(int req_handle) ìž…ë ¥ ë°”ì¸ë”©(input binding) 개수를 ê°€ì ¸ì˜¨ë‹¤. prepare 시 ì‚¬ìš©ëœ SQL ë¬¸ì´ ì—¬ëŸ¬ ê°œì˜ ì§ˆì˜ë¡œ 구성ë˜ì–´ ìžˆì„ ê²½ìš°, ì „ì²´ 질ì˜ì—서 ì‚¬ìš©ëœ ìž…ë ¥ ë°”ì¸ë”© 개수를 나타낸다. :param req_handle: (IN) prepared statementì— ëŒ€í•œ ìš”ì² í•¸ë“¤ :return: ìž…ë ¥ ë°”ì¸ë”© 개수 * **CCI_ER_REQ_HANDLE** cci_get_cas_info ---------------- .. c:function:: int cci_get_cas_info (int conn_handle, char *info_buf, int buf_length, T_CCI_ERROR * err_buf) conn_handleì— ì—°ê²°ë˜ì–´ 있는 CAS ì •ë³´ë¥¼ 조회한다. info_bufì— ì•„ëž˜ì™€ ê°™ì€ í˜•ì‹ì˜ 문ìžì—´ì´ 리턴ëœë‹¤. :: <host>:<port>,<cas id>,<cas process id> ì¶œë ¥ 예는 다ìŒê³¼ 같다. :: 127.0.0.1:33000,1,12916 CAS ID를 통해 해당 CASì˜ SQL 로그 파ì¼ì„ 쉽게 확ì¸í• 수 있다. 보다 ìžì„¸í•œ 사í•ì€ :ref:`sql-log-check`\ ì„ ì°¸ê³ í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param info_buf: (OUT) ì—°ê²° ì •ë³´ ë²„í¼ :param buf_length: (IN) ì—°ê²° ì •ë³´ ë²„í¼ ê¸¸ì´ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_INVALID_ARGS** * **CCI_ER_CON_HANDLE** cci_get_class_num_objs ---------------------- .. c:function:: int cci_get_class_num_objs(int conn_handle, char *class_name, int flag, int *num_objs, int *num_pages, T_CCI_ERROR *err_buf) *class_name* í´ëž˜ìŠ¤ì˜ ê°ì²´ 개수와 ì‚¬ìš©í•˜ê³ ìžˆëŠ” 페ì´ì§€ 수를 ê°€ì ¸ì˜¨ë‹¤. flagê°€ 1ì¼ ê²½ìš° ëŒ€ëžµì˜ ê°’ì„ ê°€ì ¸ì˜¤ê³ , 0ì¼ ê²½ìš° ì •í™•í•œ ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param class_name: (IN) í´ëž˜ìФ ì´ë¦„ :param flag: (IN) 0 ë˜ëŠ” 1 :param num_objs: (OUT) ê°ì²´ 수 :param num_pages: (OUT) 페ì´ì§€ 수 :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_REQ_HANDLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** CCI_GET_COLLECTION_DOMAIN ------------------------- .. c:macro:: #define CCI_GET_COLLECTION_DOMAIN(u_type) *u_type* ì´ set, multiset, sequence typeì¸ ê²½ìš° set, multiset, sequenceì˜ domainì„ ê°€ì ¸ì˜¨ë‹¤. *u_type* ì´ set typeì´ ì•„ë‹ ê²½ìš° 리턴 ê°’ì€ *u_type* ê³¼ 같다. :return: Type (CCI_U_TYPE) cci_get_cur_oid --------------- .. c:function:: int cci_get_cur_oid(int req_handle, char *oid_str_buf) Executeì—서 **CCI_INCLUDE_OID** ê°€ ì„¤ì •ëœ ê²½ìš° 현재 fetchëœ ë ˆì½”ë“œì˜ OID를 ê°€ì ¸ì˜¨ë‹¤. OID는 page, slot, volumeì— ì˜í•œ 스트ë§ìœ¼ë¡œ 표현ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str_buf: (OUT) OID ìŠ¤íŠ¸ë§ :return: ì—러 코드(0: 성공) * **CCI_ER_REQ_HANDLE** cci_get_data ------------ .. c:function:: int cci_get_data(int req_handle, int col_no, int type, void *value, int *indicator) 현재 fetchëœ ê²°ê³¼ì— ëŒ€í•´ì„œ *col_no* ë²ˆì§¸ì˜ ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param col_no: (IN) 칼럼 ì¸ë±ìФ. 1부터 시작. :param type: (IN) *value* ë³€ìˆ˜ì˜ ë°ì´í„° 타입(**T_CCI_A_TYPE** ì— ì •ì˜ëœ íƒ€ìž…ì„ ì‚¬ìš©) :param value: (OUT) ë°ì´í„°ë¥¼ ì €ìž¥í• ë³€ìˆ˜ì˜ ì£¼ì†Œ. *type*\ì´ CCI_A_TYPE_STR, CCI_A_TYPE_SET, CCI_A_TYPE_BLOB ë˜ëŠ” CCI_A_TYPE_CLOBì´ê³ ì¹¼ëŸ¼ì˜ ê°’ì´ NULLì´ë©´ valueì˜ ê°’ë„ NULLì´ë‹¤. :param indicator: (OUT) **NULL** indicator. (-1: **NULL**) * *type* ì´ **CCI_A_TYPE_STR** ì¸ ê²½ìš°: **NULL** ì´ë©´ -1ì„ ë°˜í™˜í•˜ê³ , **NULL** ì´ ì•„ë‹ˆë©´ *value* ì— ì €ìž¥ëœ ë¬¸ìžì—´ì˜ ë°”ì´íЏ 길ì´ë¥¼ 반환 * *type* ì´ **CCI_A_TYPE_STR** ì´ ì•„ë‹Œ 경우: **NULL** ì´ë©´ -1ì„ ë°˜í™˜í•˜ê³ , **NULL** ì´ ì•„ë‹ˆë©´ 0ì„ ë°˜í™˜ :return: ì—러 코드(0: 성공) * **CCI_ER_REQ_HANDLE** * **CCI_ER_TYPE_CONVERSION** * **CCI_ER_COLUMN_INDEX** * **CCI_ER_ATYPE** 주어진 *type* ì¸ìžì— ë”°ë¼ *value* ë³€ìˆ˜ì˜ íƒ€ìž…ì´ ê²°ì •ë˜ê³ , ì´ì— ë”°ë¼ *value* 변수로 ê°’ ë˜ëŠ” í¬ì¸í„°ê°€ 복사ëœë‹¤. ê°’ì„ ë³µì‚¬í•˜ëŠ” 경우 *value* 변수로 ì „ë‹¬ë˜ëŠ” ì£¼ì†Œì— ëŒ€í•œ 메모리가 í• ë‹¹ë˜ì–´ 있어야 한다. í¬ì¸í„° ë³µì‚¬ì˜ ê²½ìš° ì‘ìš© í´ë¼ì´ì–¸íЏ ë¼ì´ë¸ŒëŸ¬ë¦¬ ë‚´ì˜ í¬ì¸í„°ë¥¼ 반환하는 것ì´ë¯€ë¡œ, ë‹¤ìŒ :c:func:`cci_get_data` 함수 호출 시 해당 ê°’ì´ ìœ íš¨í•˜ì§€ 않게 ë˜ë¯€ë¡œ 주ì˜í•œë‹¤. í¬ì¸í„° ë³µì‚¬ì— ì˜í•´ ë°˜í™˜ëœ í¬ì¸í„°ëŠ” í•´ì œ(free)하면 안 ëœë‹¤. 단, íƒ€ìž…ì´ **CCI_A_TYPE_SET** ì¸ ê²½ìš° **T_CCI_SET** íƒ€ìž…ì˜ set í¬ì¸í„°ë¥¼ ë©”ëª¨ë¦¬ì— í• ë‹¹í•œ 후 ì´ë¥¼ 반환하므로, set í¬ì¸í„°ë¥¼ 사용한 후ì—는 :c:func:`cci_set_free` 함수를 ì´ìš©í•˜ì—¬ í• ë‹¹ëœ ë©”ëª¨ë¦¬ë¥¼ í•´ì œí•´ì•¼ 한다. 아래는 *type* ì¸ìžì™€ ê·¸ì— ëŒ€ì‘하는 *value* ì˜ ë°ì´í„° íƒ€ìž…ì„ ì •ë¦¬í•œ 표ì´ë‹¤. +---------------------+------------------------------+-------------------------------------------+ | type | value Type | Meaning | +=====================+==============================+===========================================+ | CCI_A_TYPE_STR | char \*\* | pointer copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_INT | int \* | value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_FLOAT | float \* | value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_DOUBLE | double \* | value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_BIT | **T_CCI_BIT** \* | value copy (pointer copy for each member) | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_SET | **T_CCI_SET** \* | memory allocation and value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_DATE | **T_CCI_DATE** \* | value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_BIGINT | int64_t \* | value copy | | | (For Windows: __int64 \*) | | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_BLOB | **T_CCI_BLOB** \* | memory allocation and value copy | +---------------------+------------------------------+-------------------------------------------+ | CCI_A_TYPE_CLOB | **T_CCI_CLOB** \* | memory allocation and value copy | +---------------------+------------------------------+-------------------------------------------+ .. note:: * **LOB** íƒ€ìž…ì— ëŒ€í•´ :c:func:`cci_get_data`\ 를 호출하면 **LOB** 타입 ì¹¼ëŸ¼ì˜ ë©”íƒ€ ë°ì´í„°(Locator)를 ì¶œë ¥í•˜ë©°, **LOB** 타입 ì¹¼ëŸ¼ì˜ ë°ì´í„°ë¥¼ ì¸ì¶œí•˜ë ¤ë©´ :c:func:`cci_blob_read`\ 를 호출해야 한다. ë‹¤ìŒ ì˜ˆì œëŠ” 페치한 ê²°ê³¼ ê°’ì„ :c:func:`cci_get_data`\ 를 ì´ìš©í•˜ì—¬ ì¶œë ¥í•˜ëŠ” ì½”ë“œì˜ ì¼ë¶€ì´ë‹¤. .. code-block:: c ... if ((res=cci_get_data(req, i, CCI_A_TYPE_INT, &buffer, &ind))<0) { printf( "%s(%d): cci_get_data fail\n", __FILE__, __LINE__); goto handle_error; } if (ind != -1) printf("%d \t|", buffer); else printf("NULL \t|"); ... cci_get_db_parameter -------------------- .. c:function:: int cci_get_db_parameter(int conn_handle, T_CCI_DB_PARAM param_name, void *value, T_CCI_ERROR *err_buf) ë°ì´í„°ë² ì´ìŠ¤ì— ì„¤ì •ëœ íŒŒë¼ë¯¸í„° ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param param_name: (IN) 시스템 파ë¼ë¯¸í„° ì´ë¦„ :param value: (OUT) 파ë¼ë¯¸í„° ê°’ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_PARAM_NAME** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** *param_name* ì— ëŒ€í•œ *value* ì˜ ë°ì´í„° íƒ€ìž…ì€ ë‹¤ìŒê³¼ 같다. +---------------------------------+--------------+----------+ | param_name | value 타입 | note | +=================================+==============+==========+ | **CCI_PARAM_ISOLATION_LEVEL** | int \* | get/set | +---------------------------------+--------------+----------+ | **CCI_PARAM_LOCK_TIMEOUT** | int \* | get/set | +---------------------------------+--------------+----------+ | **CCI_PARAM_MAX_STRING_LENGTH** | int \* | get only | +---------------------------------+--------------+----------+ | **CCI_PARAM_AUTO_COMMIT** | int \* | get only | +---------------------------------+--------------+----------+ :c:func:`cci_get_db_parameter`, :c:func:`cci_set_db_parameter`\ ì—서 **CCI_PARAM_LOCK_TIMEOUT** ì˜ ìž…ì¶œë ¥ 단위는 밀리초ì´ë‹¤. .. warning:: CUBRID 9.0 미만 ë²„ì „ì—서 **CCI_PARAM_LOCK_TIMEOUT** ì˜ ì¶œë ¥ 단위는 ì´ˆì´ë¯€ë¡œ 주ì˜í•´ì•¼ 한다. **CCI_PARAM_MAX_STRING_LENGTH** ì˜ ë‹¨ìœ„ëŠ” ë°”ì´íЏì´ë©°, 브로커 파ë¼ë¯¸í„° **MAX_STRING_LENGTH** ì— ì •ì˜ëœ ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. cci_get_db_version ------------------ .. c:function:: int cci_get_db_version(int conn_handle, char *out_buf, int out_buf_size) DBMS (Database Management System) ë²„ì „ì„ ê°€ì ¸ì˜¨ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param out_buf: (OUT) ê²°ê³¼ ë²„í¼ :param out_buf_size: (IN) *out_buf* í¬ê¸° :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** cci_get_err_msg --------------- .. c:function:: int cci_get_err_msg(int err_code, char *msg_buf, int msg_buf_size) ì—러 ì½”ë“œì— ëŒ€ì‘ë˜ëŠ” ì—러 메시지를 ì—러 메시지 버í¼ì— ì €ìž¥í•œë‹¤. ì—러 코드와 ì—러 ë©”ì‹œì§€ì— ëŒ€í•œ ë‚´ìš©ì€ :ref:`CCI ì—러 코드와 ì—러 메시지 <cci-error-codes>` 를 ì°¸ê³ í•œë‹¤. :param err_code: (IN) ì—러 코드 :param msg_buf: (OUT) ì—러 메시지 ë²„í¼ :param msg_buf_size: (IN) *msg_buf* í¬ê¸° :return: 0 (성공), -1 (실패) note:: CUBRID 9.1 부터는 err_bufê°€ 있는 ëª¨ë“ í•¨ìˆ˜ì—서 err_bufì— ê°’ì´ ì €ìž¥ë˜ëŠ” ê²ƒì„ ë³´ìž¥í•˜ë¯€ë¡œ err_buf ì¸ìžê°€ 있는 함수ì—서는 cci_get_err_msg 함수를 ì‚¬ìš©í• í•„ìš”ê°€ 없으며, :c:func:`cci_get_error_msg` 함수를 ì‚¬ìš©í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. .. code-block:: c req = cci_prepare (con, query, 0, &err_buf); if (req < 0) { printf ("error: %d, %s\n", err_buf.err_code, err_buf.err_msg); goto handle_error; } 9.1 미만 ë²„ì „ì—서는 CCI_ER_DBMS ì—러가 ë°œìƒí–ˆì„ 때만 err_bufì— ì—러 ì •ë³´ê°€ ì €ìž¥ë˜ë¯€ë¡œ CCI_ER_DBMSì— ë”°ë¼ ë‹¤ìŒê³¼ ê°™ì´ ë¶„ê¸°í•˜ì—¬ 처리해야 했다. .. code-block:: c req = cci_prepare (con, query, 0, &err_buf); if (req < 0) { if (req == CCI_ER_DBMS) { printf ("error: %s\n", err_buf.err_msg); } else { char msg_buf[1024]; cci_get_err_msg(req, msg_buf, 1024); printf ("error: %s\n", msg_buf); } goto handle_error; } 9.1 ë²„ì „ë¶€í„°ëŠ” cci_get_error_msg 함수를 사용하여 ìœ„ì˜ ë¶„ê¸° 코드를 ë‹¨ìˆœí™”í• ìˆ˜ 있다. .. code-block:: c req = cci_prepare (con, query, 0, &err_buf); if (req < 0) { char msg_buf[1024]; cci_get_error_msg(req, err_buf, msg_buf, 1024); printf ("error: %s\n", msg_buf); goto handle_error; } cci_get_error_msg ----------------- .. c:function:: int cci_get_error_msg(int err_code, T_CCI_ERROR *err_buf, char *msg_buf, int msg_buf_size) CCI ì—러 ì½”ë“œì— ëŒ€ì‘ë˜ëŠ” ì—러 메시지를 ì—러 메시지 버í¼ì— ì €ìž¥í•œë‹¤. CCI ì—러 ì½”ë“œì˜ ê°’ì´ **CCI_ER_DBMS** ì´ë©´ ë°ì´í„°ë² ì´ìФ 서버ì—서 ë°œìƒí•œ ì—러 메시지를 ë°ì´í„°ë² ì´ìФ ì—러 버í¼(*err_buf*)ì—서 ì „ë‹¬ë°›ì•„ 메시지 버í¼(*msg_buf*)ì— ì €ìž¥í•œë‹¤. ì—러 코드와 ì—러 ë©”ì‹œì§€ì— ëŒ€í•œ ë‚´ìš©ì€ :ref:`CCI ì—러 코드와 ì—러 메시지 <cci-error-codes>`\를 ì°¸ê³ í•œë‹¤. :param err_code: (IN) ì—러 코드 :param err_buf: (IN) ë°ì´í„°ë² ì´ìФ ì—러 ë²„í¼ :param msg_buf: (OUT) ì—러 메시지 ë²„í¼ :param msg_buf_size: (IN) *msg_buf* í¬ê¸° :return: 0 (성공), -1 (실패) cci_get_holdability ------------------- .. c:function:: int cci_get_holdability(int conn_handle) ì—°ê²° 핸들ì—서 ê²°ê³¼ ì…‹ì— ëŒ€í•œ 커서 ìœ ì§€(cursor holdability) ì„¤ì • ê°’ì„ ë¦¬í„´í•œë‹¤. ê°’ì´ 1ì´ë©´ 커밋 ì—¬ë¶€ì— ê´€ê³„ ì—†ì´ ì—°ê²°ì´ ì¢…ë£Œë˜ê±°ë‚˜ ê²°ê³¼ ì…‹ì„ ì˜ë„ì 으로 닫기 ì „ê¹Œì§€ 커서를 ìœ ì§€(holdable)í•˜ê³ , 0ì´ë©´ 커밋ë 때 ê²°ê³¼ ì…‹ì´ ë‹«ížˆë©´ì„œ 커서를 ìœ ì§€í•˜ì§€ 않는다(not holdable). 커서 ìœ ì§€ì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ CUBRID SQL 설명서 > 트랜ìžì…˜ê³¼ ìž ê¸ˆ > 커서 ìœ ì§€ë¥¼ ì°¸ê³ í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :return: 0 (not holdable), 1 (holdable) * **CCI_ER_CON_HANDLE** cci_get_last_insert_id ---------------------- .. c:function:: int cci_get_last_insert_id(int conn_handle, void *value, T_CCI_ERROR *err_buf) 가장 ë§ˆì§€ë§‰ì— ìˆ˜í–‰í•œ INSERT ë¬¸ì˜ ê¸°ë³¸ 키 ê°’ì„ ì–»ëŠ”ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param value: (OUT) ê²°ê³¼ ë²„í¼ í¬ì¸í„°ì˜ í¬ì¸í„°(char \*\*). 가장 ë§ˆì§€ë§‰ì— ìˆ˜í–‰í•œ INSERT ë¬¸ì˜ ê¸°ë³¸ 키 ê°’ì„ ì €ìž¥. ì´ í¬ì¸í„°ê°€ 가리키는 메모리는 ì—°ê²° 핸들 ë‚´ë¶€ì˜ ê³ ì •ëœ ë²„í¼ë¡œ 별ë„로 í•´ì œí• í•„ìš”ê°€ 없다. :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** * **CCI_ER_INVALID_ARGS** .. code-block:: c #include <stdio.h> #include "cas_cci.h" int main () { int con = 0; int req = 0; int error; T_CCI_ERROR cci_error; char *query = "insert into t1 values(NULL);"; char *value = NULL; con = cci_connect ("localhost", 33000, "demodb", "dba", ""); if (con < 0) { printf ("con error\n"); return; } req = cci_prepare (con, query, 0, &cci_error); if (req < 0) { printf ("cci_prepare error: %d\n", req); printf ("cci_error: %d, %s\n", cci_error.err_code, cci_error.err_msg); return; } error = cci_execute (req, 0, 0, &cci_error); if (error < 0) { printf ("cci_execute error: %d\n", error); return; } error = cci_get_last_insert_id (con, &value, &cci_error); if (error < 0) { printf ("cci_get_last_insert_id error: %d\n", error); return; } printf ("## last insert id: %s\n", value); error = cci_close_req_handle (req); error = cci_disconnect (con, &cci_error); return 0; } cci_get_login_timeout --------------------- .. c:function:: int cci_get_login_timeout(int conn_handle, int *timeout, T_CCI_ERROR *err_buf) ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒ ê°’ì„ *timeout*\ ì— ë°˜í™˜í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param timeout: (OUT) ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒ ê°’(단위: 밀리 ì´ˆ)ì— ëŒ€í•œ í¬ì¸í„° :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_INVALID_ARGS** * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** cci_get_query_plan ------------------ .. c:function:: int cci_get_query_plan(int req_handle, char **out_buf_p) cci_prepare 함수가 리턴한 ìš”ì² í•¸ë“¤(req_handle)ì— ëŒ€í•œ ì§ˆì˜ ê³„íšì„ ê²°ê³¼ 버í¼ì— ì¶œë ¥í•œë‹¤. cci_execute í•¨ìˆ˜ì˜ í˜¸ì¶œ 여부와 ìƒê´€ ì—†ì´ cci_get_query_plan 함수를 í˜¸ì¶œí• ìˆ˜ 있다. cci_get_query_plan 함수 호출 후 ê²°ê³¼ 버í¼ì˜ ì‚¬ìš©ì´ ë나면 :c:func:`cci_query_info_free` 함수를 ì´ìš©í•˜ì—¬ cci_get_query_plan 함수ì—서 ìƒì„±ëœ ê²°ê³¼ 버í¼ë¥¼ í•´ì œí•´ì•¼ 한다. :: char *out_buf; ... req = cci_prepare (con, query, 0, &cci_error); ... ret = cci_get_query_plan(req, &out_buf); ... printf("plan = %s", out_buf); cci_query_info_free(out_buf); :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param out_buf_p: (OUT) ê²°ê³¼ ë²„í¼ í¬ì¸í„°ì˜ í¬ì¸í„° :return: ì—러 코드 * **CCI_ER_REQ_HANDLE** * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** .. seealso:: :c:func:`cci_query_info_free` cci_query_info_free ------------------- .. c:function:: int cci_query_info_free(char *out_buf) cci_get_query_plan 함수ì—서 í• ë‹¹ëœ ê²°ê³¼ ë²„í¼ ë©”ëª¨ë¦¬ë¥¼ í•´ì œí•œë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param out_buf: (OUT) ê²°ê³¼ ë²„í¼ í¬ì¸í„° :return: ì—러 코드 * **CCI_ER_NO_MORE_MEMORY** .. seealso:: :c:func:`cci_get_query_plan` cci_get_query_timeout --------------------- .. c:function:: int cci_get_query_timeout (int req_handle) ì§ˆì˜ ìˆ˜í–‰ì— ëŒ€í•´ ì„¤ì •ëœ íƒ€ìž„ì•„ì›ƒ ì‹œê°„ì„ ë°˜í™˜í•œë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :return: 현재 ìš”ì² í•¸ë“¤ì— ì„¤ì •ëœ ì œí•œ 시간(timeout) ê°’. 단위는 msec * CCI_ER_REQ_HANDLE cci_get_result_info ------------------- .. c:function:: T_CCI_COL_INFO* cci_get_result_info(int req_handle, T_CCI_CUBRID_STMT *stmt_type, int *num) prepared statementê°€ **SELECT** ì¼ ê²½ìš°, ì´ í•¨ìˆ˜ë¥¼ ì´ìš©í•˜ì—¬ 실행 ê²°ê³¼ì— ëŒ€í•œ 칼럼 ì •ë³´ê°€ ì €ìž¥ë˜ì–´ 있는 **T_CCI_COL_INFO** 구조체를 ê°€ì ¸ì˜¬ 수 있다. **SELECT** 질ì˜ê°€ 아닌 경우, **NULL**\ ì„ ë°˜í™˜í•˜ê³ *num* ê°’ì€ 0ì´ ëœë‹¤. :param req_handle: (IN) prepared statementì— ëŒ€í•œ ìš”ì² í•¸ë“¤ :param stmt_type: (OUT) command 타입 :param num: (OUT) **SELECT** ë¬¸ì˜ ì¹¼ëŸ¼ 개수(*stmt_type* ì´ **CUBRID_STMT_SELECT** ì¼ ê²½ìš°) :return: result info í¬ì¸í„° (성공), **NULL** (실패) **T_CCI_COL_INFO** 구조체ì—서 칼럼 ì •ë³´ë¥¼ ê°€ì ¸ì˜¤ê¸° 위해서 êµ¬ì¡°ì²´ì— ì§ì ‘ ì ‘ê·¼í•´ë„ ë˜ì§€ë§Œ, 다ìŒê³¼ ê°™ì´ ì •ì˜ëœ 매í¬ë¡œë¥¼ ì´ìš©í•˜ì—¬ ì •ë³´ë¥¼ ê°€ì ¸ì˜¬ 수 있다. ê° ë§¤í¬ë¡œì˜ ì¸ìžë¡œ **T_CCI_COL_INFO** êµ¬ì¡°ì²´ì˜ ì£¼ì†Œì™€ 칼럼 ì¸ë±ìŠ¤ê°€ ì§€ì •ë˜ë©°, 매í¬ë¡œëŠ” **SELECT** 질ì˜ì— 대해서만 í˜¸ì¶œí• ìˆ˜ 있다. 매í¬ë¡œì—서 ìž…ë ¥ë°›ëŠ” ê° ì¸ìžì— 대한 ìœ íš¨ì„± 검사가 ì´ë£¨ì–´ì§€ì§€ 않으므로 주ì˜í•œë‹¤. 매í¬ë¡œ 리턴 ê°’ì˜ íƒ€ìž…ì´ char*ì¸ ê²½ìš° 메모리 í¬ì¸í„°ë¥¼ í•´ì œ(free)하지 않아야 한다. +--------------------------------------------+------------------+----------------------+ | 매í¬ë¡œ | 리턴 ê°’ 타입 | ì˜ë¯¸ | +============================================+==================+======================+ | :c:macro:`CCI_GET_RESULT_INFO_TYPE` | **T_CCI_U_TYPE** | ì¹¼ëŸ¼ì˜ type | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_SCALE` | short | ì¹¼ëŸ¼ì˜ scale | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_PRECISION` | int | ì¹¼ëŸ¼ì˜ precision | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_NAME` | char \* | ì¹¼ëŸ¼ì˜ ì´ë¦„ | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_ATTR_NAME` | char \* | ì¹¼ëŸ¼ì˜ ì†ì„± ì´ë¦„ | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_CLASS_NAME` | char \* | ì¹¼ëŸ¼ì˜ í´ëž˜ìФ ì´ë¦„ | +--------------------------------------------+------------------+----------------------+ | :c:macro:`CCI_GET_RESULT_INFO_IS_NON_NULL` | char (0 or 1) | 칼럼ì´NULL ì¸ì§€ 여부 | +--------------------------------------------+------------------+----------------------+ .. code-block:: c col_info = cci_get_result_info (req, &stmt_type, &col_count); if (col_info == NULL) { printf ("get_result_info error\n"); goto handle_error; } for (i = 1; i <= col_count; i++) { printf ("%-12s = %d\n", "type", CCI_GET_RESULT_INFO_TYPE (col_info, i)); printf ("%-12s = %d\n", "scale", CCI_GET_RESULT_INFO_SCALE (col_info, i)); printf ("%-12s = %d\n", "precision", CCI_GET_RESULT_INFO_PRECISION (col_info, i)); printf ("%-12s = %s\n", "name", CCI_GET_RESULT_INFO_NAME (col_info, i)); printf ("%-12s = %s\n", "attr_name", CCI_GET_RESULT_INFO_ATTR_NAME (col_info, i)); printf ("%-12s = %s\n", "class_name", CCI_GET_RESULT_INFO_CLASS_NAME (col_info, i)); printf ("%-12s = %s\n", "is_non_null", CCI_GET_RESULT_INFO_IS_NON_NULL (col_info,i) ? "true" : "false"); } CCI_GET_RESULT_INFO_ATTR_NAME ----------------------------- .. c:macro:: #define CCI_GET_RESULT_INFO_ATTR_NAME(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ ì‹¤ì œ ì†ì„± ì´ë¦„ì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì†ì„± ì´ë¦„ì´ ì—†ëŠ” 경우(ìƒìˆ˜ê°’, 함수 등)는 빈 문ìžì—´ (empty string)ì„ ë°˜í™˜í•œë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. ë°˜í™˜ëœ ë©”ëª¨ë¦¬ í¬ì¸í„°ëŠ” 사용ìžê°€ **free**\ ()를 통해 ì œê±°í• ìˆ˜ 없다. :param res_info: (IN) :c:func:`cci_get_result_info` ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: ì†ì„± ì´ë¦„ (char \*) CCI_GET_RESULT_INFO_CLASS_NAME ------------------------------ .. c:macro:: #define CCI_GET_RESULT_INFO_CLASS_NAME(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ í´ëž˜ìФ ì´ë¦„ì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. ë°˜í™˜ëœ ë©”ëª¨ë¦¬ í¬ì¸í„°ëŠ” 사용ìžê°€ **free**\ ()를 통해 ì œê±°í• ìˆ˜ 없다. ë°˜í™˜ëœ ê°’ì€ **NULL**\ ì„ ê°€ì§ˆ 수 있다. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: í´ëž˜ìФ ì´ë¦„ (char \*) CCI_GET_RESULT_INFO_IS_NON_NULL ------------------------------- .. c:macro:: #define CCI_GET_RESULT_INFO_IS_NON_NULL(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì´ nullableì¸ì§€ì— 대한 ê°’ì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. **SELECT** ë¦¬ìŠ¤íŠ¸ì˜ ì¹¼ëŸ¼ì´ í…Œì´ë¸”ì˜ ì¹¼ëŸ¼ì´ ì•„ë‹Œ 표현ì‹ì¸ 경우 NON_NULL 여부를 알 수 없으므로 CCI_GET_RESULT_INFO_IS_NON_NULL 매í¬ë¡œëŠ” ì¼ê´€ë˜ê²Œ 0ì„ ë°˜í™˜í•œë‹¤. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: 0 : nullable, 1 : non **NULL** CCI_GET_RESULT_INFO_NAME ------------------------ .. c:macro:: #define CCI_GET_RESULT_INFO_NAME(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ ì´ë¦„ì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. ë°˜í™˜ëœ ë©”ëª¨ë¦¬ í¬ì¸í„°ëŠ” 사용ìžê°€ **free**\ ()를 통해 ì œê±°í• ìˆ˜ 없다. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: 칼럼 ì´ë¦„ (char \*) CCI_GET_RESULT_INFO_PRECISION ----------------------------- .. c:macro:: #define CCI_GET_RESULT_INFO_PRECISION(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ precisionì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: precision (int) CCI_GET_RESULT_INFO_SCALE ------------------------- .. c:macro:: #define CCI_GET_RESULT_INFO_SCALE(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ scaleì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: scale (int) CCI_GET_RESULT_INFO_TYPE ------------------------ .. c:macro:: #define CCI_GET_RESULT_INFO_TYPE(T_CCI_COL_INFO* res_info, int index) prepareëœ **SELECT** 리스트ì—서 *index* 번째 ì¹¼ëŸ¼ì˜ íƒ€ìž…ì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *res_info* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. ì–´ë–¤ ì¹¼ëŸ¼ì˜ SET 타입 여부를 확ì¸í•˜ë ¤ë©´ :c:macro:`CCI_IS_SET_TYPE`\ ì„ ì‚¬ìš©í•œë‹¤. :param res_info: (IN) :c:func:`cci_get_result_info`\ ì— ì˜í•œ 칼럼 ì •ë³´ í¬ì¸í„° :param index: (IN) 칼럼 ì¸ë±ìФ :return: 칼럼 타입 (**T_CCI_U_TYPE**) CCI_IS_SET_TYPE --------------- .. c:macro:: #define CCI_IS_SET_TYPE(u_type) *u_type*\ ì´ set typeì¸ì§€ë¥¼ 검사한다. :param u_type: (IN) :return: 1 : set, 0 : not set CCI_IS_MULTISET_TYPE -------------------- .. c:macro:: #define CCI_IS_MULTISET_TYPE(u_type) *u_type*\ ì´ multiset typeì¸ì§€ë¥¼ 검사한다. :param u_type: (IN) :return: 1 : multiset, 0 : not multiset CCI_IS_SEQUENCE_TYPE -------------------- .. c:macro:: #define CCI_IS_SEQUENCE_TYPE(u_type) *u_type*\ ì´ sequence typeì¸ì§€ë¥¼ 검사한다. :param u_type: (IN) :return: 1 : sequence, 0 : not sequence CCI_IS_COLLECTION_TYPE ---------------------- .. c:macro:: #define CCI_IS_COLLECTION_TYPE(u_type) *u_type*\ ì´ collection (set, multiset, sequence) typeì¸ì§€ë¥¼ 검사한다. :param u_type: (IN) :return: 1 : collection (set, multiset, sequence), 0 : not collection cci_get_version --------------- .. c:function:: int cci_get_version(int *major, int *minor, int *patch) CCI ë¼ì´ë¸ŒëŸ¬ë¦¬ì˜ ë²„ì „ì„ ê°€ì ¸ì˜¨ë‹¤. 예를 들어 ë²„ì „ 스트ë§ì´ "9.2.0.0001" ì¸ ê²½ìš°, major ë²„ì „ì€ 9, minor ë²„ì „ì€ 2, patch ë²„ì „ì€ 0ì´ ëœë‹¤. :param major: (OUT) major ë²„ì „ :param minor: (OUT) minor ë²„ì „ :param patch: (OUT) patch ë²„ì „ :return: í•ìƒ 0(성공) .. note:: Linuxìš© CUBRIDì—서는 **strings** ëª…ë ¹ì„ ì´ìš©í•˜ì—¬ CCI ë¼ì´ë¸ŒëŸ¬ë¦¬ 파ì¼ì˜ ë²„ì „ì„ í™•ì¸í• 수 있다 :: $ strings /home/usr1/CUBRID/lib/libcascci.so | grep VERSION VERSION=9.2.0.0001 cci_init -------- .. c:function:: void cci_init() Windowsìš© CCI ì‘ìš© í”„ë¡œê·¸ëž¨ì„ static linking library(.lib)로 컴파ì¼í•˜ëŠ” 경우ì—는 반드시 호출해야 í•˜ê³ , ê·¸ ì´ì™¸ì˜ 경우는 ì´ í•¨ìˆ˜ë¥¼ ì‚¬ìš©í• í•„ìš”ê°€ 없다. cci_is_holdable --------------- .. c:function:: int cci_is_holdable(int req_handle) **cci_is_holdable** 함수는 ìš”ì² í•¸ë“¤ì˜ ì—°ê²° ìœ ì§€(holdable) 가능 여부를 리턴한다. :param req_handle: (IN) prepared statementì— ëŒ€í•œ ìš”ì² í•¸ë“¤ :return: * 1: ì—°ê²° ìœ ì§€ * 0: ì—°ê²° ìœ ì§€ 안 ë¨ * **CCI_ER_REQ_HANDLE** .. seealso:: :c:func:`cci_prepare` cci_is_updatable ---------------- .. c:function:: int cci_is_updatable(int req_handle) :c:func:`cci_prepare`\ 를 수행한 SQL ë¬¸ì´ ì—…ë°ì´íЏ 가능한 ê²°ê³¼ ì…‹ì„ ë§Œë“¤ 수 있는 질ì˜ì¸ì§€(:c:func:`cci_prepare` 수행 시 *flag* ì— **CCI_PREPARE_UPDATABLE** ì´ ì„¤ì •ë˜ì—ˆëŠ”ì§€) 확ì¸í•˜ëŠ” 함수ì´ë‹¤. ì—…ë°ì´íЏ 가능한 질ì˜ì´ë©´ 1ì„ ë°˜í™˜í•œë‹¤. :param req_handle: (IN) prepared statementì— ëŒ€í•œ ìš”ì² í•¸ë“¤ :return: * 1: ì—…ë°ì´íЏ 가능 * 0: ì—…ë°ì´íЏ 불가능 * **CCI_ER_REQ_HANDLE** cci_next_result --------------- .. c:function:: int cci_next_result(int req_handle, T_CCI_ERROR *err_buf) :c:func:`cci_execute` 수행 시 **CCI_EXEC_QUERY_ALL** *flag*\ ê°€ ì„¤ì •ë˜ë©´ 여러 ê°œì˜ ì§ˆì˜ë¥¼ 순서대로 ìˆ˜í–‰í• ìˆ˜ 있게 ëœë‹¤. ì´ë•Œ, 첫 번째 ì§ˆì˜ ê²°ê³¼ëŠ” :c:func:`cci_execute` 함수를 호출한 ë’¤ì— ê°€ì ¸ì˜¤ê³ , ë‘ ë²ˆì§¸ 질ì˜ë¶€í„°ëŠ” **cci_next_result** 함수를 í˜¸ì¶œí• ë•Œë§ˆë‹¤ 질ì˜ë¥¼ 작성한 순서대로 결과를 ê°€ì ¸ì˜¨ë‹¤. ì´ë•Œ ì–»ì€ ì§ˆì˜ ê²°ê³¼ì— ëŒ€í•œ 칼럼 ì •ë³´ëŠ” :c:func:`cci_execute` 함수 ë˜ëŠ” **cci_next_result** 함수를 í˜¸ì¶œí• ë•Œë§ˆë‹¤ :c:func:`cci_get_result_info` 함수를 호출하면 ëœë‹¤. 즉, Q1, Q2, Q3 ì§ˆì˜ ì—¬ëŸ¬ 개를 한 ë²ˆì˜ :c:func:`cci_prepare` í˜¸ì¶œì„ í†µí•´ ìˆ˜í–‰í• ê²½ìš° Q1ì˜ ê²°ê³¼ëŠ” :c:func:`cci_execute` 함수를 í˜¸ì¶œí• ë•Œ ê°€ì ¸ì˜¤ë©°, Q2, Q3ì˜ ê²°ê³¼ëŠ” **cci_next_result** 함수를 ê°ê° 호출하여 ê°€ì ¸ì˜¨ë‹¤. i Q1, Q2, Q3ì˜ ì§ˆì˜ ê²°ê³¼ì— ëŒ€í•œ 칼럼 ì •ë³´ëŠ” 매번 :c:func:`cci_get_result_info` 함수를 호출하여 ê°€ì ¸ì˜¨ë‹¤. .. code-block:: c sql = "SELECT * FROM athlete; SELECT * FROM nation; SELECT * FROM game"; req = cci_prepare (con, sql, 0, &error); ... ret = cci_execute (req, CCI_EXEC_QUERY_ALL, 0, &error); res_col_info = cci_get_result_info (req, &cmd_type, &col_count); ... ret = cci_next_result (req, &error); res_col_info = cci_get_result_info (req, &cmd_type, &col_count); ... ret = cci_next_result (req, &error); res_col_info = cci_get_result_info (req, &cmd_type, &col_count); :param req_handle: (IN) prepared statementì— ëŒ€í•œ ìš”ì² í•¸ë“¤ :param err_buf: (OUT) ì—러 ë²„í¼ :return: * **SELECT** : ê²°ê³¼ 개수 * **INSERT**, **UPDATE** : ë°˜ì˜ëœ ë ˆì½”ë“œ 개수 * 기타 : 0 * 실패 : ì—러 코드 * **CCI_ER_REQ_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** ì—러 코드가 **CAS_ER_NO_MORE_RESULT_SET** ì¼ ê²½ìš° ë” ì´ìƒì˜ ê²°ê³¼ ì…‹ì´ ì¡´ìž¬í•˜ì§€ 않는다는 ê²ƒì„ ì˜ë¯¸í•œë‹¤. cci_oid ------- .. c:function:: int cci_oid(int conn_handle, T_CCI_OID_CMD cmd, char *oid_str, T_CCI_ERROR *err_buf) `cmd` ì¸ìžì˜ ê°’ì— ë”°ë¼ ë‹¤ìŒ ë™ìž‘ì„ ìˆ˜í–‰í•œë‹¤. * CCI_OID_DROP : 해당 oid를 ì‚ì œí•œë‹¤. * CCI_OID_IS_INSTANCE : 해당 oidê°€ instance oidì¸ì§€ë¥¼ 검사한다. * CCI_OID_LOCK_READ : 해당 oidì— ëŒ€í•´ read lock ì„ ì„¤ì •í•œë‹¤. * CCI_OID_LOCK_WRITE : 해당 oidì— ëŒ€í•´ write lockì„ ì„¤ì •í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param cmd: (IN) CCI_OID_DROP, CCI_OID_IS_INSTANCE, CCI_OID_LOCK_READ, CCI_OID_LOCK_WRITE :param oid_str: (IN) oid :param err_buf: (OUT) ì—러 ë²„í¼ :return: * `cmd`\ê°€ CCI_OID_IS_INSTANCEì¸ ê²½ìš° * 0 : ì¸ìŠ¤í„´ìŠ¤ 아님 * 1 : ì¸ìŠ¤í„´ìŠ¤ * < 0 : ì—러 * `cmd`\ê°€ CCI_OID_DROP, CCI_OID_LOCK_READ ë˜ëŠ” CCI_OID_LOCK_WRITEì¸ ê²½ìš° ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OID_CMD** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_oid_get ----------- .. c:function:: int cci_oid_get(int conn_handle, char *oid_str, char **attr_name, T_CCI_ERROR *err_buf) 해당 oidì˜ ì†ì„± ê°’ì„ ê°€ì ¸ì˜¨ë‹¤. *attr_name* ì€ ì†ì„±ì˜ array로서 ë§ˆì§€ë§‰ì€ ë°˜ë“œì‹œ NULL로 ë나야 한다. *attr_name* ì´ NULLì¸ ê²½ìš° ëª¨ë“ ì†ì„±ì— 대한 ì •ë³´ë¥¼ ê°€ì ¸ì˜¨ë‹¤. Request handleì˜ í˜•íƒœëŠ” "SELECT attr_name FROM oid_class WHERE oid_class = oid"ì˜ SQLë¬¸ì„ ì‹¤í–‰í–ˆì„ ë•Œì™€ ë™ì¼í•œ 형태ì´ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param attr_name: (IN) ì†ì„± ëª©ë¡ :param err_buf: (OUT) ì—러 ë²„í¼ :return: 성공 : ìš”ì² í•¸ë“¤, 실패 : ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_CONNECT** cci_oid_get_class_name ---------------------- .. c:function:: int cci_oid_get_class_name(int conn_handle, char *oid_str, char *out_buf, int out_buf_len, T_CCI_ERROR *err_buf) 해당 oidì˜ í´ëž˜ìФ ì´ë¦„ì„ ê°€ì ¸ì˜¨ë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param out_buf: (OUT) out ë²„í¼ :param out_buf_len: (IN) *out_buf* ê¸¸ì´ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_OBJECT** * **CCI_ER_DBMS** cci_oid_put ----------- .. c:function:: int cci_oid_put(int conn_handle, char *oid_str, char **attr_name, char **new_val_str, T_CCI_ERROR *err_buf) 해당 oidì˜ *attr_name* ì†ì„± ê°’ì„ *new_val_str* 으로 ì„¤ì •í•œë‹¤. *attr_name* ì˜ ë§ˆì§€ë§‰ì€ ë°˜ë“œì‹œ NULLì´ì–´ì•¼ 한다. ëª¨ë“ íƒ€ìž…ì˜ ê°’ì€ string으로 표현해야 í•˜ê³ , string으로 í‘œí˜„ëœ ê°’ì€ ì„œë²„ì—서 ì†ì„±ì˜ íƒ€ìž…ì— ë”°ë¼ ë³€í™˜ë˜ì–´ ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ëœë‹¤. NULL ê°’ì„ ë„£ê¸° 위해서는 *new_val_str* [i]ì˜ ê°’ì„ NULL로 한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param oid_str: (IN) oid :param attr_name: (IN) ì†ì„± ì´ë¦„ ëª©ë¡ :param new_val_str: (IN) 새 ê°’ì˜ ëª©ë¡ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** cci_oid_put2 ------------ .. c:function:: int cci_oid_put2(int conn_handle, char *oidstr, char **attr_name, void **new_val, int *a_type, T_CCI_ERROR *err_buf) 해당 oidì˜ *attr_name* ì†ì„± ê°’ì„ *new_val* 로 ì„¤ì •í•œë‹¤. *attr_name* ì˜ ë§ˆì§€ë§‰ì€ ë°˜ë“œì‹œ NULLì´ì–´ì•¼ 한다. NULL ê°’ì„ ë„£ê¸° 위해서는 *new_val* [i]ì˜ ê°’ì„ NULL로 ì§€ì •í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param oidstr: (IN) oid :param attr_name: (IN) ì†ì„± ì´ë¦„ ëª©ë¡ :param new_val: (IN) 새 ê°’ ë°°ì—´ :param a_type: (IN) *new_val* 타입 ë°°ì—´ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** *a_type* ì— ëŒ€í•œ *new_val* [i]ì˜ íƒ€ìž…ì€ ë‹¤ìŒ í‘œì™€ 같다. **a_typeì— ëŒ€í•œ new_val[i]ì˜ íƒ€ìž…** +-----------------------+------------------------------+ | Type | value type | +=======================+==============================+ | **CCI_A_TYPE_STR** | char \*\* | +-----------------------+------------------------------+ | **CCI_A_TYPE_INT** | int \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_FLOAT** | float \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_DOUBLE** | double \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_BIT** | **T_CCI_BIT** \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_SET** | **T_CCI_SET** \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_DATE** | **T_CCI_DATE** \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_BIGINT** | int64_t \* | | | (Windows는 __int64 \*) | +-----------------------+------------------------------+ .. code-block:: c char *attr_name[array_size] void *attr_val[array_size] int a_type[array_size] int int_val ... attr_name[0] = "attr_name0" attr_val[0] = &int_val a_type[0] = CCI_A_TYPE_INT attr_name[1] = "attr_name1" attr_val[1] = "attr_val1" a_type[1] = CCI_A_TYPE_STR ... attr_name[num_attr] = NULL res = cci_put2(con_h, oid_str, attr_name, attr_val, a_type, &error) cci_prepare ----------- .. c:function:: int cci_prepare(int conn_handle, char *sql_stmt, char flag,T_CCI_ERROR *err_buf) SQL ë¬¸ì— ê´€í•œ ìš”ì² í•¸ë“¤ì„ íšë“하여 SQL ì‹¤í–‰ì„ ì¤€ë¹„í•œë‹¤. 단, SQL ë¬¸ì´ ì—¬ëŸ¬ ê°œì˜ ì§ˆì˜ë¡œ êµ¬ì„±ëœ ê²½ìš°, 첫 번째 질ì˜ì— 대해서만 ì‹¤í–‰ì„ ì¤€ë¹„í•œë‹¤. ì´ í•¨ìˆ˜ì˜ ì¸ìžë¡œ ì—°ê²° 핸들, SQL문, *flag* , 오류 ì •ë³´ë¥¼ ì €ìž¥í• **T_CCI_ERROR** 구조체 ë³€ìˆ˜ì˜ ì£¼ì†Œê°€ ì§€ì •ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param sql_stmt: (IN) SQL 문 :param flag: (IN) prepare flag (CCI_PREPARE_UPDATABLE, CCI_PREPARE_INCLUDE_OID, CCI_PREPARE_HOLDABLE ë˜ëŠ” CCI_PREPARE_CALL) :param err_buf: (OUT) ì—러 ë²„í¼ :return: 성공 : ìš”ì² í•¸ë“¤ ID , 실패 : ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_STR_PARAM** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_CONNECT** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_LOGIN_TIMEOUT** *flag* ì— **CCI_PREPARE_UPDATABLE**, **CCI_PREPARE_INCLUDE_OID**, **CCI_PREPARE_HOLDABLE** ë˜ëŠ” **CCI_PREPARE_CALL** ì´ ì„¤ì •ë 수 있다. *flag*\ì— **CCI_PREPARE_UPDATABLE**\ì´ ì„¤ì •ë˜ë©´ ê°±ì‹ ê°€ëŠ¥í•œ ê²°ê³¼ ì…‹(updatable resultset)ì„ ë§Œë“¤ 수 있으며, ì´ ê²½ìš° **CCI_PREPARE_INCLUDE_OID**\는 ìžë™ ì„¤ì •ëœë‹¤. *flag*\ì— **CCI_PREPARE_UPDATABLE**\ê³¼ **CCI_PREPARE_HOLDABLE**\ì„ ë™ì‹œì— ì‚¬ìš©í• ìˆ˜ 없다. ìžë°” ì €ìž¥ 함수를 í˜¸ì¶œí•˜ê³ ì‹¶ìœ¼ë©´ **flag**\ì— **CCI_PREPARE_CALL**\ì„ ì„¤ì •í•œë‹¤. ìžë°” ì €ìž¥ 함수와 ê´€ë ¨ëœ ì˜ˆëŠ” :c:func:`cci_register_out_param` 함수를 ì°¸ê³ í•œë‹¤. 커밋 ì´í›„ ê²°ê³¼ ì…‹ ìœ ì§€ ì—¬ë¶€ì— ëŒ€í•œ ì„¤ì •ì˜ ê¸°ë³¸ê°’ì€ ì»¤ì„œ ìœ ì§€ì´ë‹¤. ë”°ë¼ì„œ :c:func:`cci_prepare`\ì˜ *flag*\ì— **CCI_PREPARE_UPDATABLE**\ì„ ì„¤ì •í•˜ê³ ì‹¶ìœ¼ë©´ :c:func:`cci_prepare`\를 호출하기 ì „ì— :c:func:`cci_set_holdability`\ì„ í˜¸ì¶œí•˜ì—¬ 커서를 ìœ ì§€í•˜ì§€ 않ë„ë¡ ì„¤ì •í•´ì•¼ 한다. **CCI_PREPARE_UPDATABLE** ì´ ì„¤ì •ë˜ë”ë¼ë„ ëª¨ë“ ì§ˆì˜ì— 대해 ê°±ì‹ ê°€ëŠ¥í•œ 결과를 만들 수 있는 ê²ƒì€ ì•„ë‹ˆë¯€ë¡œ SQL ë¬¸ì„ prepare한 후 :c:func:`cci_is_updatable` 함수를 ì´ìš©í•˜ì—¬ ê°±ì‹ ê°€ëŠ¥í•œ 결과를 만들 수 있는 질ì˜ì¸ì§€ 확ì¸í•´ì•¼ 한다. ê²°ê³¼ ì…‹ì„ ê°±ì‹ í•˜ë ¤ë©´ :c:func:`cci_oid_put` 함수 ë˜ëŠ” :c:func:`cci_oid_put2` 함수를 ì‚¬ìš©í• ìˆ˜ 있다. ê°±ì‹ ê°€ëŠ¥í•œ 질ì˜ì˜ ì¡°ê±´ì€ ë‹¤ìŒê³¼ 같다. * **SELECT** 질ì˜ì—¬ì•¼ 한다. * ì§ˆì˜ ê²°ê³¼ì— OIDê°€ í¬í•¨ë 수 있는 질ì˜ì—¬ì•¼ 한다. * ê°±ì‹ í•˜ê³ ìž í•˜ëŠ” ì¹¼ëŸ¼ì´ **FROM** ì ˆì— ëª…ì‹œí•œ í…Œì´ë¸”ì— ì†í•œ 칼럼ì´ì–´ì•¼ 한다. 커밋 ì´í›„ ê²°ê³¼ ì…‹ ìœ ì§€ì— ëŒ€í•œ ì„¤ì •ê°’ì´ ê¸°ë³¸ê°’ì¸ ì»¤ì„œ ìœ ì§€ì´ê±°ë‚˜ **CCI_PREPARE_HOLDABLE** ì´ ì„¤ì •ëœ ì±„ë¡œ prepareë˜ì—ˆìœ¼ë©´ 해당 문장(statement)ì— ëŒ€í•´ ê²°ê³¼ ì…‹ì„ ë‹«ê±°ë‚˜ ì—°ê²°ì„ ì¢…ë£Œí•˜ì§€ 않는 한 커밋 ì´í›„ì—ë„ ì»¤ì„œê°€ ìœ ì§€ëœë‹¤(:ref:`cursor-holding` ì°¸ê³ ). cci_prepare_and_execute ----------------------- .. c:function:: int cci_prepare_and_execute(int conn_handle, char *sql_stmt, int max_col_size, int *exec_retval, T_CCI_ERROR *err_buf) SQL ë¬¸ì„ ì¦‰ì‹œ ì‹¤í–‰í•˜ê³ SQL ë¬¸ì— ëŒ€í•œ ìš”ì² í•¸ë“¤ì„ ë°˜í™˜í•œë‹¤. ì´ í•¨ìˆ˜ì˜ ì¸ìžë¡œëŠ” ì—°ê²° 핸들, SQL 문, fetch하는 ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´, ì—러 코드, 오류 ì •ë³´ë¥¼ ì €ìž¥í• **T_CCI_ERROR** 구조체 ë³€ìˆ˜ì˜ ì£¼ì†Œê°€ ì§€ì •ëœë‹¤. *max_col_size* 는 SQL ë¬¸ì˜ ì¹¼ëŸ¼ì´ **CHAR**, **VARCHAR**, **BIT**, **VARBIT** ì¼ ê²½ìš° í´ë¼ì´ì–¸íŠ¸ë¡œ ì „ì†¡ë˜ëŠ” ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´ë¥¼ ì„¤ì •í•˜ê¸° 위한 ê°’ì´ë©°, ì´ ê°’ì´ 0ì´ë©´ ì „ì²´ 길ì´ë¥¼ fetch한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param sql_stmt: (IN) SQL 문 :param max_col_size: (IN) 문ìžì—´ íƒ€ìž…ì¸ ê²½ìš° fetch하는 ì¹¼ëŸ¼ì˜ ë¬¸ìžì—´ 최대 길ì´(단위: ë°”ì´íЏ). ì´ ê°’ì´ 0ì´ë©´ ì „ì²´ 길ì´ë¥¼ fetch한다. :param exec_retval: (OUT) 성공: ì˜í–¥ì„ ë°›ì€ í–‰ì˜ ê°œìˆ˜, 실패: ì—러 코드 :param err_buf: (OUT) ì—러 ë²„í¼ :return: 성공 : ìš”ì² í•¸ë“¤ ID, 실패 : ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_STR_PARAM** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_CONNECT** * **CCI_ER_QUERY_TIMEOUT** cci_property_create ------------------- .. c:function:: T_CCI_PROPERTIES * cci_property_create () CCIì˜ DATASOURCE를 ì„¤ì •í•˜ê¸° 위한 **T_CCI_PROPERTIES** 구조체를 ìƒì„±í•œë‹¤. :return: 성공: 메모리가 í• ë‹¹ëœ **T_CCI_PROPERTIES** 구조체 í¬ì¸í„°, 실패 : **NULL** .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release` cci_property_destroy -------------------- .. c:function:: void cci_property_destroy (T_CCI_PROPERTIES * properties) **T_CCI_PROPERTIES** 구조체를 ì‚ì œí•œë‹¤. :param properties: ì‚ì œí• **T_CCI_PROPERTIES** 구조체 í¬ì¸í„° .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release` cci_property_get ---------------- .. c:function:: char * cci_property_get (T_CCI_PROPERTIES * properties, char *key) **T_CCI_PROPERTIES** êµ¬ì¡°ì²´ì— ì„¤ì •ëœ ì†ì„±ê°’ì„ ì¡°íšŒí•œë‹¤. :param properties: *key* ì— ëŒ€ì‘하는 value를 ê°€ì ¸ì˜¬ **T_CCI_PROPERTIES** 구조체 í¬ì¸í„° :param key: ì¡°íšŒí• ì†ì„± ì´ë¦„(ì„¤ì •í• ìˆ˜ 있는 ì†ì„±ì˜ ì´ë¦„ê³¼ ì˜ë¯¸ëŠ” :c:func:`cci_property_set` 함수 ì°¸ê³ ) :return: 성공: *key* ì— ëŒ€ì‘하는 value 문ìžì—´ì˜ í¬ì¸í„°, 실패: NULL .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release` cci_property_set ---------------- .. c:function:: int cci_property_set (T_CCI_PROPERTIES *properties, char *key, char *value) **T_CCI_PROPERTIES** êµ¬ì¡°ì²´ì— ì†ì„± ê°’ì„ ì„¤ì •í•œë‹¤. :param properties: *key* 와 *value* 를 ì €ìž¥í• **T_CCI_PROPERTIES** 구조체 í¬ì¸í„° :param key: ì†ì„± ì´ë¦„ì˜ ë¬¸ìžì—´ í¬ì¸í„° :param value: ì†ì„± ê°’ì˜ ë¬¸ìžì—´ í¬ì¸í„° :return: 성공: 1, 실패: 0 êµ¬ì¡°ì²´ì— ì„¤ì •í• ìˆ˜ 있는 ì†ì„±ì˜ ì´ë¦„ ë° ì˜ë¯¸ëŠ” 다ìŒê³¼ 같다. ============================= =========== =============================================== ========================================================================================================== ì†ì„± ì´ë¦„ 타입 기본값 ì˜ë¯¸ ============================= =========== =============================================== ========================================================================================================== user string DB ì‚¬ìš©ìž ì´ë¦„ password string DB ì‚¬ìš©ìž ì•”í˜¸ url string ì—°ê²° URL. ì—°ê²° URL 문ìžì—´ì„ ì •ì˜í•˜ëŠ” ë°©ë²•ì€ :c:func:`cci_connect_with_url` ì°¸ê³ pool_size int 10 ì—°ê²° í’€ì´ ê°€ì§ˆ 수 있는 최대 ì—°ê²° 개수 max_pool_size int pool_size 최초 datasource ìƒì„± 시 ìƒì„±í• ì „ì²´ ì—°ê²° 개수. ìµœëŒ€ê°’ì€ INT_MAX max_wait msec 1000 ì—°ê²°ì„ ê°€ì ¸ì˜¤ê¸° 위해 대기하는 최대 시간 pool_prepared_statement bool false statement í’€ë§ ê°€ëŠ¥ 여부. true ë˜ëŠ” false max_open_prepared_statement int 1000 statement poolì— ìœ ì§€í• prepared statementì˜ ìµœëŒ€ 개수 login_timeout msec 0(ë¬´ì œí•œ) :c:func:`cci_datasource_create`\ 함수로 datasource를 ìƒì„±í•˜ê±°ë‚˜ prepare/execute 함수ì—서 ë‚´ë¶€ì ì¸ ìž¬ì ‘ì†ì´ ë°œìƒí• 때마다 ì ìš©ë˜ëŠ” ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒ 시간 query_timeout msec 0(ë¬´ì œí•œ) ì§ˆì˜ íƒ€ìž„ì•„ì›ƒ 시간 disconnect_on_query_timeout bool no ì§ˆì˜ ì‹¤í–‰ì´ íƒ€ìž„ì•„ì›ƒ ì‹œê°„ì„ ì´ˆê³¼í•˜ì—¬ ì‹¤í–‰ì´ ì·¨ì†Œë 때 ì—°ê²°ì˜ ì¢…ë£Œ 여부. yes ë˜ëŠ” no default_autocommit bool cubrid_broker.confì˜ CCI_DEFAULT_AUTOCOMMIT ê°’ :c:func:`cci_datasource_create`\ 함수로 datasource를 ìƒì„±í• 때 ì„¤ì •ë˜ëŠ” ìžë™ 커밋 모드. true ë˜ëŠ” false default_isolation string cubrid.confì˜ isolation_level ê°’ :c:func:`cci_datasource_create`\ 함수로 datasource를 ìƒì„±í• 때 ì„¤ì •ë˜ëŠ” 트랜ìžì…˜ 격리 수준. 아래 표 ì°¸ê³ default_lock_timeout msec cubrid.confì˜ lock_timeout ê°’ :c:func:`cci_datasource_create`\ 함수로 datasource를 ìƒì„±í• 때 ì„¤ì •ë˜ëŠ” ìž ê¸ˆ 타임아웃 ============================= =========== =============================================== ========================================================================================================== prepared statementì˜ ê°œìˆ˜ê°€ **max_open_prepared_statement** ê°’ì„ ì´ˆê³¼í•˜ë©´ 가장 ì˜¤ëž˜ëœ prepared statementê°€ statement poolì—서 í•´ì œë˜ë©°, 추후 í•´ì œëœ prepared statementê°€ 재사용ë˜ë©´ 다시 statement poolì— ì¶”ê°€ëœë‹¤. í•˜ë‚˜ì˜ ì—°ê²° í’€ì´ ê°€ì§ˆ 수 있는 ì—°ê²° 개수는 í•„ìš” 시 :c:func:`cci_datasource_change_property`\ 를 통해 ê°’ì„ ë³€ê²½í• ìˆ˜ 있지만, max_pool_size를 ì´ˆê³¼í• ìˆ˜ 없다. ì—°ê²° ê°œìˆ˜ì˜ ì œí•œì„ ì¡°ì ˆí•˜ê³ ìž í• ë•Œ ì´ ê°’ì„ ë³€ê²½í• ìˆ˜ 있다. 예를 들어 í‰ì†Œì—는 max_pool_size보다 작게 ì„¤ì •í•´ì„œ 사용하다가 기대 ì´ìƒìœ¼ë¡œ ë§Žì€ ì—°ê²°ì´ í•„ìš”í•´ì§ˆ 때 ê°’ì„ ë†’ì´ê³ , ë§Žì€ ì—°ê²°ì´ í•„ìš”í•˜ì§€ 않으면 ê°’ì„ ë‹¤ì‹œ 줄ì¸ë‹¤. ì—°ê²° í’€ì´ ê°€ì§ˆ 수 있는 ì—°ê²° 개수는 pool_size까지 ì œí•œë˜ëŠ”ë°, pool_size는 최대 max_pool_size까지 변경ë 수 있다. **login_timeout**, **default_autocommit**, **default_isolation**, **default_lock_timeout**\ ì˜ ê°’ì„ ì„¤ì •í•˜ë©´ :c:func:`cci_datasource_borrow`\ 를 í˜¸ì¶œí• ë•Œ ì´ ì„¤ì • ê°’ì„ ê°€ì§€ê³ ì—°ê²°ì„ ë°˜í™˜í•œë‹¤. **login_timeout**, **default_autocommit**, **default_isolation**, **default_lock_timeout**\ ì€ :c:func:`cci_datasource_borrow` 함수 호출 ì´í›„ì—ë„ ë³€ê²½í• ìˆ˜ 있다. :c:func:`cci_set_login_timeout`, :c:func:`cci_set_autocommit`, :c:func:`cci_set_isolation_level`, :c:func:`cci_set_lock_timeout`\ ì„ ì°¸ê³ í•œë‹¤. ì´ë¦„ì´ **cci_set_**\ 으로 시작하는 í•¨ìˆ˜ë“¤ì— ì˜í•´ ë³€ê²½ëœ ê°’ì€ ë³€ê²½í•œ ì—°ê²° ê°ì²´ì—ë§Œ ì ìš©ë˜ë©°, ì—°ê²°ì´ í•´ì œëœ ì´í›„ì—는 :c:func:`cci_property_set`\ 으로 ì„¤ì •í•œ 값으로 ë³µì›ëœë‹¤. :c:func:`cci_property_set`\ 으로 ì„¤ì •í•œ ê°’ì´ ì—†ì„ ê²½ìš°ì—는 기본값으로 ë³µì›ëœë‹¤. .. note:: * :c:func:`cci_property_set` 함수와 URL 문ìžì—´ì—서 ë™ì‹œì— ì†ì„± ê°’ì„ ëª…ì‹œí•˜ëŠ” 경우, :c:func:`cci_property_set` 함수ì—서 ì •ì˜í•œ 값으로 ì ìš©ëœë‹¤. * **login_timeout**\ì€ DATASOURCE ê°ì²´ë¥¼ ìƒì„±í•˜ëŠ” 경우와 :c:func:`cci_prepare` ë˜ëŠ” :c:func:`cci_execute` 함수ì—서 ë‚´ë¶€ì ì¸ ìž¬ì ‘ì†ì´ ë°œìƒí•˜ëŠ” ê²½ìš°ì— ì ìš©ëœë‹¤. ë‚´ë¶€ì ì¸ ìž¬ì ‘ì†ì€ DATASOURCEì—서 ì—°ê²° ê°ì²´ë¥¼ ì–»ì€ ê²½ìš°ì™€ :c:func:`cci_connect`/:c:func:`cci_connect_with_url` 함수로 ì—°ê²° ê°ì²´ë¥¼ ì–»ì€ ê²½ìš°ì—서 ëª¨ë‘ ë°œìƒí•œë‹¤. * DATASOURCE ê°ì²´ë¥¼ ìƒì„±í•˜ëŠ” ì‹œê°„ì€ ë‚´ë¶€ì ì¸ ìž¬ì ‘ì† ì‹œê°„ë³´ë‹¤ 오래 걸릴 수 있으므로, ë‘ ê°€ì§€ ê²½ìš°ì˜ **login_timeout**\ ì„ ë‹¤ë¥´ê²Œ ì 용하는 ê²ƒì„ ê°ì•ˆí• 수 있다. 예를 들어, ì „ìžì˜ 경우를 5000(5ì´ˆ), 후ìžì˜ 경우를 2000(2ì´ˆ)로 ì„¤ì •í•˜ê³ ì‹¶ë‹¤ë©´, 후ìžì˜ ì„¤ì •ì„ ìœ„í•´ DATASOURCE ìƒì„± 후 :c:func:`cci_set_login_timeout` 함수를 사용한다. .. CUBRIDSUS-12567 ì°¸ê³ **default_isolation**\ ì€ ë‹¤ìŒ ê°’ 중 í•˜ë‚˜ì˜ ì„¤ì •ê°’ì„ ê°€ì§€ë©°, 격리 ìˆ˜ì¤€ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`set-transaction-isolation-level`\ ì„ ì°¸ì¡°í•œë‹¤. +----------------------------+---------------------------------------+ | isolation_level | Configuration Value | +============================+=======================================+ | SERIALIZABLE | "TRAN_SERIALIZABLE" | +----------------------------+---------------------------------------+ | REPEATABLE READ | "TRAN_REP_READ" | +----------------------------+---------------------------------------+ | READ COMMITTED | "TRAN_READ_COMMITTED" | +----------------------------+---------------------------------------+ DB ì‚¬ìš©ìž ì´ë¦„ê³¼ 암호는 **user** 와 **password** ê°’ì„ ì§ì ‘ ì§€ì •í•˜ê±°ë‚˜ **url** ì†ì„± ë‚´ì—서 **user** 와 **password** ê°’ì„ ì§€ì •í•œë‹¤. ë‘ ê°€ì§€ 경우가 ê°™ì´ ì‚¬ìš©ë˜ëŠ” 경우 ìš°ì„ ìˆœìœ„ëŠ” 다ìŒê³¼ 같다. The following shows how to work as the first priority if both are specified. * 둘 다 ìž…ë ¥ë˜ë©´ ì§ì ‘ ì§€ì •í•˜ëŠ” ê°’ì´ ìš°ì„ í•œë‹¤. * 둘 중 하나가 NULLì´ë©´ NULLì´ ì•„ë‹Œ ê°’ì´ ì‚¬ìš©ëœë‹¤. * 둘 다 NULLì´ë©´ NULL 값으로 사용ëœë‹¤. * DB 사용ìžë¥¼ ì§ì ‘ ì§€ì •í•œ ê°’ì´ NULLì´ë©´ "public", 암호를 ì§ì ‘ ì§€ì •í•œ ê°’ì´ NULLì´ë©´ NULL로 ì„¤ì •ëœë‹¤. * 암호를 ì§ì ‘ ì§€ì •í•œ ê°’ì´ NULLì´ë©´ URLì˜ ì„¤ì •ì„ ë”°ë¥¸ë‹¤. ë‹¤ìŒ ì˜ˆì œì—서 DB ì‚¬ìš©ìž ì´ë¦„ì€ "dba", 암호는 "cubridpwd" ê°€ ëœë‹¤. :: cci_property_set(ps, "user", "dba"); cci_property_set(ps, "password", "cubridpwd"); ... cci_property_set(ps, "url", "cci:cubrid:192.168.0.1:33000:demodb:dba:mypwd:?logSlowQueries=true&slowQueryThresholdMillis=1000&logTraceApi=true&logTraceNetwork=true"); .. seealso:: :c:func:`cci_property_create`, :c:func:`cci_property_destroy`, :c:func:`cci_property_get`, :c:func:`cci_property_set`, :c:func:`cci_datasource_create`, :c:func:`cci_datasource_destroy`, :c:func:`cci_datasource_release` cci_query_result_free --------------------- .. c:function:: int cci_query_result_free(T_CCI_QUERY_RESULT* query_result, int num_query) :c:func:`cci_execute_batch`, :c:func:`cci_execute_array` ë˜ëŠ” :c:func:`cci_execute_result` í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ëœ ì§ˆì˜ ê²°ê³¼ë¥¼ 메모리ì—서 í•´ì œí•œë‹¤. :param query_result: (IN) 메모리ì—서 í•´ì œí• ì§ˆì˜ ê²°ê³¼ :param num_query: (IN) *query_result* ì˜ array 개수 :return: 0: 성공 .. code-block:: c T_CCI_QUERY_RESULT *qr; char **sql_stmt; ... res = cci_execute_array(conn, &qr, &err_buf); ... cci_query_result_free(qr, res); CCI_QUERY_RESULT_ERR_NO ----------------------- .. c:macro:: #define CCI_QUERY_RESULT_ERR_NO(T_CCI_QUERY_RESULT* query_result, int index) :c:func:`cci_execute_batch`, :c:func:`cci_execute_array`, ë˜ëŠ” :c:func:`cci_execute_result` í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ëœ ì§ˆì˜ ê²°ê³¼ëŠ” **T_CCI_QUERY_RESULT** íƒ€ìž…ì˜ ë°°ì—´ë¡œ ì €ìž¥ë˜ë¯€ë¡œ ë°°ì—´ì˜ í•목 별로 ì§ˆì˜ ê²°ê³¼ë¥¼ 확ì¸í•´ì•¼ 한다. **CCI_QUERY_RESULT_ERR_NO**\는 *index*\로 ì§€ì •í•œ ë°°ì—´ í•ëª©ì— ëŒ€í•œ ì—러 번호를 ê°€ì ¸ì˜¤ë©°, ì—러가 아닌 경우 0ì„ ë°˜í™˜í•œë‹¤. :param query_result: (IN) ì¡°íšŒí• ì§ˆì˜ ê²°ê³¼ :param index: (IN) ê²°ê³¼ ë°°ì—´ì˜ ì¸ë±ìФ(base : 1). ê²°ê³¼ ë°°ì—´ 중 íŠ¹ì • 위치를 나타냄. :return: ì—러 번호 CCI_QUERY_RESULT_ERR_MSG ------------------------ .. c:macro:: #define CCI_QUERY_RESULT_ERR_MSG(T_CCI_QUERY_RESULT* query_result, int index) :c:func:`cci_execute_batch`, :c:func:`cci_execute_array` ë˜ëŠ” :c:func:`cci_execute_result` í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ëœ ì§ˆì˜ ê²°ê³¼ì— ëŒ€í•œ ì—러 메시지를 ê°€ì ¸ì˜¤ë©°, ì—러 메시지가 ì—†ì„ ê²½ìš° ""(empty string)ì„ ë°˜í™˜í•˜ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *query_result* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. :param query_result: (IN) ì¡°íšŒí• ì§ˆì˜ ê²°ê³¼ :param index: (IN) 칼럼 ì¸ë±ìФ(base : 1) :return: ì—러 메시지 CCI_QUERY_RESULT_RESULT ----------------------- .. c:macro:: #define CCI_QUERY_RESULT_RESULT(T_CCI_QUERY_RESULT* query_result, int index) :c:func:`cci_execute_batch`, :c:func:`cci_execute_array` ë˜ëŠ” :c:func:`cci_execute_result` í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ëœ ì§ˆì˜ ê²°ê³¼ì— ëŒ€í•œ result count를 ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *query_result* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. :param query_result: (IN) ì¡°íšŒí• ì§ˆì˜ ê²°ê³¼ :param index: (IN) 칼럼 ì¸ë±ìФ(base : 1) :return: result count CCI_QUERY_RESULT_STMT_TYPE -------------------------- .. c:macro:: #define CCI_QUERY_RESULT_STMT_TYPE(T_CCI_QUERY_RESULT* query_result, int index) :c:func:`cci_execute_batch`, :c:func:`cci_execute_array` ë˜ëŠ” :c:func:`cci_execute_result` í•¨ìˆ˜ì— ì˜í•´ ìˆ˜í–‰ëœ ì§ˆì˜ ê²°ê³¼ëŠ” **T_CCI_QUERY_RESULT** íƒ€ìž…ì˜ ë°°ì—´ë¡œ ì €ìž¥ë˜ë¯€ë¡œ ë°°ì—´ì˜ í•목 별로 ì§ˆì˜ ê²°ê³¼ë¥¼ 확ì¸í•´ì•¼ 한다. **CCI_QUERY_RESULT_STMT_TYPE**\ì€ index로 ì§€ì •í•œ ë°°ì—´ í•ëª©ì— ëŒ€í•œ statement typeì„ ê°€ì ¸ì˜¤ëŠ” 매í¬ë¡œì´ë‹¤. ì§€ì •ëœ ì¸ìž *query_result* ê°€ **NULL** ì¸ì§€, *index* ê°€ ìœ íš¨í•œì§€ì— ëŒ€í•œ 검사는 하지 않는다. :param query_result: (IN) ì¡°íšŒí• ì§ˆì˜ ê²°ê³¼ :param index: (IN) 칼럼 ì¸ë±ìФ(base : 1) :return: statement type (**T_CCI_CUBRID_STMT**) cci_register_out_param ---------------------- .. c:function:: int cci_register_out_param(int req_handle, int index) ìžë°” ì €ìž¥ í”„ë¡œì‹œì €ì—서 아웃 ë°”ì¸ë“œë¡œ ì •ì˜í•œ 파ë¼ë¯¸í„°ë¥¼ ë°”ì¸ë”©í•˜ê¸° 위해 사용하며, index는 1부터 시작한다. ì´ í•¨ìˆ˜ë¥¼ 호출하기 ì „ì— cci_prepare í•¨ìˆ˜ì˜ í”Œëž˜ê·¸ì— **CCI_PREPARE_CALL**\ ì„ ì„¤ì •í•´ì•¼ 한다. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :return: ì—러 코드 * **CCI_ER_BIND_INDEX** * **CCI_ER_REQ_HANDLE** * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** 다ìŒì€ "Hello, CUBRID"ë¼ëŠ” 문ìžì—´ì„ ì¶œë ¥í•˜ëŠ” ìžë°” ì €ìž¥ í”„ë¡œì‹œì €ì˜ ì˜ˆì´ë‹¤. ë¨¼ì € cubrid.confì— ìžˆëŠ” java_stored_procedure 파ë¼ë¯¸í„°ì˜ ê°’ì„ yes로 ì„¤ì •í•˜ê³ , ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 구ë™í•œë‹¤. :: $ vi cubrid.conf java_stored_procedure=yes $ cubrid service start $ cubrid server start demodb ìžë°” ì €ìž¥ í”„ë¡œì‹œì €ë¡œ 등ë¡í• í´ëž˜ìŠ¤ë¥¼ êµ¬í˜„í•˜ê³ ì»´íŒŒì¼í•œë‹¤. .. code-block:: java public class SpCubrid{ public static void outTest(String[] o) { o[0] = "Hello, CUBRID"; } } %javac SpCubrid.java 컴파ì¼ëœ ìžë°” í´ëž˜ìŠ¤ë¥¼ CUBRID로 로딩한다. :: $ loadjava demodb SpCubrid.class 로딩한 Java í´ëž˜ìŠ¤ë¥¼ 등ë¡í•œë‹¤. .. code-block:: sql -- csql> CREATE PROCEDURE test_out(x OUT STRING) AS LANGUAGE JAVA NAME 'SpCubrid.outTest(java.lang.String[] o)'; CCI ì‘ìš© 프로그램ì—서 cci_prepare í•¨ìˆ˜ì˜ í”Œëž˜ê·¸ì— CCI_PREPARE_CALLì„ ì§€ì •í•˜ê³ , cci_register_out_param 함수로 아웃 ë°”ì¸ë“œ 파ë¼ë¯¸í„° 위치를 ì§€ì •í•œ 후 실행 결과를 페치하여 ê°€ì ¸ì˜¨ë‹¤. .. code-block:: c // On Linux, compile with "gcc -g -o jsp jsp.c -I$CUBRID/include/ -L$CUBRID/lib/ -lcascci -lpthread" #include <stdio.h> #include <unistd.h> #include <cas_cci.h> char *cci_client_name = "test"; int main (int argc, char *argv[]) { int con = 0, req = 0, res, ind, i, col_count; T_CCI_ERROR error; T_CCI_COL_INFO *res_col_info; T_CCI_CUBRID_STMT cmd_type; char *buffer, db_ver[16]; if ((con = cci_connect ("localhost", 33000, "demodb", "dba", "")) < 0) { printf ("%s(%d): cci_connect fail\n", __FILE__, __LINE__); return -1; } if ((req = cci_prepare (con, "call test_out(?)", CCI_PREPARE_CALL, &error)) < 0) { printf ("%s(%d): cci_prepare fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } if ((res = cci_register_out_param (req, 1)) < 0) { printf ("%s(%d): cci_register_out_param fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } if ((res = cci_execute (req, 0, 0, &error)) < 0) { printf ("%s(%d): cci_execute fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } res = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &error); if (res == CCI_ER_NO_MORE_DATA) { printf ("%s(%d): cci_cursor fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } if ((res = cci_fetch (req, &error) < 0)) { printf ("%s(%d): cci_fetch(%d, %s)\n", __FILE__, __LINE__, error.err_code, error.err_msg); goto handle_error; } if ((res = cci_get_data (req, 1, CCI_A_TYPE_STR, &buffer, &ind)) < 0) { printf ("%s(%d): cci_get_data fail\n", __FILE__, __LINE__); goto handle_error; } // ind: string length, buffer: a string which came from the out binding parameter of test_out(?) Java SP. if (ind != -1) printf ("%d, (%s)\n", ind, buffer); else // if ind== -1, then data is NULL printf ("NULL\n"); if ((res = cci_close_query_result (req, &error)) < 0) { printf ("%s(%d): cci_close_query_result fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } if ((res = cci_close_req_handle (req)) < 0) { printf ("%s(%d): cci_close_req_handle fail\n", __FILE__, __LINE__); goto handle_error; } if ((res = cci_disconnect (con, &error)) < 0) { printf ("%s(%d): cci_disconnect fail(%d)\n", __FILE__, __LINE__, error.err_code); goto handle_error; } printf ("Program ended!\n"); return 0; handle_error: if (req > 0) cci_close_req_handle (req); if (con > 0) cci_disconnect (con, &error); printf ("Program failed!\n"); return -1; } .. seealso:: :c:func:`cci_prepare` cci_row_count ------------- .. c:function:: int cci_row_count(int conn_handle, int *row_count, T_CCI_ERROR * err_buf) 가장 최근 수행한 질ì˜ì— ì˜í•´ ì˜í–¥ì„ ë°›ì€ í–‰ì˜ ê°œìˆ˜ë¥¼ 얻는다. :param conn_handle: (IN) ì—°ê²° 핸들 :param row_count: (OUT) 가장 최근 수행한 질ì˜ì— ì˜í•´ ì˜í–¥ì„ ë°›ì€ í–‰ì˜ ê°œìˆ˜ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_COMMUNICATION** * **CCI_ER_LOGIN_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_DBMS** cci_savepoint ------------- .. c:function:: int cci_savepoint(int conn_handle, T_CCI_SAVEPOINT_CMD cmd, char* savepoint_name, T_CCI_ERROR *err_buf) 세ì´ë¸Œí¬ì¸íŠ¸ë¥¼ ì„¤ì •í•˜ê±°ë‚˜ ì„¤ì •ëœ ì„¸ì´ë¸Œí¬ì¸íŠ¸ë¡œ 트랜ìžì…˜ ë¡¤ë°±ì„ ìˆ˜í–‰í•œë‹¤. *cmd* ê°€ **CCI_SP_SET** 로 ì§€ì •ë˜ë©´ 세ì´ë¸Œí¬ì¸íŠ¸ë¥¼ ì„¤ì •í•˜ê³ , **CCI_SP_ROLLBACK** ì¸ ê²½ìš° ì„¤ì •ëœ ì„¸ì´ë¸Œí¬ì¸íŠ¸ê¹Œì§€ 트랜ìžì…˜ì„ 롤백한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param cmd: (IN) **CCI_SP_SET** ë˜ëŠ” **CCI_SP_ROLLBACK** :param savepoint_name: (IN) 세ì´ë¸Œí¬ì¸íЏ ì´ë¦„ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_COMMUNICATION** * **CCI_ER_QUERY_TIMEOUT** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_DBMS** .. code-block:: c con = cci_connect( ... ); ... /* query execute */ /* "savepoint1"ì´ëž€ ì´ë¦„ì˜ ì„¸ì´ë¸Œí¬ì¸íЏ ì„¤ì • */ cci_savepoint(con, CCI_SP_SET, "savepoint1", err_buf); ... /* query execute */ /* ì„¤ì •ëœ ì„¸ì´ë¸Œí¬ì¸íЏ "savepoint1"로 롤백 */ cci_savepoint(con, CCI_SP_ROLLBACK, "savepoint1", err_buf); cci_schema_info --------------- .. c:function:: int cci_schema_info(int conn_handle, T_CCI_SCHEMA_TYPE type, char *class_name, char *attr_name, char flag, T_CCI_ERROR *err_buf) 스키마 ì •ë³´ë¥¼ ì½ì–´ì˜¨ë‹¤. 성공ì 으로 수행ë˜ì—ˆì„ 경우 결과는 request handleì— ì˜í•´ 관리ë˜ê³ , fetch, getdata를 통해서 결과를 ê°€ì ¸ì˜¬ 수 있다. *class_name*, *attr_name* ì„ **LIKE** ì ˆì˜ íŒ¨í„´ 매ì¹ì— ì˜í•´ì„œ 검색해야 í• ê²½ìš° *flag* 를 ì„¤ì •í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param type: (IN) 스키마 타입 :param class_name: (IN) í´ëž˜ìФ ì´ë¦„ ë˜ëŠ” NULL :param attr_name: (IN) ì†ì„± ì´ë¦„ ë˜ëŠ” NULL :param flag: (IN) 패턴 ë§¤ì¹ flag(**CCI_CLASS_NAME_PATTERN_MATCH** ë˜ëŠ” **CCI_ATTR_NAME_PATTERN_MATCH)** :param err_buf: (OUT) ì—러 ë²„í¼ :return: 성공 : ìš”ì² í•¸ë“¤, 실패 : ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_CONNECT** **CCI_CLASS_NAME_PATTERN_MATCH**, **CCI_ATTR_NAME_PATTERN_MATCH** ë‘ ê°œì˜ *flag* ê°€ 사용ë˜ë©°, OR ì—°ì‚°ìž( | )로 둘 다 ì„¤ì •í• ìˆ˜ 있다. 패턴 매ì¹ì„ ì‚¬ìš©í• ê²½ìš° **LIKE** ì ˆì„ ì´ìš©í•˜ì—¬ 검색한다. 예를 들어, *class_name* ì´ "athlete"ì´ê³ *attr_name* ì´ "code"로 ë나는 ì¹¼ëŸ¼ì— ëŒ€í•œ ì •ë³´ë¥¼ ê²€ìƒ‰í•˜ê³ ì‹¶ë‹¤ë©´, *attr_name* ì˜ ê°’ì„ "%code"로 하여 다ìŒê³¼ ê°™ì´ ìž…ë ¥í• ìˆ˜ 있다. :: cci_schema_info(conn, CCI_SCH_ATTRIBUTE, "athlete", "%code", CCI_ATTR_NAME_PATTERN_MATCH, &error); ê° *type* ì— ëŒ€í•œ ë ˆì½”ë“œì˜ êµ¬ì„±ì€ ì•„ëž˜ 표와 같다. **íƒ€ìž…ì— ëŒ€í•œ ë ˆì½”ë“œ 구성** +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | 타입 | 칼럼 순서 | 칼럼 ì´ë¦„ | 칼럼 타입 | +====================================================================================================================+==================+====================+=====================+ | CCI_SCH_CLASS | 1 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | TYPE | short | | | | | | | | | | * 0: system class | | | | | * 1: vclass | | | | | * 2: class | | | | | * 3: proxy | | +------------------+--------------------+---------------------+ | | 3 | REMARKS | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_VCLASS | 1 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | TYPE | short | | | | | | | | | | * 1: vclass | | | | | * 3: proxy | | +------------------+--------------------+---------------------+ | | 3 | REMARKS | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_QUERY_SPEC | 1 | QUERY_SPEC | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_ATTRIBUTE | 1 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | DOMAIN | short | | +------------------+--------------------+---------------------+ | | 3 | SCALE | short | | +------------------+--------------------+---------------------+ | | 4 | PRECISION | int | | +------------------+--------------------+---------------------+ | | 5 | INDEXED | short | | | | | | | | | | 1: indexed | | +------------------+--------------------+---------------------+ | | 6 | NON_NULL | short | | | | | | | | | | 1: non null | | +------------------+--------------------+---------------------+ | | 7 | SHARED | short | | | | | | | | | | 1: shared | | +------------------+--------------------+---------------------+ | | 8 | UNIQUE | short | | | | | | | | | | 1: unique | | +------------------+--------------------+---------------------+ | | 9 | DEFAULT | char \* | | +------------------+--------------------+---------------------+ | | 10 | ATTR_ORDER | int | | | | | | | | | | base = 1 | | +------------------+--------------------+---------------------+ | | 11 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 12 | SOURCE_CLASS | char \* | | +------------------+--------------------+---------------------+ | | 13 | IS_KEY | short | | | | | | | | | | 1: key | | +------------------+--------------------+---------------------+ | | 14 | REMARKS | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_CLASS_ATTRIBUTE | | | | | | | | | | | CCI_SCH_CLASS_ATTRIBUTE ì»¬ëŸ¼ì´ INSTANCE ë˜ëŠ” SHAREDì˜ ì†ì„±ì¼ ê²½ìš°ì— | | | | | | 순서와 ì´ë¦„ ê°’ì€ CCI_SCH_ATTRIBUTEì˜ ì»¬ëŸ¼ê³¼ ë™ì¼í•˜ë‹¤. | | | | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_CLASS_METHOD | 1 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | RET_DOMAIN | short | | +------------------+--------------------+---------------------+ | | 3 | ARG_DOMAIN | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_METHOD_FILE | 1 | METHOD_FILE | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_SUPERCLASS | 1 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | TYPE | short | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_SUBCLASS | 1 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | TYPE | short | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_CONSTRAINT | 1 | TYPE | short | | | | | | | | | | * 0: unique | | | | | * 1: index | | | | | * 2: reverse unique | | | | | * 3: reverse index | | +------------------+--------------------+---------------------+ | | 2 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 3 | ATTR_NAME | char \* | | +------------------+--------------------+---------------------+ | | 4 | NUM_PAGES | int | | +------------------+--------------------+---------------------+ | | 5 | NUM_KEYS | int | | +------------------+--------------------+---------------------+ | | 6 | PRIMARY_KEY | short | | | | | | | | | | * 1: primary key | | +------------------+--------------------+---------------------+ | | 7 | KEY_ORDER | short | | | | | | | | | | base = 1 | | +------------------+--------------------+---------------------+ | | 8 | ASC_DESC | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_TRIGGER | 1 | NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | STATUS | char \* | | +------------------+--------------------+---------------------+ | | 3 | EVENT | char \* | | +------------------+--------------------+---------------------+ | | 4 | TARGET_CLASS | char \* | | +------------------+--------------------+---------------------+ | | 5 | TARGET_ATTR | char \* | | +------------------+--------------------+---------------------+ | | 6 | ACTION_TIME | char \* | | +------------------+--------------------+---------------------+ | | 7 | ACTION | char \* | | +------------------+--------------------+---------------------+ | | 8 | PRIORITY | float | | +------------------+--------------------+---------------------+ | | 9 | CONDITION_TIME | char \* | | +------------------+--------------------+---------------------+ | | 10 | CONDITION | char \* | | +------------------+--------------------+---------------------+ | | 11 | REMARKS | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_CLASS_PRIVILEGE | 1 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | PRIVILEGE | char \* | | +------------------+--------------------+---------------------+ | | 3 | GRANTABLE | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_ATTR_PRIVILEGE | 1 | ATTR_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | PRIVILEGE | char \* | | +------------------+--------------------+---------------------+ | | 3 | GRANTABLE | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_DIRECT_SUPER_CLASS | 1 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | SUPER_CLASS_NAME | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_PRIMARY_KEY | 1 | CLASS_NAME | char \* | | +------------------+--------------------+---------------------+ | | 2 | ATTR_NAME | char \* | | +------------------+--------------------+---------------------+ | | 3 | KEY_SEQ | int | | | | | | | | | | base = 1 | | +------------------+--------------------+---------------------+ | | 4 | KEY_NAME | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_IMPORTED_KEYS | 1 | PKTABLE_NAME | char \* | | | | | | | | 주어진 í…Œì´ë¸”ì˜ ì™¸ëž˜ 키 ì¹¼ëŸ¼ë“¤ì´ ì°¸ì¡°í•˜ê³ ìžˆëŠ” 기본 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회하며 | | | | | | 결과는 PKTABLE_NAME ë° KEY_SEQ 순서로 ì •ë ¬ëœë‹¤. | | | | | | | | | | | ì´ íƒ€ìž…ì„ ì¸ìžë¡œ ì§€ì •í•˜ë©´, *class_name*\ ì—는 외래 키 í…Œì´ë¸”, | | | | | | *attr_name*\ ì—는 **NULL**\ ì„ ì§€ì •í•œë‹¤. | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+--------------------+---------------------+ | | 2 | PKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 3 | FKTABLE_NAME | char \* | | +------------------+--------------------+---------------------+ | | 4 | FKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 5 | KEY_SEQ | short | | +------------------+--------------------+---------------------+ | | 6 | UPDATE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 7 | DELETE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 8 | FK_NAME | char \* | | +------------------+--------------------+---------------------+ | | 9 | PK_NAME | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_EXPORTED_KEYS | 1 | PKTABLE_NAME | char \* | | | | | | | | 주어진 í…Œì´ë¸”ì˜ ê¸°ë³¸ 키 ì¹¼ëŸ¼ë“¤ì„ ì°¸ì¡°í•˜ëŠ” ëª¨ë“ ì™¸ëž˜ 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회하며, | | | | | | 결과는 FKTABLE_NAME ë° KEY_SEQ 순서로 ì •ë ¬ëœë‹¤. | | | | | | ì´ íƒ€ìž…ì„ ì¸ìžë¡œ ì§€ì •í•˜ë©´, *class_name*\ ì—는 기본 키 í…Œì´ë¸”, | | | | | | *attr_name*\ ì—는 **NULL**\ ì„ ì§€ì •í•œë‹¤. | | | | | | | | | | | | | | | | | | | | | | | | | +------------------+--------------------+---------------------+ | | 2 | PKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 3 | FKTABLE_NAME | char \* | | +------------------+--------------------+---------------------+ | | 4 | FKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 5 | KEY_SEQ | short | | +------------------+--------------------+---------------------+ | | 6 | UPDATE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 7 | DELETE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 8 | FK_NAME | char \* | | +------------------+--------------------+---------------------+ | | 9 | PK_NAME | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ | CCI_SCH_CROSS_REFERENCE | 1 | PKTABLE_NAME | char \* | | | | | | | | 주어진 í…Œì´ë¸”ì˜ ê¸°ë³¸ 키와 주어진 í…Œì´ë¸”ì˜ ì™¸ëž˜ 키가 ìƒí˜¸ 참조하는 경우, | | | | | | 해당 외래 키 ì¹¼ëŸ¼ë“¤ì˜ ì •ë³´ë¥¼ 조회하며, 결과는 FKTABLE_NAME ë° KEY_SEQ 순서로 ì •ë ¬ëœë‹¤. | | | | | | ì´ íƒ€ìž…ì„ ì¸ìžë¡œ *class_name*\ ì—는 기본 키 í…Œì´ë¸”, | | | | | | *attr_name* ì—는 외래 키 í…Œì´ë¸”ì„ ì§€ì •í•œë‹¤. | | | | | | | | | | | | | | | | | | | | +------------------+--------------------+---------------------+ | | 2 | PKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 3 | FKTABLE_NAME | char \* | | +------------------+--------------------+---------------------+ | | 4 | FKCOLUMN_NAME | char \* | | +------------------+--------------------+---------------------+ | | 5 | KEY_SEQ | short | | +------------------+--------------------+---------------------+ | | 6 | UPDATE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 7 | DELETE_ACTION | short | | | | | | | | | | * 0: cascade | | | | | * 1: restrict | | | | | * 2: no action | | | | | * 3: set null | | +------------------+--------------------+---------------------+ | | 8 | FK_NAME | char \* | | +------------------+--------------------+---------------------+ | | 9 | PK_NAME | char \* | +--------------------------------------------------------------------------------------------------------------------+------------------+--------------------+---------------------+ :c:func:`cci_schema_info` 함수ì—서 ì¸ìž *type* ì€ ì¸ìž *class_name*, *attr_name* ì— ëŒ€í•´ **LIKE** ì ˆì˜ íŒ¨í„´ 매ì¹ì„ ì§€ì›í•œë‹¤. **패턴 매ì¹ì„ ì§€ì›í•˜ëŠ” type ë° class_name(í…Œì´ë¸” ì´ë¦„), attr_name(칼럼 ì´ë¦„) ìž…ë ¥** +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | type | class_name | attr_name | +=====================================+===================+===============================================================================+ | CCI_SCH_CLASS (VCLASS) | 문ìžì—´ ë˜ëŠ” NULL | í•ìƒ NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | CCI_SCH_ATTRIBUTE (CLASS ATTRIBUTE) | 문ìžì—´ ë˜ëŠ” NULL | 문ìžì—´ ë˜ëŠ” NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | CCI_SCH_CLASS_PRIVILEGE | 문ìžì—´ ë˜ëŠ” NULL | í•ìƒ NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | CCI_SCH_ATTR_PRIVILEGE | í•ìƒ NULL | 문ìžì—´ ë˜ëŠ” NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | CCI_SCH_PRIMARY_KEY | 문ìžì—´ ë˜ëŠ” NULL | í•ìƒ NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ | CCI_SCH_TRIGGER | 문ìžì—´ ë˜ëŠ” NULL | í•ìƒ NULL | +-------------------------------------+-------------------+-------------------------------------------------------------------------------+ * class_nameì´ "í•ìƒ NULL"ì¸ typeì€ í…Œì´ë¸” ì´ë¦„ì— ëŒ€í•´ 패턴 매ì¹ì„ ì§€ì›í•˜ì§€ 않는다. * attr_nameì´ "í•ìƒ NULL"ì¸ typeì€ ì¹¼ëŸ¼ ì´ë¦„ì— ëŒ€í•´ 패턴 매ì¹ì„ ì§€ì›í•˜ì§€ 않는다. * 패턴 *flag* ê°€ ì„¤ì •ë˜ì§€ ì•Šì„ ê²½ìš° 주어진 í…Œì´ë¸” ì´ë¦„ ë˜ëŠ” 칼럼 ì´ë¦„ì€ ë™ë“± ì¡°ê±´(=) 매ì¹ì„ 사용하므로 **NULL** ì´ ì£¼ì–´ì§€ë©´ 결과는 없다. * 패턴 *flag* ê°€ ì„¤ì •ë˜ì–´ ìžˆì„ ê²½ìš° í…Œì´ë¸” ì´ë¦„ ë˜ëŠ” 칼럼 ì´ë¦„ì´ **NULL**\ì´ë©´ **LIKE** ì ˆì˜ "%"와 ë™ì¼í•œ ê²°ê³¼, 즉 ëª¨ë“ í…Œì´ë¸” ë˜ëŠ” ì¹¼ëŸ¼ì— ëŒ€í•œ 결과를 얻는다. .. note:: **CCI_SCH_CLASS**, **CCI_SCH_VCLASS** ì˜ TYPE 칼럼 : proxy íƒ€ìž…ì´ ì¶”ê°€ë¨. OLEDB, ODBC, PHPì—서 ì‚¬ìš©í• ê²½ìš° proxy와 vclass를 구분하지 ì•Šê³ vclass로 ë³´ìž„. .. code-block:: c // gcc -o schema_info schema_info.c -m64 -I${CUBRID}/include -lnsl ${CUBRID}/lib/libcascci.so -lpthread #include <stdio.h> #include <stdlib.h> #include <string.h> #include "cas_cci.h" int main () { int conn = 0, req = 0, col_count = 0, res = 0, i, ind; char *data, query_result_buffer[1024]; T_CCI_ERROR cci_error; T_CCI_COL_INFO *col_info; T_CCI_CUBRID_STMT cmd_type; conn = cci_connect ("localhost", 33000, "demodb", "dba", ""); // get all columns' information of table "athlete" // req = cci_schema_info(conn, CCI_SCH_ATTRIBUTE, "athlete", "code", 0, &cci_error); req = cci_schema_info (conn, CCI_SCH_ATTRIBUTE, "athlete", NULL, CCI_ATTR_NAME_PATTERN_MATCH, &cci_error); if (req < 0) { fprintf (stdout, "(%s, %d) ERROR : %s [%d] \n\n", __FILE__, __LINE__, cci_error.err_msg, cci_error.err_code); goto _END; } col_info = cci_get_result_info (req, &cmd_type, &col_count); if (!col_info && col_count == 0) { fprintf (stdout, "(%s, %d) ERROR : cci_get_result_info\n\n", __FILE__, __LINE__); goto _END; } res = cci_cursor (req, 1, CCI_CURSOR_FIRST, &cci_error); if (res == CCI_ER_NO_MORE_DATA) { goto _END; } if (res < 0) { fprintf (stdout, "(%s, %d) ERROR : %s [%d] \n\n", __FILE__, __LINE__, cci_error.err_msg, cci_error.err_code); goto _END; } while (1) { res = cci_fetch (req, &cci_error); if (res < 0) { fprintf (stdout, "(%s, %d) ERROR : %s [%d] \n\n", __FILE__, __LINE__, cci_error.err_msg, cci_error.err_code); goto _END; } for (i = 1; i <= col_count; i++) { if ((res = cci_get_data (req, i, CCI_A_TYPE_STR, &data, &ind)) < 0) { goto _END; } if (ind != -1) { strcat (query_result_buffer, data); strcat (query_result_buffer, "|"); } else { strcat (query_result_buffer, "NULL|"); } } strcat (query_result_buffer, "\n"); res = cci_cursor (req, 1, CCI_CURSOR_CURRENT, &cci_error); if (res == CCI_ER_NO_MORE_DATA) { goto _END; } if (res < 0) { fprintf (stdout, "(%s, %d) ERROR : %s [%d] \n\n", __FILE__, __LINE__, cci_error.err_msg, cci_error.err_code); goto _END; } } _END: if (req > 0) cci_close_req_handle (req); if (conn > 0) res = cci_disconnect (conn, &cci_error); if (res < 0) fprintf (stdout, "(%s, %d) ERROR : %s [%d] \n\n", __FILE__, __LINE__, cci_error.err_msg, cci_error.err_code); fprintf (stdout, "Result : %s\n", query_result_buffer); return 0; } cci_set_allocators ------------------ .. c:function:: int cci_set_allocators(CCI_MALLOC_FUNCTION malloc_func, CCI_FREE_FUNCTION free_func, CCI_REALLOC_FUNCTION realloc_func, CCI_CALLOC_FUNCTION calloc_func) 사용ìžê°€ ì •ì˜í•œ 메모리 í• ë‹¹ ë° í•´ì œ í•¨ìˆ˜ë“¤ì„ ë“±ë¡í•˜ì—¬ ì‚¬ìš©í• ìˆ˜ 있게 한다. ì´ í•¨ìˆ˜ë¥¼ 실행하면 CCI API ë‚´ë¶€ì—서 사용ë˜ëŠ” ëª¨ë“ ë©”ëª¨ë¦¬ í• ë‹¹ ë° í•´ì œ ìž‘ì—…ì€ ì‚¬ìš©ìžê°€ ì •ì˜í•œ 메모리 í• ë‹¹ í•¨ìˆ˜ë“¤ì„ ì‚¬ìš©í•˜ê²Œ ëœë‹¤. ì´ë¥¼ 사용하지 않으면 기본ì ì¸ ì‹œìŠ¤í…œ 함수들(malloc, free, realloc, calloc)ì´ ì‚¬ìš©ëœë‹¤. .. note:: ì´ í•¨ìˆ˜ëŠ” Linux ì „ìš©ìœ¼ë¡œ, Windowsì—서는 ì‚¬ìš©í• ìˆ˜ 없다. :param malloc_func: (IN) mallocì— í•´ë‹¹í•˜ëŠ” 외부 ì •ì˜ í•¨ìˆ˜ì— ëŒ€í•œ í¬ì¸í„° :param free_func: (IN) freeì— í•´ë‹¹í•˜ëŠ” 외부 ì •ì˜ í•¨ìˆ˜ì— ëŒ€í•œ í¬ì¸í„° :param realloc_func: (IN) reallocì— í•´ë‹¹í•˜ëŠ” 외부 ì •ì˜ í•¨ìˆ˜ì— ëŒ€í•œ í¬ì¸í„° :param calloc_func: callocì— í•´ë‹¹í•˜ëŠ” 외부 ì •ì˜ í•¨ìˆ˜ì— ëŒ€í•œ í¬ì¸í„° :return: ì—러 코드(0: 성공) * **CCI_ER_NOT_IMPLEMENTED** .. code-block:: c /* How to build: gcc -Wall -g -o test_cci test_cci.c -I${CUBRID}/include -L${CUBRID}/lib -lcascci */ #include <stdio.h> #include <stdlib.h> #include "cas_cci.h" void *my_malloc(size_t size) { printf ("my malloc: size: %ld\n", size); return malloc (size); } void *my_calloc(size_t nm, size_t size) { printf ("my calloc: nm: %ld, size: %ld\n", nm, size); return calloc (nm, size); } void *my_realloc(void *ptr, size_t size) { printf ("my realloc: ptr: %p, size: %ld\n", ptr, size); return realloc (ptr, size); } void my_free(void *ptr) { printf ("my free: ptr: %p\n", ptr); return free (ptr); } int test_simple (int con) { int req = 0, col_count = 0, i, ind; int error; char *data; T_CCI_ERROR cci_error; T_CCI_COL_INFO *col_info; T_CCI_CUBRID_STMT stmt_type; char *query = "select * from db_class"; //preparing the SQL statement req = cci_prepare (con, query, 0, &cci_error); if (req < 0) { printf ("prepare error: %d, %s\n", 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, &stmt_type, &col_count); if (col_info == NULL) { printf ("get_result_info error\n"); goto handle_error; } //Executing the prepared SQL statement error = cci_execute (req, 0, 0, &cci_error); if (error < 0) { printf ("execute error: %d, %s\n", 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\n", 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\n", 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\n", error, i); goto handle_error; } printf ("%s\t|", data); } printf ("\n"); } //Closing the query result error = cci_close_query_result(req, &cci_error); if (error < 0) { printf ("cci_close_query_result error: %d, %s\n", cci_error.err_code, cci_error.err_msg); goto handle_error; } //Closing the request handle error = cci_close_req_handle(req); if (error < 0) { printf ("cci_close_req_handle error\n"); goto handle_error; } //Disconnecting with the server error = cci_disconnect (con, &cci_error); if (error < 0) { printf ("cci_disconnect error: %d, %s\n", 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; } int main() { int con = 0; if (cci_set_allocators (my_malloc, my_free, my_realloc, my_calloc) != 0) { printf ("cannot register allocators\n"); return 1; }; //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\n"); return 1; } test_simple (con); return 0; } cci_set_autocommit ------------------ .. c:function:: int cci_set_autocommit (int conn_handle, CCI_AUTOCOMMIT_MODE autocommit_mode) 현재 ë°ì´í„°ë² ì´ìФ ì—°ê²°ì˜ ìžë™ 커밋 모드 여부를 ì„¤ì •í•œë‹¤. ì´ í•¨ìˆ˜ëŠ” ìžë™ 커밋 모드를 ì„¤ì •í•˜ê±°ë‚˜ í•´ì œí•˜ëŠ” ë°ì—ë§Œ 사용ë˜ë©°, ì´ í•¨ìˆ˜ë¥¼ 호출하면 ì§„í–‰ 중ì´ë˜ 트랜ìžì…˜ì€ 모드 ì„¤ì •ê³¼ ìƒê´€ì—†ì´ 커밋ëœë‹¤. .. note:: **cubrid_broker.conf**\ ì˜ :ref:`CCI_DEFAULT_AUTOCOMMIT <cci_default_autocommit>`\ ì€ í”„ë¡œê·¸ëž¨ 시작 ì‹œì˜ ê¸°ë³¸ ìžë™ 커밋 모드를 ì„¤ì •í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param autocommit_mode: (IN) ìžë™ 커밋모드 ì„¤ì •. CCI_AUTOCOMMIT_FALSE ë˜ëŠ” CCI_AUTOCOMMIT_TRUE 중 í•˜ë‚˜ì˜ ê°’ì„ ê°€ì§„ë‹¤. :return: ì—러 코드(0: 성공) .. note:: **CCI_DEFAULT_AUTOCOMMIT**, a broker parameter configured in the **cubrid_broker.conf** file, determines whether it is in auto-commit mode upon program startup. cci_set_db_parameter --------------------- .. c:function:: int cci_set_db_parameter(int conn_handle, T_CCI_DB_PARAM param_name, void* value, T_CCI_ERROR *err_buf) 시스템 파ë¼ë¯¸í„°ë¥¼ ì„¤ì •í•œë‹¤. ì„¤ì •í• ìˆ˜ 있는 *param_name* ì€ :c:func:`cci_get_db_parameter`\ 를 참조한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param param_name: (IN) 시스템 파ë¼ë¯¸í„° ì´ë¦„ :param value: (IN) 파ë¼ë¯¸í„° ê°’ :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_PARAM_NAME** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** cci_set_element_type -------------------- .. c:function:: int cci_set_element_type(T_CCI_SET set) **T_CCI_SET** 타입 ê°’ì˜ ì—˜ë¦¬ë¨¼íŠ¸ íƒ€ìž…ì„ ê°€ì ¸ì˜¨ë‹¤. :param set: (IN) cci set í¬ì¸í„° :return: 타입 cci_set_free ------------ .. c:function:: void cci_set_free(T_CCI_SET set) :c:func:`cci_get_data`\ ì— ëŒ€í•´ **CCI_A_TYPE_SET** ì— ì˜í•´ ê°€ì ¸ì˜¨ **T_CCI_SET** 타입 ê°’ì— í• ë‹¹ëœ ë©”ëª¨ë¦¬ë¥¼ ì œê±°í•œë‹¤. **T_CCI_SET** 타입 ê°’ì€ :c:func:`cci_get_data` 함수를 통해 ê°€ì ¸ì˜¤ê±°ë‚˜ :c:func:`cci_set_make` 함수를 통해 ìƒì„±í• 수 있다. :param set: (IN) cci set í¬ì¸í„° cci_set_get ----------- .. c:function:: int cci_set_get(T_CCI_SET set, int index, T_CCI_A_TYPE a_type, void *value, int *indicator) **T_CCI_SET** 타입 ê°’ì— ëŒ€í•´ *index* ë²ˆì§¸ì˜ ë°ì´í„°ë¥¼ ê°€ì ¸ì˜¨ë‹¤. :param set: (IN) cci set í¬ì¸í„° :param index: (IN) set index (base: 1) :param a_type: (IN) 타입 :param value: (OUT) ê²°ê³¼ ë²„í¼ :param indicator: (OUT) null 표시(indicator) :return: ì—러 코드 * **CCI_ER_SET_INDEX** * **CCI_ER_TYPE_CONVERSION** * **CCI_ER_NO_MORE_MEMORY** * **CCI_ER_COMMUNICATION** *a_type*\ ì— ëŒ€í•œ *value*\ ì˜ íƒ€ìž…ì€ ë‹¤ìŒê³¼ 같다. +-----------------------+------------------------------+ | a_type | value 타입 | +=======================+==============================+ | **CCI_A_TYPE_STR** | char \*\* | +-----------------------+------------------------------+ | **CCI_A_TYPE_INT** | int \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_FLOAT** | float \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_DOUBLE** | double \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_BIT** | **T_CCI_BIT** \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_DATE** | **T_CCI_DATE** \* | +-----------------------+------------------------------+ | **CCI_A_TYPE_BIGINT** | int64_t \* | | | (Windows는 __int64 \*) | +-----------------------+------------------------------+ cci_set_holdability ------------------- .. c:function:: int cci_set_holdability(int conn_handle,int holdable) ì—°ê²° 수준ì—서 ê²°ê³¼ ì…‹ì˜ ì»¤ì„œ ìœ ì§€(cursor holdability) 여부를 ì„¤ì •í•œë‹¤. ê°’ì´ 1ì´ë©´ 커밋 ì—¬ë¶€ì— ê´€ê³„ ì—†ì´ ì—°ê²°ì´ ì¢…ë£Œë˜ê±°ë‚˜ ê²°ê³¼ ì…‹ì„ ì˜ë„ì 으로 닫기 ì „ê¹Œì§€ 커서를 ìœ ì§€(holdable)í•˜ê³ , 0ì´ë©´ 커밋ë 때 ê²°ê³¼ ì…‹ì´ ë‹«ížˆë©´ì„œ 커서를 ìœ ì§€í•˜ì§€ 않는다(not holdable). 커서 ìœ ì§€ì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ :ref:`cursor-holding`\ 를 ì°¸ê³ í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param holdable: (IN) 커서 ìœ ì§€ 여부 ì„¤ì • ê°’(0: not holdable, 1: holdable) :return: ì—러 코드 * **CCI_ER_INVALID_HOLDABILITY** cci_set_isolation_level ----------------------- .. c:function:: int cci_set_isolation_level(int conn_handle, T_CCI_TRAN_ISOLATION new_isolation_level, T_CCI_ERROR *err_buf) ì—°ê²°ì— ëŒ€í•œ 트랜ìžì…˜ 격리 수준(transaction isolation level)ì„ ì„¤ì •í•œë‹¤. ì´í›„ 주어진 ì—°ê²°ì— ëŒ€í•œ ëª¨ë“ íŠ¸ëžœìžì…˜ì€ *new_isolation_level* 로서 ë™ìž‘한다. :param conn_handle: (IN) ì—°ê²° 핸들 :param new_isolation_level: (IN) 격리 수준(isolation level) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드 * **CCI_ER_CON_HANDLE** * **CCI_ER_CONNECT** * **CCI_ER_ISOLATION_LEVEL** * **CCI_ER_DBMS** cci_set_db_parameter()ì— ì˜í•´ 트랜ìžì…˜ 격리 ìˆ˜ì¤€ì´ ì„¤ì •ëœ ê²½ìš°ì—는 í˜„ìž¬ì˜ íŠ¸ëžœìžì…˜ì— 대해서만 ì˜í–¥ì„ ì£¼ê³ íŠ¸ëžœìžì…˜ì´ ë나면 CASì—서 ì„¤ì •ëœ íŠ¸ëžœìžì…˜ 격리 수준으로 복귀ëœë‹¤. ì—°ê²° ì „ì²´ì— ëŒ€í•´ì„œ 트랜ìžì…˜ 격리 ìˆ˜ì¤€ì„ ì„¤ì •í• ê²½ìš°ëŠ” 반드시 cci_set_isolation_level()ì„ ì‚¬ìš©í•´ì•¼ 한다. cci_set_lock_timeout -------------------- .. c:function:: int cci_set_lock_timeout(int conn_handle, int locktimeout, T_CCI_ERROR * err_buf) ì—°ê²°ì— ëŒ€í•œ ìž ê¸ˆ íƒ€ìž„ì•„ì›ƒì„ ë°€ë¦¬ì´ˆ 단위로 ì„¤ì •í•œë‹¤. cci_set_db_parameter(conn_id, CCI_PARAM_LOCK_TIMEOUT, &val, err_buf)를 호출한 것과 ë™ì¼í•˜ë©°, :c:func:`cci_set_db_parameter` 함수를 ì°¸ê³ í•œë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param locktimeout: (IN) ìž ê¸ˆ 타임아웃 시간(단위: 밀리 ì´ˆ). :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_PARAM_NAME** * **CCI_ER_DBMS** * **CCI_ER_COMMUNICATION** * **CCI_ER_CONNECT** cci_set_login_timeout --------------------- .. c:function:: int cci_set_login_timeout(int conn_handle, int timeout, T_CCI_ERROR *err_buf) ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒì„ ë°€ë¦¬ì´ˆ 단위로 ì„¤ì •í•œë‹¤. :c:func:`cci_prepare` 함수나 :c:func:`cci_execute` 함수를 호출하면서 ë‚´ë¶€ì 으로 ìž¬ì ‘ì†ì´ ë°œìƒí• 때 ë¡œê·¸ì¸ íƒ€ìž„ ì•„ì›ƒì´ ì ìš©ëœë‹¤. ì´ ë³€ê²½ì€ í˜„ìž¬ì˜ ì—°ê²°ì—ë§Œ ì ìš©ëœë‹¤. :param conn_handle: (IN) ì—°ê²° 핸들 :param timeout: (IN) ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒ(단위: 밀리초) :param err_buf: (OUT) ì—러 ë²„í¼ :return: ì—러 코드(0: 성공) * **CCI_ER_CON_HANDLE** * **CCI_ER_USED_CONNECTION** cci_set_make ------------ .. c:function:: int cci_set_make(T_CCI_SET *set, T_CCI_U_TYPE u_type, int size, void *value, int *indicator) 새로운 **CCI_A_TYPE_SET** íƒ€ìž…ì˜ setì„ ë§Œë“ ë‹¤. 만들어진 setì€ :c:func:`cci_bind_param`\ ì„ í†µí•´ **CCI_A_TYPE_SET** 으로 ì„œë²„ì— ì „ë‹¬ëœë‹¤. :c:func:`cci_set_make`\ ì— ì˜í•´ 만들어진 setì€ ë°˜ë“œì‹œ :c:func:`cci_set_free`\ 를 통해 ì‚¬ìš©ëœ ë©”ëª¨ë¦¬ë¥¼ ì œê±°í•´ì•¼ 한다. *u_type* ì— ë”°ë¥¸ *value* ì˜ íƒ€ìž…ì€ :c:func:`cci_bind_param`\ ì„ ì°¸ê³ í•œë‹¤. :param set: (OUT) cci set í¬ì¸í„° :param u_type: (IN) 엘리먼트 타입 :param size: (IN) set í¬ê¸° :param value: (IN) set 엘리먼트 :param indicator: (IN) null 표시 ë°°ì—´(indicator array) :return: ì—러 코드 cci_set_max_row --------------- .. c:function:: int cci_set_max_row(int req_handle, int max) :c:func:`cci_execute`\ ì— ì˜í•´ 수행ë˜ëŠ” **SELECT** ë¬¸ì˜ ê²°ê³¼ì— ëŒ€í•´ 최대 ë ˆì½”ë“œ 수를 ì§€ì •í•œë‹¤. *max* ê°’ì´ 0ì¼ ê²½ìš° ì§€ì •í•˜ì§€ ì•Šì€ ê²ƒê³¼ ë™ì¼í•˜ë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param max: (IN) 최대 í–‰ :return: ì—러 코드 .. code-block:: c req = cci_prepare( ... ); cci_set_max_row(req, 1); cci_execute( ... ); cci_set_query_timeout --------------------- .. c:function:: int cci_set_query_timeout(int req_handle, int milli_sec) ì§ˆì˜ ìˆ˜í–‰ì˜ íƒ€ìž„ì•„ì›ƒ ì‹œê°„ì„ ì„¤ì •í•œë‹¤. :param req_handle: (IN) ìš”ì² í•¸ë“¤ :param milli_sec: 타임아웃(timeout) 시간, 단위는 msec. :return: 성공 : ìš”ì² í•¸ë“¤ ID, 실패 : ì—러 코드 * **CCI_ER_REQ_HANDLE** **cci_set_query_timeout** 으로 ì„¤ì •ëœ íƒ€ìž„ì•„ì›ƒ ì‹œê°„ì€ :c:func:`cci_prepare`, :c:func:`cci_execute`, :c:func:`cci_execute_array`, :c:func:`cci_execute_batch` í•¨ìˆ˜ë“¤ì— ì˜í–¥ì„ 미친다. ê° í•¨ìˆ˜ì—서 íƒ€ìž„ì•„ì›ƒì´ ë°œìƒí–ˆì„ 때 :c:func:`cci_connect_with_url` ì—°ê²° URLì— ì„¤ì •í•œ **disconnect_on_query_timeout** ì˜ ê°’ì´ yesì´ë©´ **CCI_ER_QUERY_TIMEOUT** ì—러를 반환한다. 위 í•¨ìˆ˜ë“¤ì€ :c:func:`cci_connect_with_url` í•¨ìˆ˜ì˜ ì¸ìžì¸ ì—°ê²° URLì— **login_timeout** ì´ ì„¤ì •ë˜ì–´ 있는 경우ì—ë„ **CCI_ER_LOGIN_TIMEOUT** ì—러를 ë°˜í™˜í• ìˆ˜ 있는ë°, ì´ëŠ” ì‘ìš© í´ë¼ì´ì–¸íŠ¸ì™€ 브로커 ì‘ìš© 서버(CAS) ê°„ 재연결 ê³¼ì •ì—서 ë¡œê·¸ì¸ íƒ€ìž„ì•„ì›ƒì´ ë°œìƒí•œ 경우ì´ë‹¤. ì‘ìš© í´ë¼ì´ì–¸íŠ¸ì™€ CAS ê°„ 재연결 ê³¼ì •ì€ CASê°€ 재시작하거나 재스케쥴ë˜ëŠ” ê²½ìš°ì— ë°œìƒí•œë‹¤. 재스케쥴ì´ëž€ CASê°€ 트랜ìžì…˜ 단위로 ì‘ìš© í´ë¼ì´ì–¸íŠ¸ë¥¼ ì„ íƒí•˜ì—¬ ì—°ê²°ì„ ì‹œìž‘í•˜ê³ ì¢…ë£Œí•˜ëŠ” ê³¼ì •ì„ ì˜ë¯¸í•˜ëŠ”ë°, 브로커 파ë¼ë¯¸í„°ì¸ **KEEP_CONNECTION** ì´ AUTOì´ë©´ ìƒí™©ì— ë”°ë¼ ë°œìƒí•œë‹¤. 보다 ìžì„¸í•œ 사í•ì€ :ref:`parameter-by-broker`\ì˜ **KEEP_CONNECTION** ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. cci_set_size ------------ .. c:function:: int cci_set_size(T_CCI_SET set) **T_CCI_SET** 타입 ê°’ì— ëŒ€í•œ 엘리먼트 개수를 ê°€ì ¸ì˜¨ë‹¤. :param set: (IN) cci set í¬ì¸í„° :return: í¬ê¸°