본문 바로가기

Windows/MFC

CeDB

3. CeDB
볼륨 마운트 : CeMountDBVol, CeUnmountDBVol

BOOL CeMountDBVol(PCEGUID pguid, LPWSTR lpszVol, DWORD dwFlags);
새로운 볼륨을 만들거나 기존 볼륨을 여는 역활

pguid : 전역 고유 식별자 (데이터베이스 볼륨을 추적하는데 이용되는 핸들)
lpszVol : 마운트할 볼륨 명

dwFlags : 함수가 작동할 방법 정의하는 플래그

CREATE_NEW : 새로운 DB 볼륨 생성 이미 존재하면 FALSE
CREATE_ALWAYS : 새로운 DB 볼륨 생성 이미 존재하면 OVERWRITE
OPEN_EXISTING : DB 볼륨 열기 볼륨이 없으면 FALSE
OPEN_ALWAYS : DB 볼륨 열기 볼륨이 없으면 새로 생성
TRUNCATE_EXISTING : DB을 열고 크기를 0으로 만든다 볼륨이 없으면 FALSE

실패 원인은 GetLastError 로 알수있다.


BOOL CeUnmountDBVol(PCEGUID pguid);
마운트해제


볼륨 찾기 : CeEnumDBVolumes
어떤 볼륨이 마운트 되어 있는지 확인하기
[code]
CEGUID guid;
wchar_t szVolume[MAX_PATH];
int nCnt = 0;

CREATE_INVALIEDGUID(&guid);
while(CeEnumDBVolumes(&guid, szVolume, sizeof(szVolume))
{
    ++nCnt;
}

// guid 에는 마운트된 볼륨의 guid 다 들어가고 szVolume 에 이름이 들어간다.
[/code]


볼륨 플러시 : CeFlushDBVol
데이터베이스 생성 : CeCreateDatabaseEx2

CEOID CeCreateDatabaseEx2(PCEGUID pguid, CEDBASEINFOEX* pinfo);
guid : 디비가 들어있는 마운트된 디비 볼륨을 가르키는 guid
pinfo : CEDBASEINFOEX* 로 구조는 아래와 같다.

[code]
typedef struct _CEDBASEINFOREX
{
    WORD wVersion;
    WORD wNumSortOrder;
    DWORD dwFlags; // 생략
    WCHAR szDbaseName[CEDB_MAXDBASENAMELEN];
    DWORD dwDbaseType;
    DWORD dwNumRecords;
    DWORD dwSize;
    FILETIME ftLastModified; // 생략
    SORTORDERSPECEX rgSortSpecs[CEDB_MAXSORTORDER];
} CEDBASEINFOREX, *PCEDBASEINFOREX;
[/code]

wVersion 는 구조체 버전을 표시하므로 CEDBASEINFOREX_VERSION 으로 줘야한다.
wNumSortOrder 는 rgSortSpecs 가 가르키는 정렬순서 구조체의 개수로 지정한다. 정렬인덱스는 최대 4개까지 가능하다.
dwFlags 는 두 가지 용도로 사용될 수 있으며 어느 필드가 유효한지 나타낼 수 있다.

CEDB_VAILDNAME,
CEDB_VALIDTYPE,
CEDB_VALIDSORTSPEC,
CDDB_VALIDDBFLAGS

가 있다. 디비 생성시 dwFlags 를 CEDB_VALIDCREATE 로 하면 쉽게 작업이 가능하다고 한다.
CEDB_VALIDMODTIME 은 CeOidGetInfo 에서 이 구조체를 사용할 때 쓰인다.

다른 용도로는 디비속성을 지정할 때 쓰이는 데

1. 생성한 디비를 압축하지 않으려 할때 CEDB_NOCOMPRESS
2. 신뢰할 수 없는 플그램에서 디비를 삭제할 수 없도록 CEDB_SYSTEMDB 로 설정할 수 있다.

디비 타입
[code]
Contants 24 (18 hex)
Appointments 25 (19 hex)
Tasks 26 (1A hex)
Categories 27 (1B hex)
[/code]

rgSortSpecs 에는 SORTORDERSPECEX 가 배열로 들어가며 다음과 같이 정의 되어 있다.
typedef struct _SORTORDERSPECEX
{
    WORD wVersion;
    WORD wNumProps;
    DWORD wKeyFlags;
    CEPROPID rgPropID[CEDB_MAXSORTPROP];
    DWORD rgdwFlags[CEDB_MAXSORTPROP];
}SORTORDERSPECEX;

wVersion 은 SORTORDERSPECEX_VERSION 으로 설정해야된다.
wNumProps 는 정렬 규칙에 대한 속성의 개수를 가르킨다.
wKeyFlags 정렬 규칙 특성 정의 (현재는 CEDB_SORT_UNIQUE 뿐)
rgPropID 속성아이디를 담고 있는 구조체 배열이다.
속성아이디는 디비에 있는 속성을 식별하는 데 사용하는 고유한 식별자를 뜻한다.
이 때 속성은 디비 레코드 안에 있는 하나의 필드에 해당하는 것이다.
속성 아이디에는 데이터 타입에 대한 정보를 담고 있는 하위 16비트와 응용 프로그램
에서 정의한 값을 담고있는 상위 16비트로 이루어진 DWORD 값이다.

예로 #define PID_NAME MAKELONG(CEVT_LPWSTR, 1) 식이다.

rgdwFlags 정렬을 어떤방법으로 사용할 것인지에 대한 플래그 배열이다.

CEDB_SORT_DESCENDING
내림차순 정렬

CEDB_SORT_CASEINSENSITIVE
문자열을 대소문자를 무시하고 정렬

CEDB_SORT_UNKNOWNFIRST
이 속성이 없는 레코드를 정렬 순서에서 맨 앞에 놓는다.

CEDB_SORT_IGNORENONSPACE
정렬시 악센트 글자 등과 같은 비 공백 글자를 무시한다. (문자열일때만 유효)

CEDB_SORT_IGNORESYMBOLS
정렬시 기호 글자를 무시 (문자열일때만 유효)

CEDB_SORT_IGNOREKANATYPE
정렬시 일본어 히라가나, 카타가나를 구분하지 않는다.

CEDB_SORT_IGNOREWIDTH
정렬시 동일한 글자가 1바이트로 표현된것과 2바이트로 표현된 것을 구분하지 않는다. (문자전용)

CEDB_SORT_NONNULL
디비에 모든 레코드에 해당 정렬 속성이 존재해야 함을 가리킨다.



데이터베이스 열기 : CeOpenDatabaseEx, CeOpenDatabaseEx2
HANDLE CeOpenDatabaseEx2(PCEGUID pguid, PCEOID poid, LPWSTR lpszName, SORTORDERSPECEX* pSort, DWORD dwFlags, CENOTIFYREQUEST* pRequest);

pguid : 디비가 들어있는 디비볼륨을 가르키는 CEGUID의 포인터
디비는 CEOID 값을 참조하거나 디비 이름을 참조해 열수있다.

이름으로 열려면 poid 매개변수를 0으로 설정하고 lpszName을 준다.
디비의 CEOID를 알고있다면 그 값을 poid 에 넣으면된다.

pSort : 정렬순서 규칙 정의로 디비를 생성할 때 정의한 SORTORDERSPECEX 항목을 넣어야한다.
SORTORDERSPECEX 의 내용이 디비 생성시 사용한 SORTORDERSPECEX 배열 항목과 일치해야만한다.
WINCE는 한번에 한 가지 정렬 순서만 사용할 수 있고 다른 정렬순서를 이용하려면 디비를 다시
열어야 한다.

dwFlags 는 0 또는 CEDB_AUTOINCREMENT 로 지정할 수 있다.

pRequest : 다른 프로세스나 스레드에서 디비를 수정했을 때 그 사실을 통보 받는다.
구조는 아래와 같다.

typedef struct _CENOTIFYREQEUST
{
    DWORD dwSize;
    HWND hWnd;
    DWORD dwFlags;
    HANDLE hHeap;
    DWORD dwParam;
} CENOTIFYREQEUST;

dwSize : 구조체의 크기로 설정한다.
hWnd : 수정 알림 메시지를 받을 윈도우
dwFlags : 알림 메시지를 전달하는 방법을 지정 일반적으로 CEDB_EXNOTIFICATION 을 넣는 게 좋다.
이렇게 하면 CE 시스템이 구조체에 메모리를 할당하여 응용 프로그램에 넘겨준다.
hHeap : 필드에 힙 핸들을 지정하면 그 핸들로 구조체가 할당된다. 0으면 로컬힙에서 구조체가 할당된다.
dwParam : 알림 메시지와 함께 응용 프로그램에게 전달되는 값으로 읾의로 정의할 수 있는 값이다.

새로운 알림 방식으로 WM_DBNOTIFYCATION 메시지가 전달되며 이메시지의 lParam 매개변수는 CENOTIFICATION 구조
체를 가르키며 이는 다음과 같이 정의 되어 있다.

typedef struct _CENOTIFICATION
{
    DWORD dwSize;
    DWORD dwParam;
    UINT uType;
    CEGUID guid;
    CEOID oid;
    CEOID oidParent;
} CENOTIFICATION;

dwSize : 구조체 사이즈
dwParam : CENOTIFYREQUEST 구조체의 dwParam 필드에 넣은 값이 들어간다. 이것은 응용 프로그램에서 정의하는 값으로
어떤 목적으로든 사용할 수 있다.

uType 필드에는 WM_DBNOTIFICATION 메시지가 전달된 이유가 들어간다.
DB_CEOID_CREATED : 새로운 파일 시스템 객체가 생성됨
DB_CEOID_DATABASE_DELETED : 디비가 볼륨에서 삭제되었다.
DB_CEOID_RECORD_DELETED : 레코드가 디비에서 삭제되었다.
DB_CEOID_CHANGED : 객체가 수정되었다.

guid : 메시지와 관련된 디비 볼륨의 guid
oid : 메시지와 관련된 디비 레코드의 oid
oidParent : 메시지가 가리키는 oid 부모 객체의 oid가 들어간다.

WM_DBNOTIFICATION 을 받으면 메모리블럭에 CENOTIFICATION 구조체가 놓이는 데 이를 반드시 해제해야된다.
CENOTIFYREQEUST 의 hHeap 필드에 힙 핸들을 지정했다면 그 핸들이 가르키는 힙에 구조체가 위치한다.
힙 핸들이 지정되지 않았다면 로컬힙에 구조체가 위치한다. 어느 위치에 있던 CENOTIFYCATION 구조체가 들어있는
메모리는 꼭 해제해야된다. 이를 위해서는 아래의 함수를 이용한다.

BOOL CeFreeNotification(PCENOTIFYREQUEST pRequst, PCENOTIFICATION pNotify);
pRequst : 원래 CENOTIFYREQUEST 구조체에 대한 포인터
pNotify : 비워야할 구조체의 포인터 이고 WM_DBNOTIFICATION 을 받을 때마다 CENOTIFICATION 구조체를 비워야한다.



데이터베이스 갱신 : CeChangeDatabaseLCID
데이터베이스 삭제 : CeDeleteDatabaseEx
레코드 쓰기 : CeWriteRecordProps
레코드 읽기 : CeReadRecordProps
레코드 이동 : CeSeekDatabaseEx
레코드 삭제 : CeDeleteRecord
데이터베이스 찾기 : CeFindFirstDatabaseEx, CeFindNextDatabaseEx
OID 정보 : CeOidGetInfoEx

'Windows > MFC' 카테고리의 다른 글

DLL 생성시 CLASS 헤더에 넣어야할 부분  (0) 2013.10.02
Virtual Key board  (0) 2013.10.02
libcurl for win32  (0) 2013.10.02
HTTP file download  (0) 2013.10.02
폴더 열기  (0) 2013.10.02