API Reference

API 공통사항

dbmInitHandle

기능

API 사용을 위한 handle 초기화 작업을 수행한다. 모든 API를 사용하기 위해 반드시 선행되어 호출되어야 한다. dbmInitHandle 내에서는 아래의 과정을 내부적으로 수행한 후 성공/실패를 반환한다.

인자

int dbmInitHandle( dbmHandle     ** aHandle,
                   char           * aInstanceName )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle **

In/ out

변수는 NULL로 초기화한 후에 사용해야 한다.

aInstanceName

char *

In

-

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
}

dbmHandle 변수는 (void *) 형태로 dbmInitHandle을 통해 내부적으로 필요한 공간을 할당하여 사용자에게 반환한다.

dbmFreeHandle

기능

dbmInitHandle에 의해 할당된 자원을 모두 해제한다. 
만일 변경 트랜잭션을 commit 하지 않은 상태에서 dbmFreeHandle이 호출되면 자동으로 rollback을 먼저 수행한다.
dbmFreeHandle을 호출하지 않고 프로그램을 종료할 수 있지만  dbmFreeHandle 없이 dbmInitHandle를 계속 호출하면 메모리가 증가하며 동시에 접속 가능한 공간이 부족한 오류가 발생할 수 있다.

인자

int dbmFreeHandle( dbmHandle     ** aHandle )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle **

In/ out

해제 후 변수는 NULL로 초기화 된다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );

    // 사용자코드 

    rc = dbmFreeHandle( &sHandle );
}

dbmPrepareTable

기능

사용자가 수행할 table을 handle에 준비시킨다. (Shared memory attach 등을 수행)

인자

int dbmPrepareTable( dbmHandle       * aHandle,
                     char            * aTableName );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수가 사용되어야 한다.

aTableName

char *

In

Prepare할 TableName을 입력한다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTable( sHandle,
                          "table1" );
}

dbmPrepareTableHandle

기능

사용자가 DML/ SELECT를 수행할 table에 대한 TableHandle을 생성하여 반환한다. (Shared memory attach 등을 수행한다.)

인자

int dbmPrepareTableHandle( dbmHandle         * aHandle,
                           const char        * aTableName,
                           dbmTableHandle   ** aTableHandle );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수가 사용되어야 한다.

aTableName

char *

In

Prepare 할 TableName을 입력한다.

aTableHandle

dbmTableHandle **

out

Prepare 된 table의 handle 이다.

사용 예

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "table1",
                                &sTableHandle );
}

만일 대상 table에 DDL이 발생하면 내부적으로 prepare를 재수행한다. 이 때 table의 변경 정보를 재구축하는 과정에서 메모리 사용량이 일부 증가할 수 있으며 성능의 jitter가 발생할 수 있다.

dbmPrepareStmt

기능

사용자가 수행할 SQL을 실행 직전 단계로 만든다.

인자

int dbmPrepareStmt( dbmHandle       * aHandle,
                    char            * aSQLString,
                    dbmStmt        ** aStmt )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수가 사용되어야 한다.

aSQLString

char *

In

Prepare 할 SQL string 이다.

aStmt

dbmStmt **

In/ out

Prepared 된 Stmt가 반환된다. (NULL로 초기화 된 변수여야 한다.)

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select * from t1 where c1 = :v1",
                         & sStmt );
}
Procedure는 다음과 같은 방식으로 호출한다. Procedure를 호출할 때는 out mode parameter인 경우에도 BindParamById와 같은 BindParam 함수를 사용해야 한다.
rc = dbmPrepareStmt( sHandle, "exec proc1(?, ?, ?, ?)", &sStmt );
    TEST_ERR( sHandle, rc, "prepareStmt" );

    rc = dbmBindParamById( sHandle, sStmt, 1, DBM_BIND_DATA_TYPE_INT, &sData.c1, NULL );
    TEST_ERR( sHandle, rc, "bindParam1" );

    rc = dbmBindParamById( sHandle, sStmt, 2, DBM_BIND_DATA_TYPE_INT, &sData.c2, NULL );
    TEST_ERR( sHandle, rc, "bindParam2" );

    rc = dbmBindParamById( sHandle, sStmt, 3, DBM_BIND_DATA_TYPE_INT, &sData.c3, NULL );
    TEST_ERR( sHandle, rc, "bindParam3" );

    rc = dbmBindParamById( sHandle, sStmt, 4, DBM_BIND_DATA_TYPE_INT, &sData.c4, NULL );
    TEST_ERR( sHandle, rc, "bindParam4" );


    for( i = 0 ; i < 10 ; i ++ )
    {
        sData.c1 = i;
        sData.c2 = i;
        sData.c3 = i;

        rc = dbmExecuteStmt( sHandle, sStmt );
        TEST_ERR( sHandle, rc, "executeStmt" );

        fprintf( stdout, "c4=%d\n", sData.c4 );
    }

dbmPrepareStmt에서 생성되는 dbmStmt 객체는 공유할 수 없다. 따라서 서로 다른 handle을 쓸 경우, dbmPrepareStmt를 통해 각 handle별 dbmStmt 객체를 생성해야 한다.

dbmFreeStmt

기능

사용자가 dbmPrepareStmt를 통해 할당 dbmStmt Handle의 메모리를 해제시킨다.

인자

int dbmFreeStmt( dbmHandle       * aHandle,
                 dbmStmt        ** aStmt )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수가 사용되어야 한다.

aStmt

dbmStmt **

In/ out

Prepared 된 Stmt Pointer를 입력한다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select * from t1 where c1 = :v1",
                         & sStmt );
    // ....

    rc = dbmFreeStmt( sHandle, &sStmt );
}

dbmBindParamById

기능

dbmPrepareStmt에서 사용된 사용자 parameter marker (?)에 대응되는 변수를 순서대로 binding 한다.

인자

int dbmBindParamById( dbmHandle           * aHandle,
                      dbmStmt             * aStmt,
                      int                   aBindId,
                      dbmBindDataType       aBindType,
                      void                * aData,
                      long                * aSizePtr );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Prepared 된 stmt 변수이다.

aBindId

int

-

Prepare 시점에 나열된 parameter의 순서 (base=1) 이다.

aBindType

dbmBindDataType

In

Binding 변수의 데이터 타입이다.

aData

void *

In

사용자 변수 포인터이다.

aSizePtr

long *

In

데이터 크기를 저장하는 8 byte 변수 포인터

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            sVar;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select * from t1 where c1 = ?",
                         & sStmt );

    rc = dbmBindParamById( sHandle,
                           sStmt,
                           1,
                           DBM_BIND_DATA_TYPE_INT,
                           & sVar,
                           NULL );
}

dbmBindParamById는 사용자 데이터만 연결할 수 있고 테이블이나 column 이름은 binding 할 수 없다.

JSON Object 예제

다음은 json에 대해 dbmBindParamById를 사용하는 예이다.

dbmStmt * sStmt = NULL;
int sC1;
sRc = dbmPrepareStmt( aHandle,
           "select c1, json_value(c2, '$.key1') from t1 where c1 = ?",
           &sStmt );
PRT_ERROR( sRc );

sRc = dbmBindParamById( aHandle,
                        sStmt,
                        1,
                        DBM_BIND_DATA_TYPE_INT,
                        &sC1,
                        NULL );
PRT_ERROR( sRc );
dbmStmt * sStmt = NULL;
int sC1;
char * sPath;

// json path bind
sRc = dbmPrepareStmt( aHandle,
           "select c1, json_query(c2, ?) from t1 where c1 = ?",
           &sStmt );
PRT_ERROR( sRc );

sRc = dbmBindParamById( aHandle,
                        sStmt,
                        1,
                        DBM_BIND_DATA_TYPE_CHAR,
                        &sPath,
                        NULL );
PRT_ERROR( sRc );

sRc = dbmBindParamById( aHandle,
                        sStmt,
                        2,
                        DBM_BIND_DATA_TYPE_INT,
                        &sC1,
                        NULL );
PRT_ERROR( sRc );

sPath = "$.key1";
dbmStmt * sStmt = NULL;
char * sSelectPath;
char * sWherePath;

// json path bind
sRc = dbmPrepareStmt( aHandle,
                      "select c1, json_query(c2, ?) from t1 "
                      "where json_value(c2, ?) = ?",
                      &sStmt );
PRT_ERROR( sRc );

sRc = dbmBindParamById( aHandle,
                        sStmt,
                        1,
                        DBM_BIND_DATA_TYPE_CHAR,
                        &sSelectPath,
                        NULL );
PRT_ERROR( sRc );

sRc = dbmBindParamById( aHandle,
                        sStmt,
                        2,
                        DBM_BIND_DATA_TYPE_CHAR,
                        &sWherePath,
                        NULL );
PRT_ERROR( sRc );

sSelectPath = "$.key2";
sWherePath = "$.key1";

dbmBindParamByName

기능

dbmPrepareStmt에서 사용자가 기술한 변수 이름을 기반으로 사용자 변수를 binding 한다.

인자

int dbmBindParamByName( dbmHandle           * aHandle,
                        dbmStmt             * aStmt,
                        char                * aVarName,
                        dbmBindDataType       aBindType,
                        void                * aData,
                        long                * aSizePtr );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Prepared 된 stmt 변수이다.

aVarName

char *

In

Prepare 시점에 나열된 parameter 이름이다.

aBindType

dbmBindDataType

In

Binding 변수의 데이터 타입이다.

aData

void *

In

사용자 변수 포인터이다.

aSizePtr

long *

In

데이터 크기를 저장하는 8 byte 변수 포인터이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            sVar;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select * from t1 where c1 = :v1",
                         & sStmt );

    rc = dbmBindParamByName( sHandle,
                             sStmt,
                             "v1",
                             DBM_BIND_DATA_TYPE_INT,
                             & sVar,
                             NULL );
}

dbmBindParamByName은 사용자 데이터만 연결할 수 있고 테이블이나 column 이름은 binding 할 수 없다.

dbmBindCol

기능

Select 구문에 의해 수행된 결과를 저장하기 위한 사용자 변수와 매핑하는 역할을 수행한다.

인자

int dbmBindCol( dbmHandle           * aHandle,
                dbmStmt             * aStmt,
                int                   aBindIndex,
                dbmBindDataType       aBindDataType,
                void                * aData,
                int                   aMaxSize,
                long                * aSizePtr )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Prepared 된 stmt 변수이다.

aBindIndex

int

In

Target column이 출현하는 순서이다. (Base=1)

aBindDataType

dbmBindDataType

In

Target 변수의 데이터 타입이다.

aData

void *

In

사용자 변수 포인터이다.

aMaxSize

long

In

데이터 크기의 최대값이다

aSizePtr

long *

In

데이터 크기를 저장하는 8 byte 변수 포인터이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            sVar;
    int            sCol1;
    int            sCol2;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select c1, c2 from t1 where c1 = :v1",
                         & sStmt );

    rc = dbmBindParamByName( sHandle,
                             sStmt,
                             "v1",
                             DBM_BIND_DATA_TYPE_INT,
                             & sVar,
                             NULL );

    rc = dbmBindCol( sHandle,
                     sStmt,
                     1,
                     DBM_BIND_DATA_TYPE_INT,
                     & sCol1,
                     sizeof(int),
                     NULL );
 
    rc = dbmBindCol( sHandle,
                     sStmt,
                     2,
                     DBM_BIND_DATA_TYPE_INT,                     
                     & sCol2,
                     sizeof(int),                     
                     NULL );
}

dbmBindColStruct

기능

Select 구문에 의해 수행된 결과를 저장하기 위해 사용자 변수와 매핑한다는 점에서 dbmBindCol과 동일하다. 다만 사용자가 정의한 구조체 변수로 반환받고자 할 때 사용한다는 차이가 있다.

인자

int dbmBindColStruct( dbmHandle           * aHandle,
                      dbmStmt             * aStmt,
                      void                * aData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Prepared 된 stmt 변수이다.

aData

void *

In

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
    int c3;
} DATA;

int main( int argc, char *argv[] )
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt = NULL;
    DATA           sData;
    char           sErrMsg[1024];
    int c1;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    TEST_ERR( sHandle, rc, "initHandle" );
c1 = 10;
    rc = dbmPrepareStmt( sHandle,
                         "select * from t1 where c1 = ?",
                         & sStmt );
    TEST_ERR( sHandle, rc, "prepareStmt" );
rc = dbmBindParamById( sHandle,
                           sStmt,
                           1,
                           DBM_BIND_DATA_TYPE_INT,
                           &c1,
                           NULL );

TEST_ERR( sHandle, rc, "selectBindParam" );
rc = dbmBindColStruct( sHandle,
                       sStmt,
                       &sData );
    TEST_ERR( sHandle, rc, "selectTargetBind" );

    rc = dbmExecuteStmt( sHandle, sStmt );
    if( rc )
    {
        dbmGetErrorData( sHandle, &rc, sErrMsg, sizeof(sErrMsg) );
        printf("ERR-%d] %s\n", rc, sErrMsg );
    }

    rc = dbmFetchStmt( sHandle, sStmt );
    TEST_ERR( sHandle, rc, "fetchStmt" );

    printf( "Out c1=%d, c2=%d, c3=%d\n", sData.c1, sData.c2, sData.c3 );

    rc = dbmFreeStmt( sHandle, &sStmt );
    TEST_ERR( sHandle, rc, "FreeStmtInsert" );

    return 0;
}

dbmExecuteStmt

기능

dbmPrepareStmt에 의해 처리된 statement를 실행한다.

인자

int dbmExecuteStmt( dbmHandle           * aHandle,
                    dbmStmt             * aStmt )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Prepared 된 stmt 변수이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            sVar;
    int            sCol1;
    int            sCol2;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select c1, c2 from t1 where c1 = :v1",
                         & sStmt );

    rc = dbmBindParamByName( sHandle,
                             sStmt,
                             "v1",
                             DBM_BIND_DATA_TYPE_INT,
                             & sVar,
                             NULL );

    rc = dbmBindCol( sHandle,
                     sStmt,
                     1,
                     DBM_BIND_DATA_TYPE_INT,  
                     & sCol1,
                     sizeof(int),
                     NULL ); 
    rc = dbmBindCol( sHandle,
                     sStmt,
                     2,
                     DBM_BIND_DATA_TYPE_INT,
                     & sCol2,
                     sizeof(int),
                     NULL );
    rc = dbmExecuteStmt( sHandle,
                         sStmt );
}

Select하고 대상을 추려야 하는 update/ delete 문의 경우, 명시적인 dbmBeginCursor() API 호출이 없었다면 실행되는 시점의 SCN을 자신의 view-SCN으로 설정하여 데이터의 visibility를 판별한다.

dbmFetchStmt

기능

dbmExecuteStmt에 의해 수행된 select 문 조회 결과를 한 건씩 가지고 온다.

인자

int dbmFetchStmt( dbmHandle           * aHandle,
                  dbmStmt             * aStmt )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Executed 된 stmt 변수이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    int            sVar;
    int            sCol1;
    int            sCol2;
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select c1, c2 from t1 where c1 = :v1",
                         & sStmt );

    rc = dbmBindParamByName( sHandle,
                             sStmt,
                             "v1",
                             DBM_BIND_DATA_TYPE_INT,
                             & sVar,
                             NULL );

    rc = dbmBindCol( sHandle,
                     sStmt,
                     1,
                     DBM_BIND_DATA_TYPE_INT,                     
                     & sCol1,
                     sizeof(int),
                     NULL );

    rc = dbmBindCol( sHandle,
                     sStmt,
                     2,
                     DBM_BIND_DATA_TYPE_INT,                     
                     & sCol2,
                     sizeof(int),
                     NULL );

    rc = dbmExecuteStmt( sHandle,
                         sStmt );

    rc = dbmFetchStmt( sHandle,
                       sStmt );
}

dbmFetchStmt가 호출되면 앞서 dbmBindCol 했던 각 변수에 select target 절에 해당하는 값들이 저장된다. 여러 건이 있을 경우, loop 안에 NOT_FOUND 오류가 나올 때까지 dbmFetchStmt를 반복적으로 호출하면 된다.

dbmFetchStmt2Json

기능

dbmExecuteStmt가 select 문을 조회한 결과를 한 건씩 JSON format text로 가져온다.

인자

int dbmFetchStmt2Json( dbmHandle           * aHandle,
                       dbmStmt             * aStmt,
                       char                * aDataPtr )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

Execute 된 stmt 변수이다.

aDataPtr

char *

In/Out

JSON format 결과가 저장될 사용자 변수 포인터이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt   = NULL;
    char           sText[1024];
    int            sVar;  
    int            rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareStmt( sHandle,
                         "select c1, c2 from t1 where c1 = :v1",
                         & sStmt );

    rc = dbmBindParamByName( sHandle,
                             sStmt,
                             "v1",
                             DBM_BIND_DATA_TYPE_INT,
                             & sVar,
                             NULL );

    while( dbmFetchStmt2Json( sHandle, sStmt, sText ) == 0 )
    {
        fprintf( stdout, "%s\n", sText );
    }
}

dbmInsertRow

기능

한 개의 사용자 데이터를 지정된 테이블에 추가한다.

인자

int dbmInsertRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData,
                  int                   aDataSize )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In

사용자 변수 포인터이다.

aDataSize

int

In

데이터 크기이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, 
                       "t1",
                       & sData,
                       sizeof(DATA) );
}

dbmInsertRowExpired

기능

지정된 시간이 경과하면 expired 될 record를 삽입한다. 입력된 시간이 경과하면 데이터는 제거된다. 0을 입력하면 데이터는 유지되고 시간 (초 단위)을 지정하면 해당 시간이 경과된 후에 제거된다.

인자

int dbmInsertRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData,
                  int                   aDataSize,
                  int                   aSecond )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In

사용자 변수 포인터이다.

aDataSize

int

In

데이터 크기이다.

aSecond

int

in

0: dbmInsertRow와 동일하게 동작

aSecond > 0: 해당 시간 경과 후 데이터 제거

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmInsertRowExpired( sHandle, 
                              "t1",
                              & sData,
                              sizeof(DATA),
                              600 );         // 10분 후 제거됨.
}

dbmInsert

기능

한 개의 사용자 데이터를 table handle에 지정된 테이블에 추가하고 row의 slot ID를 반환한다.

인자

int dbmInsert( dbmHandle       * aHandle,
               dbmTableHandle  * aTableHandle,
               void            * aUserData,
               int               aDataSize,
               long            * aSlotId );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블 핸들이다.

aUserData

void *

In

사용자 변수 포인터이다.

aDataSize

int

In

데이터 크기이다.

aSlotId

long *

out

NULL이 아닌 경우 slot ID를 반환한다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    long             sSlotId;

    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                &sTableHandle );    

    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, 
                       sTableHandle,
                       & sData,
                       sizeof(DATA),
                       & sSlotId );
}

dbmUpdateRow

기능

한 건 이상의 사용자 데이터를 갱신한다.

인자

int dbmUpdateRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData,
                  int                 * aAffectedCount )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In

사용자 변수 포인터이다.

aAffectedCount

int *

Out

Updated 된 row 개수이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmUpdateRow( sHandle, 
                       "t1",
                       & sData,
                       & sRowCount );
}

Unique index의 경우 dbmUpdateRow는 한 건만 갱신되지만 non-unique index의 경우 여러 건이 갱신될 수 있는데 이 경우 해당 건수는 반환되는 aAffectedCount를 통해 확인할 수 있다.

dbmUpdate

기능

지정된 table handle의 테이블에서 주어진 데이터에 해당하는 key를 가진 데이터를 변경하며, 필요한 경우 변경 전의 data를 반환한다.

aSlotID 인자가 -1 이 아닌 경우, 해당 slot의 데이터를 변경한다.

인자

int dbmUpdate( dbmHandle      * aHandle,
               dbmTableHandle * aTableHandle,
               void           * aUserData,
               long             aSlotId,
               int            * aRowCount,
               void           * aReturnOldData );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

In

사용자 변수 포인터이다.

aSlotId

long

in

-1 이 아닐 경우, 해당 slot의 데이터를 변경한다.

aRowCount

int *

Out

Updated 된 row 개수이다.

aReturnOldData

void *

Out

NULL이 아닐 경우 이전 data를 반환한다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    DATA             sOldData;
    int              sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmUpdate( sHandle, 
                    sTableHandle,
                    & sData,
                    -1,
                    & sRowCount,
                    & sOldData );
}

dbmUpsert

기능

지정된 table handle의 테이블에서 주어진 데이터에 해당하는 key를 가진 데이터가 있으면 변경하고 없으면 insert를 수행한다. Update 되었을 때 필요한 경우 변경되기 전의 data를 반환한다.

변경 전의 data가 필요 없으면 aReturnOldData를 NULL로 설정해야 하지만, aInsertCnt는 NULL이 아닌 경우 insert로 동작이 성공하면 1을 반환하고 update로 성공하면 0을 반환한다.

변경 전의 data가 필요하면 aReturnOldData를 NULL이 아닌 값으로 설정해야 하고, 해당 변수값은 update 일 때만 유효하므로 이 변수가 유효한지 여부를 판단하기 위해 aInsertCnt도 NULL이 아닌 값으로 설정해야 한다.

인자

int dbmUpsert( dbmHandle        * aHandle,
               dbmTableHandle   * aTableHandle,
               void             * aUserData,
               int                aDataSize,
               void             * aReturnOldData,
               int              * aInsertCnt );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

In

사용자 변수 포인터이다.

aDataSize

int

in

aUserData의 크기

aReturnOldData

void *

Out

NULL이 아닐 경우 이전 data를 반환한다.

aInsertCnt

int *

Out

NULL이 아닐 경우

  • Insert로 성공하면 1을 반환한다.

  • Update로 성공하면 0을 반환한다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    DATA             sOldData;
    int              sInsertCnt = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmUpsert( sHandle, 
                    sTableHandle,
                    & sData,
                    sizeof(DATA),
                    & sOldData,
                    & sInsertCnt);
}

dbmDeleteRow

기능

한 건 이상의 사용자 데이터를 삭제한다.

인자

int dbmDeleteRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData,
                  int                 * aAffectedCount )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In

사용자 변수 포인터이다.

aAffectedCount

int *

Out

Delete 된 row 개수이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmDeleteRow( sHandle, 
                       "t1",
                       & sData,
                       & sRowCount );
}

dbmDelete

기능

주어진 table handle의 테이블에서 한 건 이상의 사용자 데이터를 삭제한다.

인자

int dbmDelete( dbmHandle      * aHandle,
               dbmTableHandle * aTableHandle,
               void           * aUserData,
               long             aSlotId,
               int            * aRowCount,
               void           * aReturnOldData );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

In

사용자 변수 포인터이다.

aSlotId

long

in

-1 이 아닌 경우 해당 slot의 데이터를 삭제한다.

aRowCount

int *

Out

NULL이 아닌 경우 delete 된 row 개수이다.

aReturnOldData

void *

Out

NULL이 아닌 경우 delete 된 row의 데이터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    DATA             sOldData;
    int              sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 1;
    sData.c2 = 100;
    rc = dbmDeleteRow( sHandle, 
                       sTableHandle,
                       & sData,
                       -1,
                       & sRowCount,
                       & sOldData );
}

Splay table type에서 delete 하면 즉시 key를 삭제한다. 따라서 트랜잭션이 진행되는 도중에 삭제된 key는 조회되지 않는다. 또한 삭제된 트랜잭션을 롤백하려고 할 때 이미 다른 세션에 의해 삽입되었을 경우에는 삭제된 트랜잭션이 롤백되지 않고 해당 레코드는 유실된다.

dbmBindColumn

기능

dbmUpdateRowByCols를 호출할 때 특정 column에 사용자 데이터를 저장하기 위해 사용한다.
dbmBindColumn을 수행하는 시점에 내부 임시 버퍼에 사용자 데이터가 복제된다. 따라서 execution하기 전에 반드시 dbmBindColumn을 호출해야 한다.
동일한 column을 대상으로 반복적으로 dbmBindColumn을 호출할 경우 마지막에 호출한 값이 저장되며 존재하지 않는 column에 대해 수행할 경우 오류가 발생한다.

인자

int dbmBindColumn( dbmHandle     * aHandle,
                   const char    * aTableName,
                   const char    * aColumnName,
                   void          * aUserData,
                   int             aDataSize );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aColumnName

char *

In

대상 column 이름이다.

aUserData

void *

In

사용자 데이터 포인터이다.

aDataSize

int

In

aUserData의 크기 (byte) 이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    char           sData[1024];



    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmBindColumn( sHandle,
                        "t1",
                        "col1",
                        sData,
                        sizeof(sData) );    
}

dbmClearBind

기능

dbmBindColumn을 수행한 정보를 삭제한다. 특정 column만 지정할 수 있으며 column을 명시하지 않고 NULL로 지정할 경우 이전에 binding 된 모든 정보를 삭제한다.

인자

int dbmClearBind( dbmHandle    * aHandle,
                  const char   * aTableName,
                  const char   * aColumnName );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aColumnName

char *

In

대상 column 이름이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    char           sData[1024];



    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmClearBind( sHandle,
                       "t1",
                       "col1" );    


    rc = dbmClearBind( sHandle,
                       "t1",
                       NULL );
}

dbmUpdateRowByCols

기능

특정 column만 갱신하고자 할 경우에 사용한다.  호출하기 전에 미리 dbmBindColumn API를 이용하여 key value를 포함하여 갱신하려는 column에 값을 설정해야 한다.

인자

int dbmUpdateRowByCols( dbmHandle      * aHandle,
                        const char     * aTableName,
                        int            * aRowCount );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aRowCount

int *

Out

갱신된 row count를 반환한다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    char           sData[1024];
    int            sRowCount;



    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmBindColumn( sHandle,
                        "t1",
                        "col1",
                        sData,
                        sizeof(sData) );    

    rc = dbmUpdateRowByCols( sHandle,
                             "t1",
                             &sRowCount );
}

dbmSelectRow

기능

한 건의 사용자 데이터를 조회하고 fetch 한다.
여러 건이 조회되더라도 첫 번째 한 건만 가지고오는데 다음 건을 가져와야 할 경우, dbmFetchNext 계열의 API를 사용해야 한다.

인자

int dbmSelectRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    rc = dbmSelectRow( sHandle, 
                       "t1",
                       & sData );
}

대상 레코드를 조회하려면 dbmSelectRow, dbmUpdateRow, dbmDeleteRow 모두 실행 시점에 사용자 데이터에 key를 포함한 상태여야 한다. dbmSelectRow는 사용자 데이터를 조회한 후에 사용자 변수에 저장하기까지 한다.

Date 타입을 반환받아야 할 경우에는 사용자가 unsigned long long 형태의 8 byte 변수를 지정하여 값을 저장할 수 있다.

다음 예제를 참고한다.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
#include <dbmUserAPI.h>


typedef struct
{
    int c1;
    long long c2;
} DATA;

main()
{
    dbmHandle *sHandle = NULL;
    struct timeval ss;
    time_t now;
    struct tm *nowtm;
    char buf[200];
    DATA sData;
    int sRowCount;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    if( rc )
    {
        printf( "test fail1\n" );
    }

    sData.c1 = 1;
    rc = dbmSelectRow( sHandle, "t1", &sData );
    if( rc )
    {
        printf( "test fail2\n" );
    }
ss.tv_sec = sData.c2 / 1000000.0;
ss.tv_usec = sData.c2 % 1000000;
now = ss.tv_sec;
nowtm = localtime(&now);
strftime( buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", nowtm);
printf( "c1=%d, c2=%s.%ld\n", sData.c1, buf, ss.tv_usec );
gettimeofday( &ss, NULL );
sData.c2 = ss.tv_sec * 1000000LL + ss.tv_usec;
rc = dbmUpdateRow( sHandle, "t1", &sData, &sRowCount );
if( rc )
{
    printf( "test fail3\n" );
}

rc = dbmSelectRow( sHandle, "t1", &sData );
if( rc )
{
    printf( "test fail4\n" );
}
ss.tv_sec = sData.c2 / 1000000.0;
ss.tv_usec = sData.c2 % 1000000;

now = ss.tv_sec;
nowtm = localtime(&now);
strftime( buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", nowtm);
printf( "c1=%d, c2=%s.%ld\n", sData.c1, buf, ss.tv_usec );

dbmCommit( sHandle );
}

================================
== Test
================================
shellPrompt> ./testPgm
c1=1, c2=2020-12-23 17:48:38.913314
c1=1, c2=2020-12-23 17:49:33.214220

API에 의해 변경된 시간정보가 table에도 동일하게 반영되어 있다는 것을 확인할 수 있다.

dbmMetaManager(DEMO)> select * from t1;
---------------------------------------------------------------------------------
C1                   : 1
C2                   : 2020/12/23 17:49:33.214220
---------------------------------------------------------------------------------

1 row selected
dbmMetaManager(DEMO)>

dbmSelect

기능

주어진 table handle의 테이블에서 주어진 조건에 맞는 사용자 데이터를 조회하기 시작하고 fetch 한다.
한 건 이상의 데이터를 조회하려면 계속해서 dbmFetch 함수를 사용해야 한다.

인자

int dbmSelect( dbmHandle         * aHandle,
               dbmTableHandle    * aTableHandle,
               void              * aUserData,
               void              * aUntilData,
               dbmScanDirection    aScanDir,
               dbmScanType         aScanType );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

In/ out

시작 조건이 되는 사용자 변수 포인터이다.

검색된 결과 데이터가 저장되는 버퍼 공간이기도 하다.

aUntilData

void *

in

종료 조건이 되는 사용자 변수 포인터 이다.

종료 조건이 없을 경우 NULL을 명시한다

aScanDir

dbmScanDirection

in

  • DBM_SCAN_DIR_BACKWARD: 인덱스의 역방향 탐색

  • DBM_SCAN_DIR_FORWARD: 인덱스의 정방향 탐색

  • DBM_SCAN_DIR_EQUAL: 같은 값을 가지는 key 탐색

aScanType

dbmScanType

in

  • DBM_SCAN_TYPE_RDONLY: read-only 로 검색

  • DBM_SCAN_TYPE_FOR_UPDATE: FOR UPDATE 모드로 검색

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    int              sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 1;
    rc = dbmSelect( sHandle, 
                    sTableHandle,
                    & sData,
                    NULL,
                    DBM_SCAN_DIR_EQUAL,
                    DBM_SCAN_TYPE_RDONLY );
}

DBM_SCAN_DIR_FORWARD는 aUserData 보다 큰 다음 (index order 기준) 데이터를 반환하고, UntilData의 key 보다 큰 경우에는 NOT_FOUND를 반환한다.

DBM_SCAN_DIR_BACKWARD는 aUserData 보다 작은 다음 (index order 기준) 데이터를 반환하고, UntilData의 key 보다 작은 경우에는 NOT_FOUND를 반환한다.

DBM_SCAN_DIR_EQUAL은 aUserData와 값이 같은 다음 데이터를 반환한다.

dbmFetch

기능

주어진 table handle의 테이블에서 수행한 이전 검색에 이어서 다음 데이터를 조회한다.

반드시 dbmSelect가 먼저 호출된 이후에 사용해야 한다.

인자

int dbmFetch( dbmHandle         * aHandle,
              dbmTableHandle    * aTableHandle,
              void              * aUserData,
              void              * aUntilData,
              dbmScanDirection    aScanDir,
              dbmScanType         aScanType );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

out

검색된 결과 데이터가 저장되는 버퍼 공간이다.

aUntilData

void *

in

종료 조건이 되는 사용자 변수 포인터 이다.

종료 조건이 없을 경우 NULL을 명시한다

aScanDir

dbmScanDirection

in

  • DBM_SCAN_DIR_BACKWARD : 인덱스의 역방향 탐색

  • DBM_SCAN_DIR_FORWARD : 인덱스의 정방향 탐색

  • DBM_SCAN_DIR_EQUAL : 같은 값을 가지는 key 탐색

aScanType

dbmScanType

in

  • DBM_SCAN_TYPE_RDONLY : read-only 로 검색

  • DBM_SCAN_TYPE_FOR_UPDATE : FOR UPDATE 모드로 검색

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;
    DATA             sUntilData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 10;
    sUntilData.c1 = 100;


    rc = dbmSelect( sHandle, 
                    sTableHandle,
                    & sData,
                    & sUntilData,
                    DBM_SCAN_DIR_FORWARD,
                    DBM_SCAN_TYPE_RDONLY );
   while( 1 )
   {
       rc = dbmFetch( sHandle,
                      sTableHandle,
                      & sData,
                      & sUntilData,
                      DBM_SCAN_DIR_FORWARD,
                      DBM_SCAN_TYPE_RDONLY );
       if( rc != 0 ) break; 
   }
}

DBM_SCAN_DIR_FORWARD는 이전에 반환한 데이터보다 큰 다음 (index order 기준) 데이터를 반환하고, UntilData의 key 보다 큰 경우에는 NOT_FOUND를 반환한다.

DBM_SCAN_DIR_BACKWARD는 이전에 반환한 데이터보다 작은 다음 (index order 기준) 데이터를 반환하고, UntilData의 key 보다 작은 경우에는 NOT_FOUND를 반환한다.

DBM_SCAN_DIR_EQUAL은 이전에 반환한 데이터와 값이 같은 다음 데이터를 반환하고, 해당 인덱스가 non-unique 인덱스 속성일 때만 의미가 있다.

dbmSelectMax

기능

주어진 table handle의 direct 테이블에 대해서만 key로 설정된 데이터 중 최대값을 조회한다.

테이블이 가진 segment들 중에 데이터가 하나라도 들어간 마지막 segment를 찾아서 이진 탐색을 통해 최대값을 가진 데이터를 반환한다.

이진 탐색 중에 데이터가 들어 있지 않은 slot을 발견할 경우, 잘못된 결과를 반환할 수 있다.

인자

int dbmSelectMax( dbmHandle      * aHandle,
                  dbmTableHandle * aTableHandle,
                  void           * aUserData );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    DATA             sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );    

    sData.c1 = 1;
    rc = dbmSelectMax( sHandle, 
                       sTableHandle,
                       & sData );
}

dbmSelectMax API는 direct table만 지원한다.

dbmSelectCount

기능

입력된 데이터와 일치하는 레코드의 개수를 반환한다.

인자

int dbmSelectRow( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData,
                  int                 * aRetCount )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

aRetCount

int *

out

데이터의 건수를 반환 받을 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    rc = dbmSelectCount( sHandle, 
                         "t1",
                         & sData,
                         & sRowCount );
}

일치하는 대상이 없을 경우 RowCount는 0으로 반환된다.

dbmSelectRowGT

기능

입력된 데이터의 key 값보다 큰 데이터를 조회한다.

인자

int dbmSelectRowGT( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;


    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 1;
    rc = dbmSelectRowGT( sHandle, 
                         "t1",
                         & sData );
}

위의 사용 예에서 dbmSelectRowGT를 수행하여 1보다 큰 데이터가 존재할 경우, 이를 가지고 온다.

dbmSelectRowLT

기능

입력된 데이터의 key 값보다 작은 데이터를 조회한다.

인자

int dbmSelectRowLT( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;


    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    rc = dbmSelectRowLT( sHandle, 
                         "t1",
                         & sData );
}

위의 예에서 dbmSelectRowLT를 수행하여 10보다 작은 데이터가 존재할 경우, 이를 가지고 온다.

dbmFetchNext

기능

입력된 데이터의 key 값과 동일한 다음 데이터를 조회한다.
Non-unique index에 여러 건의 데이터가 존재하는 까닭에 동일한 key 값을 갖는 여러 레코드를 가져오기 위해 dbmSelectRow와 조합하여 fetch를 수행해야 할 경우에 사용한다.

인자

int dbmFetchNext( dbmHandle           * aHandle,
                  char                * aTableName,
                  void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    rc = dbmSelectRow( sHandle, 
                       "t1",
                       & sData );

   while( 1 )
   {
       rc = dbmFetchNext( sHandle,
                          "t1",
                          &sData );

       if( rc != 0 ) break; 
   }
}

dbmFetchNextGT

기능

입력된 데이터의 key 값보다 큰 데이터를 조회한다. dbmSelectRow 또는 dbmSelectRowGT에서 시작된 값을 기준으로 조회한다.

인자

int dbmFetchNextGT( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    rc = dbmSelectRow( sHandle, 
                       "t1",
                       & sData );

   while( 1 )
   {
       rc = dbmFetchNextGT( sHandle,
                            "t1",
                            &sData );

       if( rc != 0 ) break; 
   }
}

dbmFetchNextLT

기능

입력된 데이터의 key 값보다 작은 데이터를 조회한다.

인자

int dbmFetchNextLT( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    rc = dbmSelectRow( sHandle, 
                       "t1",
                       & sData );

   while( 1 )
   {
       rc = dbmFetchNextLT( sHandle,
                            "t1",
                            &sData );

       if( rc != 0 ) break; 
   }
}

dbmSelectForUpdateRow

기능

dbmSelectRow와 동일하며 조회된 레코드를 LOCK 한다.

인자

int dbmSelectForUpdateRow( dbmHandle           * aHandle,
                           char                * aTableName,
                           void                * aUserData )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;

    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    rc = dbmSelectForUpdateRow( sHandle, 
                                "t1",
                                & sData );

}

다른 갱신 DML들과 마찬가지로, dbmSelectForUpdateRow를 수행한 경우 반드시 dbmCommit 이나 dbmRollback을 호출하여 트랜잭션을 종료해야 한다.

레코드 lock을 유지하는 API 종류는 다음과 같다.

dbmInsertArray

기능

N 개의 레코드를 삽입할 때 사용한다. N 개의 operation 중에 오류가 한 건 이상 발생하면 에러를 반환하는데 오류가 발생한 경우에도 operation은 진행되며 모든 operation이 완료된 후에 결과가 반환된다.

인자

int dbmInsertArray( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData,
                    int                   aDataSingleSize,
                    int                   aDataCount, 
                    int                   aRetArr[] )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

aDataSingleSize

int

In

데이터 한 개의 크기를 지정한다.

aDataCount

int

In

aUserData에 담긴 데이터 개수를 지정한다.

aRetArr

int

Out

각 operation의 에러코드를 순서대로 담는다.

사용 예

typedef struct
{
    int c1;
    int c2;
    int c3;
} DATA;

int main( int argc, char *argv[] )
{
    dbmHandle    * sHandle = NULL;
    DATA           sData[10];
    int sErrCode[10];
    int i;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
        sData[i].c2 = i;
        sData[i].c3 = i;
    }
rc = dbmInsertArray( sHandle, "t1", sData, sizeof(DATA), 10, sErrCode );
    if( rc ) exit(-1);

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);
rc = dbmInsertArray( sHandle, "t1", sData, sizeof(DATA), 10, sErrCode );
    for( i = 0 ; i < 10; i ++ )
    {
        printf( "%d] retCode = %d\n", i, sErrCode[i] );
    }

    dbmFreeHandle( &sHandle );
    return 0;
}

사용자가 입력한 데이터 한 개의 크기와 개수에 따라 설정해야 하는 사용자 버퍼가 잘못 설정되면 올바르지 않은 포인터가 접근할 수 있으므로 주의해서 사용해야 한다.

dbmUpdateArray

기능

N 개의 레코드를 변경할 때 사용한다. N 개의 operation 중에 오류가 한 건 이상 발생하면 에러를 반환하는데 오류가 발생한 경우에도 operation은 진행되며 모든 operation이 완료된 후에 결과가 반환된다.

인자

int dbmUpdateArray( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData,
                    int                   aDataCount, 
                    int                 * aAffectedRowCount,
                    int                   aRetArr[] )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

aDataCount

int

In

aUserData에 담긴 개수를 지정한다.

aAffectedRowCount

int

Out

전체 처리된 건수를 반환한다.

aRetArr

int

Out

각 operation의 에러코드를 순서대로 담는다.

사용 예

typedef struct
{
    int c1;
    int c2;
    int c3;
} DATA;

int main( int argc, char *argv[] )
{
    dbmHandle    * sHandle = NULL;
    DATA           sData[10];
    int sErrCode[10], sRowCount;
    int i;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
        sData[i].c2 = i;
        sData[i].c3 = i;
    }

    rc = dbmInsertArray( sHandle, "t1", sData, sizeof(DATA), 10, sErrCode );
    if( rc ) exit(-1);

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
        sData[i].c2 = i*10;
        sData[i].c3 = i*20;
    }

    rc = dbmUpdateArray( sHandle, "t1", sData, 10, &sRowCount, sErrCode );
    if( rc ) exit(-1);

    printf( "AffectedRow = %d\n", sRowCount );

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);


    dbmFreeHandle( &sHandle );
    return 0;
}

사용자가 입력한 데이터 한 개의 크기와 개수에 따라 설정해야 하는 사용자 버퍼가 잘못 설정되면 올바르지 않은 포인터가 접근할 수 있으므로 주의해서 사용해야 한다.

dbmSelectArray

기능

N 개의 레코드를 조회할 때 사용한다. N 개의 operation 중에 오류가 한 건 이상 발생하면 에러를 반환하는데 오류가 발생한 경우에도 operation은 진행되며 모든 operation이 완료된 후에 결과가 반환된다.

인자

int dbmSelectArray( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData,
                    int                   aDataCount, 
                    int                 * aAffectedRowCount,
                    int                   aRetArr[] )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

aDataCount

int

In

aUserData에 담긴 개수를 지정한다.

aAffectedRowCount

int

Out

전체 처리된 건수를 반환한다.

aRetArr

int

Out

각 operation의 에러코드를 순서대로 담는다.

사용 예

typedef struct
{
    int c1;
    int c2;
    int c3;
} DATA;

int main( int argc, char *argv[] )
{
    dbmHandle    * sHandle = NULL;
    DATA           sData[10];
    int sErrCode[10], sRowCount;
    int i;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
        sData[i].c2 = i;
        sData[i].c3 = i;
    }

    rc = dbmInsertArray( sHandle, "t1", sData, sizeof(DATA), 10, sErrCode );
    if( rc ) exit(-1);

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
    }

    rc = dbmSelectArray( sHandle, "t1", sData, 10, &sRowCount, sErrCode );
    if( rc ) exit(-1);

    printf( "AffectedRow = %d\n", sRowCount );

    dbmFreeHandle( &sHandle );
    return 0;
}

사용자가 입력한 데이터 한 개의 크기와 개수에 따라 설정해야 하는 사용자 버퍼가 잘못 설정되면 올바르지 않은 포인터가 접근할 수 있으므로 주의해서 사용해야 한다.

dbmDeleteArray

기능

N 개의 레코드를 삭제할 때 사용한다. N 개의 operation 중에 오류가 한 건 이상 발생하면 에러를 반환하는데 오류가 발생한 경우에도 operation은 진행되며 모든 operation이 완료된 후에 결과가 반환된다.

인자

int dbmDeleteArray( dbmHandle           * aHandle,
                    char                * aTableName,
                    void                * aUserData,
                    int                   aDataCount, 
                    int                 * aAffectedRowCount,
                    int                   aRetArr[] )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 테이블 이름이다.

aUserData

void *

In/ out

사용자 변수 포인터이다.

aDataCount

int

In

aUserData에 담긴 개수를 지정한다.

aAffectedRowCount

int

Out

전체 처리된 건수를 반환한다.

aRetArr

int

Out

각 operation의 에러코드를 순서대로 담는다.

사용 예

typedef struct
{
    int c1;
    int c2;
    int c3;
} DATA;

int main( int argc, char *argv[] )
{
    dbmHandle    * sHandle = NULL;
    DATA           sData[10];
    int sErrCode[10], sRowCount;
    int i;
    int rc;

    rc = dbmInitHandle( &sHandle, "demo" );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
        sData[i].c2 = i;
        sData[i].c3 = i;
    }

    rc = dbmInsertArray( sHandle, "t1", sData, sizeof(DATA), 10, sErrCode );
    if( rc ) exit(-1);

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);

    for( i = 0; i < 10; i ++ )
    {
        sData[i].c1 = i;
    }

    rc = dbmDeleteArray( sHandle, "t1", sData, 10, &sRowCount, sErrCode );
    if( rc ) exit(-1);

    printf( "AffectedRow = %d\n", sRowCount );

    rc = dbmCommit( sHandle );
    if( rc ) exit(-1);


    dbmFreeHandle( &sHandle );
    return 0;
}

사용자가 입력한 데이터 한 개의 크기와 개수에 따라 설정해야 하는 사용자 버퍼가 잘못 설정되면 올바르지 않은 포인터가 접근할 수 있으므로 주의해서 사용해야 한다.

dbmEnqueue

기능

사용자 데이터를 queue 형식의 테이블에 삽입한다.

인자

int dbmEnqueue( dbmHandle           * aHandle,
                char                * aTableName,
                int                   aMsgType,
                int                   aPriority,
                char                * aUserData,
                int                   aDataSize )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 queue 테이블 이름이다.

aMsgType

int

In

0 이상의 사용자 정의 type 이다.

aPriority

int

In

0 이상의 사용자 정의 priority 이다.

aUserData

void *

In

사용자 변수 포인터이다.

aDataSize

int

In

aUserData의 크기이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;


    rc = dbmInitHandle( &sHandle, "demo" );
    
    sData.c1 = 10;
    sData.c2 = 100;

    rc = dbmEnqueue( sHandle, 
                     "que1",
                     101,
                     1,
                     & sData,
                     sizeof(DATA) );

   
}

dbmDequeue

기능

Queue table로부터 한 건의 사용자 데이터를 추출한다. 
(MsgType, Priority)를 지정할 경우, 해당 조건에 맞는 데이터를 dequeue 한다. 조건없이 가져오려면 두 개의 필드를 모두 (-1, -1)로 설정하면 된다.
Dequeue 된 데이터는 자동으로 삭제되며 rollback이 호출된 경우 원본 데이터 형태로 그대로 삽입된다. (MsgType과 priority가 모두 유지되고 삽입 시간만 rollback time으로 변경된다.)

인자

int dbmDequeue( dbmHandle           * aHandle,
                char                * aTableName,
                int                   aInMsgType,
                int                   aInPriority,
                int                 * aOutMsgType,
                int                 * aOutPriority,
                char                * aUserData,
                int                 * aDataSize,
                int                   aTimeout )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 queue 테이블 이름이다.

aInMsgType

int

In

Dequeue를 수행할 Msg-Type을 특정할 경우 해당 값을 입력하고 그렇지 않을 경우 -1을 입력한다.

aInPriority

int

In

Dequeue를 수행할 priority를 특정할 경우 해당 값을 입력하고 그렇지 않을 경우 -1을 입력한다. (입력된 priority와 같거나 큰 대상을 반환한다.)

aOutMsgType

int *

Out

해당 메시지의 Msg-Type 정보를 반환한다. (NULL일 경우에는 반환하지 않는다.)

aOutPriority

int *

Out

해당 메시지의 우선순위 정보를 반환한다. (NULL일 경우에는 반환하지 않는다.)

aUserData

void *

Out

사용자 변수 포인터이다.

aDataSize

int *

Out

aUserData의 크기이다.

aTimeout

int

In

Queue에 데이터가 없을 경우 대기하는 시간을 지정 (ms단위) 한다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sDataSize = 0;
    int            sMsgType;
    int            sPriority;


    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmDequeue( sHandle, 
                     "que1",
                     101,
                     1,
                     &sMsgType,
                     &sPriority,
                     & sData,
                     & sDataSize,
                     1000 );

   
}

dbmGetCurrVal

기능

미리 생성되어 있는 sequence 객체의 현재값을 반환한다.

인자

int dbmGetCurrVal( dbmHandle           * aHandle,
                   char                * aSequenceName,
                   long long           * aCurrVal )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 queue 테이블 이름이다.

aCurrVal

long long int

Out

반환받을 포인터 (8 byte 변수 필요) 이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    long long      sCurrVal;
    int            sDataSize = 0;


    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmGetCurrVal( sHandle,
                        "seq1",
                        & sCurrVal );   
}

Sequence 객체에 대해 nextval이 호출되지 않은 상태에서 currval을 호출할 경우 오류가 발생한다.

dbmGetNextVal

기능

미리 생성되어 있는 sequence 객체의 다음 값을 반환한다.

인자

int dbmGetNextVal( dbmHandle           * aHandle,
                   char                * aSequenceName,
                   long long           * aNextVal )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

char *

In

대상 queue 테이블 이름이다.

aNextVal

long long int

Out

반환받을 포인터 (8 byte 변수 필요) 이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    long long      sNextVal;
    int            sDataSize = 0;


    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmGetNextVal( sHandle,
                        "seq1",
                        & sNextVal);   
}

dbmCommit

기능

사용자가 수행한 모든 트랜잭션을 영구적으로 반영한다.

인자

int dbmCommit( dbmHandle           * aHandle )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;


    rc = dbmInitHandle( &sHandle, "demo" );

    sData.c1 = 10;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, "t1", &sData, sizeof(DATA) );

    sData.c1 = 10;
    sData.c2 = 200;
    rc = dbmUpdateRow( sHandle, "t1", &sData, &sRowCount );

    rc = dbmCommit( sHandle );
}

dbmRollback

기능

사용자가 수행한 트랜잭션을 모두 rollback 한다.

인자

int dbmRollback( dbmHandle           * aHandle )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sRowCount = 0;


    rc = dbmInitHandle( &sHandle, "demo" );

    sData.c1 = 10;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, "t1", &sData, sizeof(DATA) );

    sData.c1 = 10;
    sData.c2 = 200;
    rc = dbmUpdateRow( sHandle, "t1", &sData, &sRowCount );

    rc = dbmRollback( sHandle );
}

dbmRefineSystem

기능

사용자로 하여금 instance-level, table-level에서 table/index lock을 해제하거나 index를 재구축하는 복구 기능을 실행하도록 한다.

인자

int dbmRefineSystem( const char    * aInstName,
                     const char    * aTableName )

인자 항목

타입

In/ out

비고

aInstName

const char *

In

instance 이름을 입력한다.

aTableName

const char *

In

특정 table name을 입력한다.

사용 예

if( argc > 1 )
    {
        if( dbmRefineSystem( "demo", NULL ) != 0 )
        {
            printf( "failed to refine all\n" );
            exit(-1);
        }
    else
    {
        if( dbmRefineSystem( "demo", "t1" ) != 0 )
        {
            printf( "failed to refine t1\n" );
            exit(-1);
        }
    }

Instance-level에서 수행할 때 대상 테이블이 아니면 skip 한다.

dbmGetRowCount

기능

UPDATE/ DELETE/ SELECT 기능을 prepare/ execute 한 후에 대상 row의 개수를 계산한다.

인자

int dbmGetRowCount( dbmHandle           * aHandle,
                    dbmStmt             * aStmt,
                    int                 * aRowCount )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aStmt

dbmStmt *

In

dbmExecuteStmt으로 실행된 dbmStmt 변수이다.

aRowCount

int *

Out

반환받을 변수 포인터 (4 byte 크기의 변수) 이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmStmt      * sStmt = NULL;
    int            sRowCount;

    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmPrepareStmt( sHandle, "...", &sStmt );
    rc = dbmExecuteStmt( sHandle, sStmt );
    
    rc = dbmGetRowCount( sHandle, sStmt, &sRowCount );

}

dbmGetRowSize

기능

입력한 테이블이 생성된 시점의 row size를 반환한다.

인자

int dbmGetRowSize( dbmHandle           * aHandle,
                   char                * aObjectName,
                   int                 * aRowSize )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aObjectName

char *

In

조회할 object name 이다.

aRowSize

int *

Out

반환받을 변수 포인터 (4 byte 크기의 변수) 이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    int            sRowSize;

    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmGetRowSize( sHandle, "Table1", &sRowSize );

}

dbmGetTableName

기능

입력된 테이블 핸들로부터 table name을 반환한다.

인자

const char * dbmGetTableName( dbmTableHandle           * aHandle )

인자 항목

타입

In/ out

비고

aHandle

dbmTableHandle *

In

dbmPrepareTableHandle 로 처리된 변수이다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    char  * sTableName;

    rc = dbmInitHandle( &sHandle, "demo" );
    rc = dbmPrepareTableHandle( &sHandle, "t1", &sTableHandle );

    sTableName = dbmGetTableHandle ( sTableHandle );
}

TableHandle이 성공한 상태이어야 한다.

dbmGetTableType

기능

입력된 테이블 핸들로부터 table type을 반환한다.

인자

dbmTableType  dbmGetTableType( dbmTableHandle           * aHandle )

인자 항목

타입

In/ out

비고

aHandle

dbmTableHandle *

In

dbmPrepareTableHandle 로 처리된 변수이다.

dbmTableType의 정의는 아래와 같다.
typedef enum
{
    DBM_TABLE_TYPE_INVALID = 0,
    DBM_TABLE_TYPE_TABLE,                  // BTree Index Table
    DBM_TABLE_TYPE_QUEUE,                  // N/A
    DBM_TABLE_TYPE_SEQUENCE,               // Sequence Object
    DBM_TABLE_TYPE_DIRECT_TABLE,           // Direct Table
    DBM_TABLE_TYPE_DIRECT_QUEUE,           // N/A
    DBM_TABLE_TYPE_SPLAY_TABLE,            // Splay Index Table
    DBM_TABLE_TYPE_LIST_TABLE,             // N/A
    DBM_TABLE_TYPE_HASH_TABLE,             // Hash Table
    DBM_TABLE_TYPE_PERF_VIEW,
    DBM_TABLE_TYPE_MAX
} dbmTableType;

본 매뉴얼의 작성 시점인 3.2 버전 기준으로 사용자가 생성 가능한 유형은 다음과 같다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    dbmTableType  sTableType;

    rc = dbmInitHandle( &sHandle, "demo" );
    rc = dbmPrepareTableHandle( &sHandle, "t1", &sTableHandle );

    sTableType = dbmGetTableType ( sTableHandle );
}

dbmSetSplayMode4DML

기능

Splay table handle인 경우, 입력된 option에 따라 insert 할 때 tree를 splay 할 지 여부를 설정한다.
0 으로 설정하면 splay 하지 않는다.

인자

int dbmSetSplayMode4DML( dbmTableHandle           * aHandle,
                         int                        aMode )

인자 항목

타입

In/ out

비고

aHandle

dbmTableHandle *

In

dbmPrepareTableHandle 로 처리된 변수이다.

aMode

int

int

0 : no splay (default)

1 : do splay

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;

    rc = dbmInitHandle( &sHandle, "demo" );
    rc = dbmPrepareTableHandle( &sHandle, "t1", &sTableHandle );
    dbmSetSplayMode4DML( sTableHandle, 1 );
}

입력된 TableHandle은 SPLAY_TABLE_TYPE일 때만 동작한다.

dbmGetErrorData

기능

API 호출로 발생한 각 오류 코드에 대한 상세 에러 메시지를 확인한다.
DBM 내에는 에러가 stack 형태로 축적되어 있기 때문에 에러가 날 때까지 호출하면 최초 오류부터 발생 원인을 추적할 수 있다.

인자

int dbmGetErrorData( dbmHandle           * aHandle,
                     int                 * aErrorCode,
                     char                * aErrorMsg )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aErrorCode

int *

Out

에러 코드가 담길 변수 포인터이다.

aErrorMsg

char *

Out

에러 메시지가 저장될 변수 포인터이다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sErrCode;
    char           sErrMsg[1024];


    rc = dbmInitHandle( &sHandle, "demo" );

    sData.c1 = 10;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, "t1", &sData, sizeof(DATA) );
    if( rc )
    {
        while( dbmGetErrorData( sHandle, &sErrCode, sErrMsg ) == 0 )
        {
             fprintf( stdout, "ERR-%d] %s\n", sErrCode, sErrMsg );
        }
    }

}

dbmGetErrorData를 통해 반환받는 에러 메시지 버퍼의 크기는 최소 512 byte 이상이어야 한다.

dbmGetErrorMsg

기능

API 호출로 발생한 각 오류 코드에 대한 상세 에러 메시지를 확인한다.
에러 stack에 저장된 에러의 원본 유형을 출력하기 때문에 상세한 부가 오류사항은 출력되지 않는다.

인자

void dbmGetErrorMsg( int         aErrorCode,
                     char      * aErrorMsg,
                     int         aErrorMsgSize )

인자 항목

타입

In/ out

비고

aErrorCode

int

In

조회할 에러 코드이다.

aErrorMsg

char *

Out

에러 코드가 담길 변수 포인터이다.

aErrorMsgSize

int

In

에러 메시지가 저장될 변수의 크기를 지정한다.

사용 예

typedef struct
{
    int c1;
    int c2;
} DATA;

main()
{
    dbmHandle    * sHandle = NULL;
    DATA           sData;
    int            sErrCode;
    char           sErrMsg[1024];


    rc = dbmInitHandle( &sHandle, "demo" );

    sData.c1 = 10;
    sData.c2 = 100;
    rc = dbmInsertRow( sHandle, "t1", &sData, sizeof(DATA) );
    if( rc )
    {
        dbmGetErrorMsg( rc, sErrMsg, sizeof(sErrMsg) );
    }

}

dbmGetTableUsage

기능

특정 테이블의 segment 정보를 반환한다.

인자

int dbmGetTableUsage( dbmHandle       * aHandle,
                      const char      * aTableName,
                      long            * aMaxSize,
                      long            * aTotalSize,
                      long            * aUsedSize,
                      long            * aFreeSize )

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

const char *

In

대상 테이블 이름이다.

aMaxSize

long *

Out

테이블을 생성할 때 지정한 최대 row 개수이다.

aTotalSize

long *

Out

테이블의 확장된 상태를 포함하여 현재 저장 가능한 최대 row 개수이다.

aUsedSize

long *

Out

테이블에 현재 사용 중인 row 개수이다. (Commit 되지 않은 row를 포함할 수 있음)

aFreeSize

long *

Out

테이블 가용 공간의 개수이다. (Commit 되지 않은 row를 포함할 수 있음)

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    long           sTotal;
    long           sMax;
    long           sUsed;
    long           sFree;
    int            rc;

    rc = dbmInitHandle( &sHandle, 
                        "demo" );

    rc = dbmGetTableUsage( sHandle, 
                           "t1", 
                           &sMax, 
                           &sTotal, 
                           &sUsed, 
                           &sFree );
}

dbmGetTableUsageByHandle

기능

주어진 table handle에 해당하는 테이블의 segment 정보를 반환한다.

Direct 테이블의 경우, 각 segment 별로 데이터를 가진 최대 slot ID를 구하여 계산되므로 중간에 빈 slot이 있을 경우에도 사용 중인 slot으로 계산될 수도 있다.

인자

int dbmGetTableUsageByHandle( dbmHandle       * aHandle,
                              dbmTableHandle  * aTableHandle,
                              long            * aMaxSize,
                              long            * aTotalSize,
                              long            * aUsedSize,
                              long            * aFreeSize );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

aMaxSize

long *

Out

테이블을 생성할 때 지정한 최대 row 개수이다.

aTotalSize

long *

Out

테이블의 확장된 상태를 포함하여 현재 저장 가능한 최대 row 개수이다.

aUsedSize

long *

Out

테이블에 현재 사용 중인 row 개수이다. (Commit 되지 않은 row를 포함할 수 있음)

aFreeSize

long *

Out

테이블 가용 공간의 개수이다. (Commit 되지 않은 row를 포함할 수 있음)

사용 예

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;
    long             sTotal;
    long             sMax;
    long             sUsed;
    long             sFree;
    int              rc;

    rc = dbmInitHandle( &sHandle, 
                        "demo" );

    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );

    rc = dbmGetTableUsage( sHandle, 
                           sTableHandle, 
                           &sMax, 
                           &sTotal, 
                           &sUsed, 
                           &sFree );
}

해당 값은 스냅샷이므로 테이블에 삽입/ 삭제가 발생하는 도중에는 그 값이 정확하지 않다.

DIRECT TABLE은 마지막으로 입력된 최종 위치만 기록하기 때문에 중간에 삭제될 경우에는 값이 정확하지 않을 수 있다.

dbmExtendTable

기능

주어진 table handle에 해당하는 테이블에 새 segment를 추가한다.
새 segment의 크기는 CREATE TABLE 시 지정된 extend size 이다.

인자

int dbmExtendTable( dbmHandle       * aHandle,
                    dbmTableHandle  * aTableHandle );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableHandle

dbmTableHandle *

In

대상 테이블의 핸들이다.

사용 예

main()
{
    dbmHandle      * sHandle = NULL;
    dbmTableHandle * sTableHandle = NULL;

    rc = dbmInitHandle( &sHandle, 
                        "demo" );

    rc = dbmPrepareTableHandle( sHandle,
                                "t1",
                                & sTableHandle );

    rc = dbmExtendTable( sHandle, 
                         sTableHandle );
}

dbmExistDataInQue

기능

지정된 queue table에 데이터가 존재하는지 여부를 반환한다.

인자

int dbmExistDataInQue( dbmHandle       * aHandle,
                       const char      * aTableName,
                       int             * aExists );

인자 항목

타입

In/ out

비고

aHandle

dbmHandle *

In

dbmInitHandle로 처리된 변수이다.

aTableName

const char *

In

대상 queue table 이름이다.

aExists

int *

Out

  • 0: 존재하지 않는다.

  • 1: 한 개 이상의 데이터가 존재한다.

사용 예

main()
{
    dbmHandle    * sHandle = NULL;
    int            i;


    rc = dbmInitHandle( &sHandle, "demo" );

    rc = dbmExistDataInQue( sHandle, "que1", &i );
}

일반 테이블에 대해서는 사용할 수 없고 queue type 테이블만 지원한다.

dbmNow

기능

현재 시각을 반환한다.

인자

unsigned long dbmNow( void )

사용 예

#include <dbmUserAPI.h>
#include <common.h>




typedef struct
{
    int c1;
    unsigned long c2;
} DATA;


int main()
{
    DATA   sData;

    
    sData.c1 = 1;
    sData.c2 = dbmNow();
    rc = dbmInsertRow( sHandle, "t1", &sData, sizeof(sData) );
    TEST_ERR( sHandle, rc, "InsertFail" );


    sData.c1 = 1;
    rc = dbmSelectRow( sHandle, "t1", &sData );
    TEST_ERR( sHandle, rc, "SelectFail" );


    tt =sTimeVal.tv_sec;
    nowtm = localtime( &tt );
    strftime( buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", nowtm);

    printf( "fetchData: c1=%d, c2=%s.%06ld\n", sData.c1, buf, sTimeVal.tv_usec );
}

Error Message

GOLDILOCKS LITE에 정의된 에러 메시지는 다음 표와 같다.

Error defined name

Error code

Detail message

Description

DBM_ERRCODE_INVALID_ARGS

70001

fail to validate some parameters at internal processing

-

DBM_ERRCODE_MEMORY_NOT_SUFFICIENT

70002

fail to alloc memory from OS (errno=%d)

-

DBM_ERRCODE_FAIL_TO_ALLOC_MEMORY

70003

fail to alloc memory from dbmAllocator

-

DBM_ERRCODE_NOT_IMPL

70004

not implemented

-

DBM_ERRCODE_ALREADY_SHM_EXIST

70005

a shared memory already exists

-

DBM_ERRCODE_CREATE_SHM_FAIL

70006

fail to create a shared memory segment

-

DBM_ERRCODE_INIT_SHM_FAIL

70007

fail to initialize a shared memory segment

-

DBM_ERRCODE_ATTACH_SHM_FAIL

70008

fail to attach a shared memory segment

-

DBM_ERRCODE_SHM_OPEN_FAIL

70009

fail to open a shared memory

-

DBM_ERRCODE_SHM_FSTAT_FAIL

70010

fail to get a information of shm

-

DBM_ERRCODE_SHM_INVALID_SIZE

70011

invalid segment size to attach a shm

-

DBM_ERRCODE_MMAP_FAIL

70012

fail to call a mmap to attach a shared memory segment

-

DBM_ERRCODE_DETACH_SHM_FAIL

70013

fail to detach a shared memory segment

-

DBM_ERRCODE_DROP_FAIL

70014

fail to drop a shared segment memory

-

DBM_ERRCODE_CREATE_SHM_DIR_FAIL

70015

fail to create a directory for shared-memory

-

DBM_ERRCODE_INVALID_SLOT_NO

70016

invalid slot number (SlotId=%ld)

-

DBM_ERRCODE_NO_EXIST_DIC

70017

fail to attach dictionary (execute initdb)

-

DBM_ERRCODE_NOT_DEF_INSTANCE

70018

a operation not allowed without instance

-

DBM_ERRCODE_NOT_EXIST_TABLE

70019

(%s) table not exists

-

DBM_ERRCODE_NOT_EXIST_COLUMN

70020

(%s) Column not exists

-

DBM_ERRCODE_MAX_SEGMENT

70021

a segment has no space to extend because of reached max_segment

-

DBM_ERRCODE_NO_SPACE

70022

a segment has no space to extend because of reached max_size

-

DBM_ERRCODE_CONNECT_FAIL

70023

fail to connect target server

-

DBM_ERRCODE_SEND_FAIL

70024

fail to send a packet

-

DBM_ERRCODE_RECV_FAIL

70025

fail to receive a packet

-

DBM_ERRCODE_HB_FAIL

70026

fail to send or receive a packet for HB

-

DBM_ERRCODE_INIT_HANDLE_FAIL

70027

fail to initialize a handle

-

DBM_ERRCODE_ALLOC_HANDLE_FAIL

70028

fail to alloc a memory for handle

-

DBM_ERRCODE_NEED_VALUE_NULL

70029

a pointer have to be set null to initialize a handle

-

DBM_ERRCODE_FREE_HANDLE_FAIL

70030

fail to free a handle

-

DBM_ERRCODE_ALLOC_STMT_FAIL

70031

fail to alloc a memory for statement

-

DBM_ERRCODE_INIT_PARSE_CTX_FAIL

70032

fail to alloc a memory for parser-context

-

DBM_ERRCODE_EXECUTE_FAIL

70033

fail to execute a statement

-

DBM_ERRCODE_INVALID_STMT_TYPE

70034

invalid stmt type

-

DBM_ERRCODE_INVALID_PLAN_TYPE

70035

invalid plan type

-

DBM_ERRCODE_INVALID_DATA_TYPE

70036

invalid data type

-

DBM_ERRCODE_INVALID_TABLE_SIZE_OPTION

70037

invalid table size option

-

DBM_ERRCODE_PREPARE_FAIL

70038

"fail to prepare a statement

-

DBM_ERRCODE_FREE_STMT_FAIL

70039

fail to finalize a stmt

-

DBM_ERRCODE_INVALID_EXPR_TYPE

70040

invalid expr type

-

DBM_ERRCODE_ALLOC_MEM_FAIL

70041

fail to alloc a memory for something

-

DBM_ERRCODE_INVALID_BUILT_FUNC

70042

invalid built-in function

-

DBM_ERRCODE_INVALID_SEGMENT

70043

invalid segment

-

DBM_ERRCODE_ALLOC_TRANS_FAIL

70044

fail to alloc a trans for current-session

-

DBM_ERRCODE_DATA_COUNT_MISMATCH

70045

the number of binding-data mismatch to target-list

-

DBM_ERRCODE_INVALID_COLUMN

70046

(%s) column not exists

-

DBM_ERRCODE_INVALID_EXPR

70047

invalid expression type

-

DBM_ERRCODE_CONVERT_DATA_FAIL

70048

fail to convert a data as invalid data-type or value-size or origin-value etc.

-

DBM_ERRCODE_BINDING_COL_FAIL

70049

fail to bind a column (%s)

-

DBM_ERRCODE_CONVERT_OVERFLOW

70050

fail to convert data as overflow

-

DBM_ERRCODE_NO_MORE_DATA

70051

no more data to fetch

-

DBM_ERRCODE_DIVIDE_BY_ZERO

70052

a operation can not be executed because of divide by zero

-

DBM_ERRCODE_INVALID_GROUP_BY

70053

invalid group-by or target-list to execute group-by

-

DBM_ERRCODE_NOT_EXIST_INDEX

70054

index not exist (%s)

-

DBM_ERRCODE_INDEX_DUPLICATED

70055

index key value duplicated (%s)

-

DBM_ERRCODE_INDEX_KEY_NOT_FOUND

70056

index key not found (%s)

-

DBM_ERRCODE_INVALID_LOG_TYPE

70057

invalid log type

-

DBM_ERRCODE_DUP_COLUMN_NAME

70058

(%s) column duplicated

-

DBM_ERRCODE_INVALID_DATA_SIZE

70059

invalid data size (Limit=%d : InputSize=%d)

-

DBM_ERRCODE_CHANGE_SCN_FAIL

70060

fail to change SCN of row (Segment=%s, SlotId=%ld)

-

DBM_ERRCODE_INVALID_SCN

70061

invalid scn (SCN=%ld)

-

DBM_ERRCODE_COMMIT_PROC_FAIL

70062

fail to process a function to commit (log=%s)

-

DBM_ERRCODE_ROLLBACK_PROC_FAIL

70063

"fail to process a function to rollback (log=%s)

-

DBM_ERRCODE_DUP_INDEX_KEY_COLUMN

70064

a index with same ordering key was already created (%s)

-

DBM_ERRCODE_DUP_COLUMN_DEFINED

70065

a column definition duplicated (%s)

-

DBM_ERRCODE_OPEN_DISK_LOG_FAIL

70066

fail to open a disk logfile (%s) (errno=%d)

-

DBM_ERRCODE_LSEEK_DISK_LOG_FAIL

70067

fail to locate a position of disk logfile (%s) (errno=%d)

-

DBM_ERRCODE_SWITCH_DISK_LOG_FAIL

70068

fail to switch a disk logfile

-

DBM_ERRCODE_WRITE_DISK_LOG_FAIL

70069

fail to write a disk logfile (errno=%d)

-

DBM_ERRCODE_FSYNC_DISK_LOG_FAIL

70070

fail to sync a disk logfile (errno=%d)

-

DBM_ERRCODE_READ_DISK_LOG_FAIL

70071

fail to read from a disk logfile (errno=%d)

-

DBM_ERRCODE_INVALID_DISK_LOG

70072

invalid disk log block

-

DBM_ERRCODE_INVALID_TABLE_TYPE

70073

a operation can not be executed on target-table (check table type)

-

DBM_ERRCODE_NOT_ALLOWED_COLUMN

70074

column(ID, INTIME) can not be specified at target-list when target table is queue-type

-

DBM_ERRCODE_INVALID_INDEX_STAT

70075

a index (%s) invalid stat, need to rebuild index

-

DBM_ERRCODE_INVALID_TRY

70076

not supported transaction

-

DBM_ERRCODE_INST_ALREADY_EXISTS

70077

a instance already exists

-

DBM_ERRCODE_INDEX_ALREADY_EXISTS

70078

a index already exists

-

DBM_ERRCODE_ALREADY_EXISTS_TABLE

70079

a table already exists

-

DBM_ERRCODE_DEAD_LOCK_DETECT

70080

a dead-lock detection

-

DBM_ERRCODE_TOO_LONG_NAME

70081

a length of object too long (max %d bytes)

-

DBM_ERRCODE_INVALID_BIND_PARAM

70082

invalid binding parameters (index or name not exist)

-

DBM_ERRCODE_MISMATCH_BIND_COL

70083

invalid binding column count

-

DBM_ERRCODE_NEED_DICT_HANDLE

70084

this operation can be executed by a dictionary handle.

-

DBM_ERRCODE_NOT_EXISTS_INST

70085

a instance not exists

-

DBM_ERRCODE_INVALID_KEY_DATA_TYPE

70086

a index key column must have a data type as (long, char, int, short)

-

DBM_ERRCODE_TIMEOUT

70087

a timeout raised on this operation

-

DBM_ERRCODE_NOT_ALLOWED_OPERATION

70088

this operation not allowed at current-instance

-

DBM_ERRCODE_TOO_BIG_ROWSIZE

70089

a total size of columns is too big to create

-

DBM_ERRCODE_NEED_COMMIT_OR_ROLLBACK

70090

fail to free a statement variable as transaction not completed

-

DBM_ERRCODE_TOO_BIG_TO_WRITE_LOG

70091

a log-size is too big to write a transaction log

-

DBM_ERRCODE_FAIL_TO_PARSE

70092

fail to parse a syntax

-

DBM_ERRCODE_NEED_INDEX

70093

a operation via API need a index

-

DBM_ERRCODE_INVALID_SEQ_OPTION

70094

a invalid number or range for sequence

-

DBM_ERRCODE_SEQUENCE_MAXVALUE

70095

a sequence reached at max-value

-

DBM_ERRCODE_SEQUENCE_NOT_DEF_CURRVAL

70096

a currval of sequence not yet defined (need to call nextval)

-

DBM_ERRCODE_NOT_ENOUGH_BUFF

70097

not enough buffer size

-

DBM_ERRCODE_INVALID_LICENSE

70098

invalid license

-

DBM_ERRCODE_INVALID_OFFSET

70099

invalid offset

-

DBM_ERRCODE_TOO_MANY_ROWS

70100

too many rows

-

DBM_ERRCODE_CHECK_DIC_FAIL

70101

fail to check dictionary"

-

DBM_ERRCODE_THREAD_FAIL

70102

fail to invoke a thread

-

DBM_ERRCODE_FILE_READ_FAIL

70103

fail to read

-

DBM_ERRCODE_FILE_WRITE_FAIL

70104

fail to write

-

DBM_ERRCODE_NOT_ACTIVE_INSTANCE

70105

a instance not active-mode

-

DBM_ERRCODE_DIRECT_INVALID_KEY_DATA_TYPE

70106

a index key column must have a data type as (long, int, short)

-

DBM_ERRCODE_DIRECT_NEED_INDEX

70107

at first, need to create a index to use a direct table

-

DBM_ERRCODE_FAIL_TO_PREPARE_DISK_LOG

70108

fail to prepare a disk logfile

-

DBM_ERRCODE_FAIL_TO_PREPARE_REPL

70109

fail to prepare replication

-

DBM_ERRCODE_FAIL_TO_PREPARE_TABLE

70110

fail to prepare a table

-

DBM_ERRCODE_NOT_FOUND

70111

no data found

-

DBM_ERRCODE_REPL_NOT_CONNECTED

70112

a replication-session not connected

-

DBM_ERRCODE_TOO_MANY_RESULT

70113

a result-set has too many rows to process

-

DBM_ERRCODE_NOT_EXIST_PROC

70114

a procedure not found

-

DBM_ERRCODE_ALREADY_EXIST_PROC

70115

a procedure already exists

-

DBM_ERRCODE_INVALID_IDENTIFIER

70116

invalid identifier

-

DBM_ERRCODE_CASE_NOT_FOUND

70117

case not found

-

DBM_ERRCODE_CURSOR_ALREADY_OPENED

70118

a cursor already opened

-

DBM_ERRCODE_CURSOR_NOT_OPENED

70119

a cursor not opened

-

DBM_ERRCODE_EXCEPTION_DUPLICATED

70120

a exception duplicated(Line=%d,Column=%d)

-

DBM_ERRCODE_RAISE_USER_EXCEPTION

70121

a user exception raised

-

DBM_ERRCODE_UNHANDLE_EXCEPTION

70122

unhandled exceptions

-

DBM_ERRCODE_PREPARE_PROCEDURE

70123

fail to prepare a object/statement of procedure (Line=%d, Column=%d)

-

DBM_ERRCODE_EXIT_ONLY_AT_LOOP

70124

a exit/continue statement is able to be used in loop-statement

-

DBM_ERRCODE_EXECUTE_PROC_FAIL

70125

fail to execute a procedure statement (Line=%d)

-

DBM_ERRCODE_CHANGED_PLAN

70126

changed index after dbmPrepareStmt

-

DBM_ERRCODE_ALREADY_ATTACH_TID

70127

current thread-id already attached at (Trans=%d)

-

DBM_ERRCODE_TOO_MANY_SEGMENT_EXTEND

70128

a count of segment expected too many chunk. (need less than 999)

-

DBM_ERRCODE_GET_SEMAPHORE

70129

error get semaphore (id=%ld)

-

DBM_ERRCODE_CURSOR_API_ALREADY_OPENED

70130

open cursor api already executed

-

DBM_ERRCODE_CURSOR_API_ALREADY_CLOSED

70131

close cursor api already executed

-

DBM_ERRCODE_DDL_RAISED

70132

a handle of table re-prepared as ddl executed

-

DBM_ERRCODE_BEGIN_TRANS_STAT

70133

a operation can not be executed as other transaction (transId=%d) already began

-

DBM_ERRCODE_NEED_NO_TX_AT_DDL

70134

a operation can not be executed as previous transaction need commit or rollback

-

DBM_ERRCODE_ALREADY_EXIST_LIB

70135

a library already exists

-

DBM_ERRCODE_NOT_EXIST_LIB

70136

a function not exists

-

DBM_ERRCODE_EXECUTE_USER_FUNC_FAIL

70137

fail to execute a user function (%s:RetCode=%d)

-

DBM_ERRCODE_INVALID_TIME_OPTION

70138

invalid time option

-

DBM_ERRCODE_PORT_OUT_OF_RANGE

70139

port out of range

-

DBM_ERRCODE_CLIENT_MAX_OUT_OF_RANGE

70140

client max out of range

-

DBM_ERRCODE_PROCESS_MAX_OUT_OF_RANGE

70141

process max out of range

-

DBM_ERRCODE_PROCESS_MIN_OUT_OF_RANGE

70142

process min out of range

-

DBM_ERRCODE_PROCESS_CNT_OUT_OF_RANGE

70143

process count out of range

-

DBM_ERRCODE_QUEUE_SIZE_OUT_OF_RANGE

70144

queue size out of range

-

DBM_ERRCODE_GSB_CREATE_FAIL

70145

create gsb failed

-

DBM_ERRCODE_GSB_DROP_FAIL

70146

drop gsb failed

-

DBM_ERRCODE_INVALID_JSON_KEY_VALUE

70147

a key value has not to be json-object or array

-

DBM_ERRCODE_INVALID_JSON_VALUE

70148

invalid json key-string or valueOrType

-

DBM_ERRCODE_ALREADY_EXISTS_REPL

70149

a replication name already exists

-

DBM_ERRCODE_INVALID_DIRECT_TABLE_INDEX

70150

a column is not valid as index in direct-table

-

DBM_ERRCODE_INVALID_REPL_DIR

70151

a value of unsent_dir property is not matched between anchor-file and property-file

-

DBM_ERRCODE_INVALID_PROP

70152

a property(%s) is not found or invalid value

-

DBM_ERRCODE_NEED_JOIN_INDEX

70153

a join table need index

-

DBM_ERRCODE_DDL_NOT_ALLOWED_IN_REPL

70154

a DDL not allowed as a table involved in replication

-

DBM_ERRCODE_NEED_INDEX_ON_OPERATION

70155

a operation can not executed as some table need unique-index"

-

DBM_ERRCODE_ODBC_CALL_FAIL

70156

fail to call ODBC_LIB (Detail:%s)

-

DBM_ERRCODE_NOT_EXIST_DSN

70157

a dsn not exists

-

DBM_ERRCODE_ODBC_LIB_OPEN_FAIL

70158

fail to open odbc-library

-

DBM_ERRCODE_ODBC_GET_SYMBOL_FAIL

70159

fail to get a function symbol of mapping ODBC API

-

DBM_ERRCODE_INVALID_JSON_KEY_SIZE

70160

a json key is too long

-

DBM_ERRCODE_ERROR_HTTP

70161

http failed

-

DBM_ERRCODE_INVALID_LIMIT_OPTION

70162

invalid limit option

-

DBM_ERRCODE_NOT_ALLOWED_UPDATE

70163

a update operation not allowed on a record with expired-time

-