V3 신규 기능
dbmMetaManager 내에서 일부 SQL 문을 사용할 수 있다.
Information view를 통한 session, transaction 등의 상태를 SQL 형태로 조회할 수 있다.
Package 변경사항
모든 binary utility 이름의 prefix를 dbm으로 사용하도록 변경 (예: metaManager → dbmMetaManager)
dbmAPI.h → dbmUserAPI.h 로 명칭 변경
libdbm.so → libdbmCore.so 로 Shared Library Object 명칭 변경
기존 WAL → wal 경로로 변경
DB Object Conversion Guide
SQL 조건절 강화
Ver2 대비 SQL 형태의 질의 처리가 가능하며 조건절에 AND, OR과 같은 논리 연산이 가능하다.
(>, < , =, !=, NOT, IN)과 같은 연산을 지원한다.
제공되는 built-in 함수를 통한 질의 처리가 가능하다.
Full-scan을 통한 질의 처리가 가능하다.
INDEX
V2 버전에서는 unique index의 기본값을 다음과 같이 설정하여 생성한다. • create index: Unique index로 설정 • create non unique: Non unique index로 설정
V3 버전에서는 SQL 구문과 동일하게 기본값을 non-unique로 설정한다. • create unique index: Unique index로 설정 • create index: Non unique index로 설정
기타 제한은 V2와 V3 모두 동일하다.
DROP INSTANCE
V2에서는 하위 object를 제거할 수 없었지만 V3에서는 하위 object를 모두 제거하므로 사용할 때 주의해야 한다.
CREATE INSTANCE
Dictionanry instance (DICT)에서만 수행할 수 있다.
V2에서는 CREATE INSTANCE를 수행할 때 자동으로 전환되었지만 V3에서는 반드시 SET INSTANCE를명시한 경우에만 전환된다.
JOIN 처리 (두 개 테이블로 제한)
dbmMetaManager(DEMO)> select * from t1 a, t2 b where a.c1 = b.c1; --------------------------------------------------------------------------------- C1 : 1 C2 : 1 C1 : 1 C2 : 11 --------------------------------------------------------------------------------- C1 : 2 C2 : 2 C1 : 2 C2 : 22 --------------------------------------------------------------------------------- C1 : 3 C2 : 3 C1 : 3 C2 : 33 --------------------------------------------------------------------------------- C1 : 4 C2 : 4 C1 : 4 C2 : 44 --------------------------------------------------------------------------------- C1 : 5 C2 : 5 C1 : 5 C2 : 55 --------------------------------------------------------------------------------- 5 row selected dbmMetaManager(DEMO)> select a.c1, a.c2, b.c2 from t1 a, t2 b where a.c1 > 2 and a.c1 = b.c1; --------------------------------------------------------------------------------- C1 : 3 C2 : 3 C2 : 33 --------------------------------------------------------------------------------- C1 : 4 C2 : 4 C2 : 44 --------------------------------------------------------------------------------- C1 : 5 C2 : 5 C2 : 55 --------------------------------------------------------------------------------- 3 row selected
제한된 조건 내에서 두 개 테이블에 한해 JOIN 방식을 사용할 수 있다.
API 방식으로 사용할 경우 dbmPrepareStmt/dbmExecuteStmt/dbmFetchStmt API를 통해 사용할 수 있다.
Procedure 지원
SQL을 이용한 절차형 개발 방식을 제공한다.
Function은 지원하지 않는다.
dbmMetaManager(unknown)> initdb
success
dbmMetaManager(unknown)> set instance dict
success
dbmMetaManager(DICT)> create instance demo
success
dbmMetaManager(DICT)> set instance demo
success
dbmMetaManager(DEMO)> create table t1 (c1 int, c2 char(20), c3 double)
success
dbmMetaManager(DEMO)> create unique index idx_t1 on t1 (c1)
success
dbmMetaManager(DEMO)> insert into t1 values (1, 'a', 1.5 )
success
dbmMetaManager(DEMO)> insert into t1 values (2, 'b', 2.5 )
success
dbmMetaManager(DEMO)> insert into t1 values (3, 'c', 3.5 )
success
dbmMetaManager(DEMO)> insert into t1 values (4, 'd', 4.5 )
success
dbmMetaManager(DEMO)> insert into t1 values (5, 'e', 5.5 )
success
dbmMetaManager(DEMO)> commit
success
dbmMetaManager(DEMO)> create or replace procedure proc1()
is
v1 int;
v2 char(20);
v3 double;
v4 t1%rowtype;
cursor c1 (a1 int, a2 double )
is select * from t1 where c1 >= a1 and c3 > a2;
begin
open c1 (2, 3);
loop
fetch c1 into v1, v2, v3;
exit when c1%notfound;
dbms_output.put_line( 'v1 = ' || v1 || ', v2 = ' || v2 || ', v3 = ' || v3 || ', RowCount=' || c1%rowcount );
end loop;
close c1;
open c1 (2, 3);
loop
fetch c1 into v4;
exit when c1%notfound;
dbms_output.put_line( 'c1 = ' || v4.c1 || ', c2 = ' || v4.c2 || ', c3 = ' || v4.c3 || ', RowCount=' || c1%rowcount );
end loop;
end;
/
success
dbmMetaManager(DEMO)> exec proc1
v1 = 3, v2 = c, v3 = 3.500000, RowCount=1
v1 = 4, v2 = d, v3 = 4.500000, RowCount=2
v1 = 5, v2 = e, v3 = 5.500000, RowCount=3
c1 = 3, c2 = c, c3 = 3.500000, RowCount=1
c1 = 4, c2 = d, c3 = 4.500000, RowCount=2
c1 = 5, c2 = e, c3 = 5.500000, RowCount=3
success
dbmMetaManager(DEMO)> quit기타 변경사항
Object 이름들에서 더이상 대/소문자를 구별하지 않음
레코드 한 개당 최대 저장 크기가 30 K로 확장
DBM_DISK_LOG_BUFFER_SIZE 항목을 제거 (메모리가 허용하는 한도로 변경하였다.)
API Conversion Guide
이 장에서는 V2 버전에서 V3 버전으로 변환할 때 참고할 사항들을 설명한다.
dbmHandle 처리
V2 코드
dbmHandle sHandle; dbmInitHandle( &sHandle, "DEMO" );
V3 코드
dbmHandle * sHandle = NULL; dbmInitHandle( &sHandle, "DEMO" );
dbmHandle 변수가 pointer 형태로 변경된다.
해당 변수는 반드시 NULL로 초기화 된 상태에서 호출되어야 한다.
Instance name을 기술하는 위치에서 더이상 대/소문자를 구별하지 않게 되었다.
Instance name을 NULL로 기술할 경우, 자동적으로 사용자 환경변수 (DBM_INSTANCE)를 사용한다.
일반 API에서 EX로 동작하던 기능들을 포함하여 API_Ex로 제공되는 API들이 모두 제거되었다.
dbmPrepareTable
호환성을 위해 제공은 하지만 더 이상 호출은 하지 않고 최초 API에서 필요한 경우에 자동으로 처리된다. 다만 성능을 위해 별도로 제공되는 dbmPrepareTableHandle API 사용을 권장한다.
dbmInsertRow
삽입된 레코드의 slot ID를 반환하는 인자가 추가되었다.
대상 테이블 이름에서 더 이상 대/소문자를 구별하지 않게 되었다.
dbmUpdateRow
V2 코드
dbmHandle sHandle; UserData sData; dbmUpdateRow( &sHandle, "T1", &sData );
V3 코드
dbmHandle * sHandle = NULL; UserData sData; int sAffectedCount; dbmUpdateRow( sHandle, "t1", &sData, &sAffectedCount );
대상 테이블 이름에서 더이상 대/소문자를 구분하지 않게 되었다.
(Non unique index를 지정한 경우) 마지막 인자에 update 된 대상 row의 개수를 반환한다.
dbmDeleteRow
V2 코드
dbmHandle sHandle; UserData sData; dbmDeleteRow( &sHandle, "T1", &sData );
V3 코드
dbmHandle * sHandle = NULL; UserData sData; int sAffectedCount; dbmDeleteRow( sHandle, "t1", &sData, &sAffectedCount );
대상 테이블 이름에서 더이상 대/소문자 구별을 하지 않게 되었다.
(Non unique index를 지정한 경우) 마지막 인자에 delete 된 대상 row의 개수를 반환한다.
dbmOpenCursor(GT/LT)
V2 코드
dbmHandle sHandle; UserData sData; dbmOpenCursor( &sHandle, "T1", &sData ); dbmFetchRow( &sHandle, "T1", &sData );
V3 코드
dbmHandle * sHandle = NULL; UserData sData; int sAffectedCount; dbmSelectRow( sHandle, "t1", &sData ); // dbmSelectRowGT, dbmSelectRowLT dbmFetchNextGT( sHandle, "t1", &sData );
대상 테이블 이름에서 더이상 대/소문자 구분을 하지 않게 되었다.
OpenCursor는 non-unique index에 대해 동일한 키를 가진 데이터를 조회하는 용도로 사용되지만 V3에서는 dbmSelectRow를 통해 첫 번째로 일치하는 데이터를 찾은 후에 dbmFetchNextGT/LT 함수들을 통해 다음 데이터를 탐색할 수 있다.
단순한 조회만 목적으로 할 경우, 다음과 같이 SQL문을 활용하여 조회할 수도 있다.
dbmInitHandle * sHandle = NULL;
dbmStmt * sStmt = NULL;
int v1;
int v2;
dbmPrepareStmt( sHandle, "select * from t1 where c1 > 10 and c1 < 20", &sStmt );
dbmBindCol( sHandle, sStmt, &v1 );
dbmBindCol( sHandle, sStmt, &v2 );
dbmExecuteStmt( sHandle, sStmt );
while( !dbmFetchStmt( sHandle, sStmt ) )
{
printf( "v1 = %d, v2 = %d\n", v1, v2 );
}dbmBindCol는 조회하기 위해 fetch된 column을 저장할 변수를 연결하는 과정이며 select 된 target절의 타입과 동일한 순서로 기술한다.
dbmSelectRowDirtyRead 계열 함수
V3에서는 V2와 달리 commit 하는 도중에 Multi Versioning Concurrency Control (MVCC) 기법을 통해 read consistency를 보장하므로 더 이상 해당 API는 필요하지 않아 모두 제거된다. 동일한 방법으로 dbmSelectRow 함수를 통해 read를 보장한다.
dbmDeferCommit. dbmDeferSync API 제거
V1에서 제공되던 일부 API들은 더 이상 제공되지 않는다.