API 공통사항
모든 API 호출은 정상 처리 결과를 "0"으로 반환하며 오류에는 개별 상황에 따른 에러코드를 반환한다.
Compile 할 때 $DBM_HOME/include/dbmUserAPI.h을 사용자가 작성한 Makefile 내에 포함해야 한다.
Linking 할 때 $DBM_HOME/lib/libdbmCore.so을 사용자가 작성한 Makefile 내에 포함해야 하며 사용자 환경 변수인 LD_LIBRARY_PATH에도 추가해야 한다.
모든 API 동작은 non-autoCommit 모드이기 때문에 select를 제외한 트랜잭션 마지막에는 dbmCommit 또는 dbmRollback을 호출해야 반영이 완료된다.
다른 API와 달리 dbmExecuteStmt로 수행된 결과에 결과 집합이 없을 경우에는 NOT_FOUND 오류를 반환하지 않으므로 dbmGetRowCount를 통해 결과 개수를 확인해야 한다.
API는 TableName을 이용하거나 dbmTableHandle을 이용하는 두 가지 유형이 있으므로 API 상세 spec을 참고하여 적절한 유형을 사용해야 한다.
dbmInitHandle
기능
API 사용을 위한 handle 초기화 작업을 수행한다. 모든 API를 사용하기 위해 반드시 선행되어 호출되어야 한다. dbmInitHandle 내에서는 아래의 과정을 내부적으로 수행한 후 성공/실패를 반환한다.
Process 정보 저장
Undo space 할당
Dictionary 준비
트랜잭션 처리를 위한 내부 공간 할당
인자
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을 실행 직전 단계로 만든다.
구문 분석
Object 정합성 등의 validation 수행
DDL/ DML을 모두 사용할 수 있다. (단, commit/ rollback 구문은 지원하지 않는다.)
인자
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 );
}SQL 내에서 parameter를 기술하는 방법은 다음 두 가지인데 섞어서 쓸 수는 없으며 한 가지 형태로만 나열해야 한다.
Marker (?) 를 이용하여 순서대로 나열하는 방법
:v1 과 같이 이름을 명시하는 방법
dbmStmt는 (void *) 형태 변수로 dbmPrepareStmt는 prepared 된 결과를 dbmStmt 변수에 반환한다.
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 한다.
사용자 변수는 input mode로만 사용할 수 있다.
Binding 되는 변수의 pointer를 지정해야 하며 dbmPrepareStmt와 dbmExecuteStmt 사이에 호출한다.
길이 정보를 포함하는 변수를 지정하지 않을 경우, CHAR 타입은 실행 시점에 바인딩 된 변수의 string length를 구해 실행한다. 따라서 NULL을 포함하지 않는 변수일 경우 알 수 없는 오류가 발생할 수 있다. 그 외의 타입은 NULL로 지정할 수 있다.
인자
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;
일반 int 변수 bind
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 한다.
사용자 변수는 input mode로만 사용할 수 있다.
Binding 되는 변수의 pointer를 지정해야 하며 dbmPrepareStmt와 dbmExecuteStmt 사이에 호출한다.
인자
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 구문에 의해 수행된 결과를 저장하기 위한 사용자 변수와 매핑하는 역할을 수행한다.
dbmExecuteStmt에 의해 수행된 질의가 select 구문이어야 한다.
실제 select target 절의 데이터 크기와 사용자 변수의 크기가 다르므로 결과를 복사할 때 오류가 발생하지 않도록 주의해야 한다.
인자
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과 동일하다. 다만 사용자가 정의한 구조체 변수로 반환받고자 할 때 사용한다는 차이가 있다.
dbmExecuteStmt에 의해 수행된 질의가 select 구문이어야 한다.
구조체를 한 개만 binding 할 수 있고 dbmBindCol과 혼용하여 사용할 수 없다.
실제 select target 절의 데이터 크기와 사용자 변수의 크기가 다른 경우 메모리 침범등의 오류가 발생할 수 있으므로 target 절이 모두 column이거나 구조체가 반환되는 target 절의 크기와 일치하는 경우에 사용할 수 있다.
인자
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" );Prepare select stmt
c1 = 10;
rc = dbmPrepareStmt( sHandle,
"select * from t1 where c1 = ?",
& sStmt );
TEST_ERR( sHandle, rc, "prepareStmt" );조건절 binding
rc = dbmBindParamById( sHandle,
sStmt,
1,
DBM_BIND_DATA_TYPE_INT,
&c1,
NULL );
TEST_ERR( sHandle, rc, "selectBindParam" );Target binding
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 문 조회 결과를 한 건씩 가지고 온다.
Select 문이 아닌데 호출될 경우 오류가 발생한다.
dbmBindCol에 의해 미리 사용자 변수가 지정되어야 하며 잘못 설정된 경우 오류가 발생한다.
인자
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로 가져온다.
Select 문이 아닌데 호출될 경우 오류가 발생한다.
입력된 버퍼의 크기는 충분히 크게 할당하여 사용해야 한다.
인자
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
기능
한 건 이상의 사용자 데이터를 갱신한다.
Key를 갱신하지 않고 데이터만 갱신할 경우에 빠르게 처리하기 위해 호출한다.
Before/ after의 update로 인해 key column의 값이 갱신될 경우, dbmPrepareStmt/ dbmExecuteStmt를 통해 수행해야 한다.
인자
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이 아닐 경우
|
사용 예
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" );
}Date 값을 string format으로 변환한다.
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.214220API에 의해 변경된 시간정보가 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 |
|
aScanType | dbmScanType | in |
|
사용 예
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 |
|
aScanType | dbmScanType | in |
|
사용 예
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 종류는 다음과 같다.
dbmSelectForUpdateRowGT
dbmSelectForUpdateRowLT
dbmFetchNextUpdateRowGT
dbmFetchNextUpdateRowLT
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 형식의 테이블에 삽입한다.
한 개의 테이블에 여러 형태의 메시지를 이용하려면 msg-type을 임의의 숫자로 지정한다.
Priority가 더 낮을 수록 우선순위가 높다.
Msg-type 이나 priority 등이 설정되지 않은 경우에는 모두 0으로 설정된다.
인자
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 );
}Queue에는 (MsgType, Priority, MsgID) 순으로 조합, 정렬되어 저장된다.
MsgType과 priority가 지정되지 않으면 MsgID를 채번한 순서대로 출력된다.
MsgType이 동일할 경우 priority가 가장 작은 순서대로, priority가 동일할 경우에는 MsgID 순서대로 출력된다.
Priority를 입력할 경우 priority 값이 입력된 값 이상인 것들만 출력된다.
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을 입력한다. |
Instance 이름은 필수이다.
TableName을 지정하면 대상 테이블만 복구하고, NULL을 입력하면 instance와 관련된 모든 테이블을 복구한다.
사용 예
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 버전 기준으로 사용자가 생성 가능한 유형은 다음과 같다.
DBM_TABLE_TYPE_TABLE
DBM_TABLE_TYPE_DIRECT_TABLE
DBM_TABLE_TYPE_SPLAY_TABLE
DBM_TABLE_TYPE_HASH_TABLE
사용 예
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 );
}Extend에 의해 확장 가능한 segment의 최대 개수는 999 개이다.
Extend가 빈번하게 발생할 경우 삽입 성능이 저하될 수 있으므로 table 생성 시점에 init 크기를 적절하게 설정해야 한다.
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 |
|
사용 예
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 | - |