본문 바로가기

Windows/MFC

CeDB

[code]
// DBControl.cpp: implementation of the CDBControl class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DBControl.h"
#include "xDefine.h"
#include "kdwDebug.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDBControl::CDBControl()
{
    _szCDBSpam = TEXT("\\DiskOnChip\\MessageSpam.DB");
    _szDBSpam = TEXT("DBMountMessageSpam");
}

CDBControl::~CDBControl()
{
}

BOOL CDBControl::Mount()
{
    if ( !CeMountDBVol( &m_guid, _szCDBSpam, OPEN_ALWAYS ) ) {
        DWORD dwErr = GetLastError();
        RETAILMSG(KDW_DEBUG, ( L"\r\n [MessageAPI] Mount Fault Get Last Error: %d\r\n ", dwErr) );
        return FALSE;
    }
    else {
        RETAILMSG(KDW_DEBUG, ( L"\r\n [MessageAPI] Mount success \r\n"));
        return TRUE;
    }
}

void CDBControl::UnMount()
{
    CeFlushDBVol( &m_guid);
    if ( !CeUnmountDBVol( &m_guid ) ) {
        DWORD dwErr = GetLastError();
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] UnMount Fault Get Last Error: %d \r\n", dwErr) );
    }
    else {
        RETAILMSG(KDW_DEBUG, ( L"\r\n [MessageAPI] UnMount success \r\n ") );
    }
}

BOOL CDBControl::Create()
{
    // TODO: Add your control notification handler code here
    CEDBASEINFO m_ceDBInfo;
    
    memset (&m_ceDBInfo, 0, sizeof (m_ceDBInfo));
    // 현재 구조체안의 어떤 필드가 유효한지 나타내는 플래그
    m_ceDBInfo.dwFlags = CEDB_VALIDCREATE;
    wcscpy(m_ceDBInfo.szDbaseName, _szDBSpam);            // 데이터베이스명
    m_ceDBInfo.dwDbaseType = 0;                            // 유일한 타입(DB) 식별자
    m_ceDBInfo.wNumSortOrder = 1;                        // 정렬 개수
    m_ceDBInfo.rgSortSpecs[0].propid = PROP_SPAM_DATA;// 시작 시간 필드로 기준으로 정렬
    m_ceDBInfo.rgSortSpecs[0].dwFlags = NULL;

    m_ceOid = CeCreateDatabaseEx(&m_guid, &m_ceDBInfo);    // DB 생성
    DWORD dwErr = GetLastError();
    if(m_ceOid == NULL) {
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] FALSE CreateDataBase Get Last Error: %d \r\n", GetLastError() ) );
        return FALSE;
    }
    else {
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] success CreateDataBase \r\n") );
        return TRUE;    
    }
}

BOOL CDBControl::Open()
{
    if(_szDBSpam)
    {
        m_ceOid = 0;
    }

    m_hDB = CeOpenDatabaseEx(&m_guid,
                             &m_ceOid,
                             _szDBSpam,            // DB 이름
                             PROP_SPAM_DATA,    // 정렬방식 결정 (이름 으로 정렬)
                             0,                    // Read할때 포인터 자동 증가 (CEDB_AUTOINCREMENT)
                             NULL                // 통지메시지를 받지 않음
                             );

    if(m_hDB == INVALID_HANDLE_VALUE) {
        DWORD dwErr = GetLastError();
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] FALSE OpenDB Get Last Error: %d \r\n", dwErr) );
        return FALSE;
    }
    else {
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] success OpenDB Get Last Error: %d \r\n", GetLastError() ) );
        return TRUE;
    }
}

BOOL CDBControl::Close()
{
    if(!CloseHandle(m_hDB)) {
        DWORD dwErr = GetLastError();
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] FALSE CloseHandle Get Last Error: %d \r\n", GetLastError() ) );
        return FALSE;
    }
    else {
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] success CloseHandle Get Last Error: %d \r\n", GetLastError() ) );
        return TRUE;    
    }
}

BOOL CDBControl::Start()
{
    BOOL bRetVal = TRUE;
    BOOL bMount = Mount();

    if(!bMount)
    {
        CopyFile(L"\\DiskOnChip\\MessageSpam_bk.DB", L"\\DiskOnChip\\MessageSpam.DB", FALSE);
        RETAILMSG(1, (TEXT("[MessageAPI] CDBControl::DBStart [ back-up ]\r\n")));
        
        bMount = Mount();

        if(!bMount)
        {
            DeleteFile(L"\\DiskOnChip\\MessageSpam.DB");
            bMount = Mount();
            RETAILMSG(1, (TEXT("[MessageAPI] CDBControl::DBStart [ remove and re-mount ]\r\n")));
        }
    }
    
    if(bMount && !Open())
    {
        RETAILMSG(KDW_DEBUG, (L"[MessageAPI] CDBControl::Start Open fail pre Create \r\n"));
        if(!Create()){
            UnMount();
            bRetVal = FALSE;
            RETAILMSG(KDW_DEBUG, (L"[MessageAPI] CDBControl::Start Create fail \r\n"));
        }
        else
        {
            if(!Open())
            {
                UnMount();
                bRetVal = FALSE;
                RETAILMSG(KDW_DEBUG, (L"[MessageAPI] CDBControl::Start re Open fail \r\n"));
            }
        }
    }

    return bRetVal;
}

void CDBControl::End()
{
    Close();
    UnMount();
}

int CDBControl::GetCount()
{
    DWORD Index;

    m_ceOidRec = CeSeekDatabase (m_hDB, CEDB_SEEK_END, 0, &Index);
    DWORD dwErr = GetLastError();

    if(m_ceOidRec == 0) {
        RETAILMSG(KDW_DEBUG,( L"\r\n [MessageAPI] FALSE GetCount \r\nGet Last Error: %d \r\n", dwErr) );
            return -1;
    }
    else
    {
        return Index+1;
    }
}

CEOID CDBControl::Read(int index, SPAM_DATA *spam)
{
    CEPROPVAL *props = NULL;
    DWORD dwBuf;
    WORD wProps;

    m_ceOidRec = CeSeekDatabase (m_hDB, CEDB_SEEK_BEGINNING, index, &m_dwIndex);
    DWORD dwErr = GetLastError();

    if(m_ceOidRec == 0)
    {
        return FALSE;
    }
    else
    {        
        m_ceOidRec = CeReadRecordProps(m_hDB, CEDB_ALLOWREALLOC,
                                         &wProps, NULL,
                                         (LPBYTE*)&props, &dwBuf );
        if(m_ceOidRec)
        {
            spam->type =props[0].val.lVal;
            wcscpy(spam->data , props[1].val.lpwstr);
            LocalFree(props);
            spam->oid = m_ceOidRec;
        }
        return m_ceOidRec;
    }
}

CEOID CDBControl::Read(CEOID oid, SPAM_DATA *spam)
{
    CEPROPVAL *props = NULL;
    DWORD dwBuf;
    WORD wProps;

    m_ceOidRec = CeSeekDatabase (m_hDB, CEDB_SEEK_CEOID, oid, &m_dwIndex);
    DWORD dwErr = GetLastError();

    if(m_ceOidRec == 0)
    {
        return FALSE;
    }
    else
    {
        m_ceOidRec = CeReadRecordProps(m_hDB, CEDB_ALLOWREALLOC,
                                         &wProps, NULL,
                                         (LPBYTE*)&props, &dwBuf );
        if(m_ceOidRec)
        {
            spam->type =props[0].val.lVal;
            wcscpy(spam->data , props[1].val.lpwstr);
            LocalFree(props);
            spam->oid = m_ceOidRec;
        }
        return m_ceOidRec;
    }
}

BOOL CDBControl::Write(SPAM_DATA *spam)
{
    CEPROPVAL    pRecord[NUM_DB_PROPS_SPAM];
    TCHAR szName[MAX_PATH] = _T("Name");

    for(int i=0; i<NUM_DB_PROPS_SPAM; i++)
        memset (&pRecord[i], 0, sizeof(CEPROPVAL));

    pRecord[0].propid = PROP_SPAM_TYPE;
    pRecord[0].val.lVal = (LONG)spam->type;

    pRecord[1].propid = PROP_SPAM_DATA;
    pRecord[1].val.lpwstr = (LPTSTR)(LPCTSTR)spam->data;

    m_ceOidRec = CeWriteRecordProps(m_hDB, 0, NUM_DB_PROPS_SPAM, pRecord);
    DWORD dwErr = GetLastError();

    if(m_ceOidRec == 0) {
        return FALSE;
    }
    else {
        return TRUE;    
    }
}

BOOL CDBControl::ReWrite(SPAM_DATA *spam, CEOID oid)
{
    CEPROPVAL    pRecord[NUM_DB_PROPS_SPAM];
    TCHAR szName[MAX_PATH] = _T("Name");

    for(int i=0; i<NUM_DB_PROPS_SPAM; i++)
        memset (&pRecord[i], 0, sizeof(CEPROPVAL));

    pRecord[0].propid = PROP_SPAM_TYPE;
    pRecord[0].val.lVal = (LONG)spam->type;

    pRecord[1].propid = PROP_SPAM_DATA;
    pRecord[1].val.lpwstr = (LPTSTR)(LPCTSTR)spam->data;

    m_ceOidRec = CeWriteRecordProps(m_hDB, oid, NUM_DB_PROPS_SPAM, pRecord);
    DWORD dwErr = GetLastError();

    if(m_ceOidRec == 0) {
        return FALSE;
    }
    else {
        return TRUE;    
    }
}

BOOL CDBControl::Delete(CEOID oid)
{
    int flag = CeDeleteRecord( m_hDB, oid);
    return flag;
}


// DBControl.h: interface for the CDBControl class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DBCONTROL_H__58C79D27_50BD_4CA4_92B9_C0E503ECC296__INCLUDED_)
#define AFX_DBCONTROL_H__58C79D27_50BD_4CA4_92B9_C0E503ECC296__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include "Afxtempl.h"

#define NUM_DB_PROPS_SPAM                2
// Property ID (Common)
#define    PROP_SPAM_TYPE            MAKELONG(CEVT_I2    , 1)    // Index (PK)
#define PROP_SPAM_DATA            MAKELONG(CEVT_LPWSTR, 2)    // Name


struct SPAM_DATA
{
    CEOID    oid;
    TCHAR data[256];
    int    type;
};

class CDBControl
{
public:
    BOOL Delete(CEOID oid);
    BOOL ReWrite(SPAM_DATA *spam, CEOID oid);
    BOOL Write(SPAM_DATA *spam);
    CEOID Read(CEOID oid, SPAM_DATA *spam);
    CEOID Read(int index, SPAM_DATA* spam);
    int GetCount();
    void End();
    BOOL Start();
    BOOL Close();
    BOOL Open();
    BOOL Create();
    BOOL Mount();
    void UnMount();
    HANDLE m_hDB;
    CEOID m_ceOid;
    CEGUID m_guid;
    CEOID m_ceOidRec;
    DWORD m_dwIndex;

    LPTSTR    _szCDBSpam;
    LPTSTR    _szDBSpam;

    CDBControl();
    virtual ~CDBControl();

};

#endif // !defined(AFX_DBCONTROL_H__58C79D27_50BD_4CA4_92B9_C0E503ECC296__INCLUDED_)
[/code]

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

scrollbar 스크롤 바 정리  (0) 2013.10.02
SCROLLINFO  (0) 2013.10.02
batch file  (0) 2013.10.02
ON_MESSAGE 인자  (0) 2013.10.02
AttriWndBase  (0) 2013.10.02