www.pudn.com > StreamDBTest.rar > SysEDB.cpp
#include "stdafx.h"
#include "SysEDB.h"
const CEPROPID NamePropid = MAKELONG(CEVT_LPWSTR,0); // 名字propid
const CEPROPID PhoneNumberPropid = MAKELONG(CEVT_LPWSTR,1); // 号码propid
const CEPROPID OrderPropid = MAKELONG(CEVT_UI4,0); // 排序的序号propid
const CEPROPID StreamDataPropid = MAKELONG(CEVT_BLOB,0); // Item结构的propid
UINT GetCurrAppFolder(TCHAR* appFolder)
{
TCHAR lpFileName[128];
TCHAR lpFolderName[128];
TCHAR k='\\';
int charNumber=GetModuleFileName(NULL, lpFileName, 128);
for(int i=charNumber-1;i>=0;i--)
{
if(lpFileName[i]==k)
{
wcsncpy(lpFolderName,lpFileName,i+1);
lpFolderName[i+1]='\0';
break;
}
}
return wsprintf(appFolder,TEXT("%s"),lpFolderName);
}
//创建数据库
BOOL CSysDB::CreateDBEx(LPTSTR apsDBVolPath)
{
CEGUID ceGuidInitDB;
if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
{
return FALSE;
}
CEDBASEINFOEX ced;
memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
ced.wVersion = CEDBASEINFOEX_VERSION;
ced.dwSize = sizeof(CEDBASEINFOEX);
ced.dwFlags = CEDB_VALIDNAME| CEDB_VALIDSORTSPEC;
//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
wcscpy(ced.szDbaseName, DB_NAME); // 数据库的名字
//ced.wNumSortOrder = 2; // 1种排序方式
ced.wNumSortOrder = 1; // 1种排序方式
// 排序方式,把电话号码做为主键,不允许重复。
ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
ced.rgSortSpecs[0].wNumProps = 1;
if(m_bSetPrimaryKey)
ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY;
else
ced.rgSortSpecs[0].wKeyFlags = 0 ;
ced.rgSortSpecs[0].rgPropID[0] = PhoneNumberPropid; // 默认升序排列
DWORD wProps = 2;
CEPROPSPEC propSpec[2];
memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);
propSpec[0].wVersion = 1;
propSpec[0].propid = NamePropid;
propSpec[0].dwFlags = DB_PROP_NOTNULL;
propSpec[1].wVersion = 1;
propSpec[1].propid = PhoneNumberPropid;
propSpec[1].dwFlags = DB_PROP_NOTNULL;
// propSpec[2].wVersion = 1;
// propSpec[2].propid = OrderPropid;
// propSpec[2].dwFlags = DB_PROP_NOTNULL;
CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
if( NULL ==oid )
{
CeUnmountDBVol(&ceGuidInitDB);
return FALSE;
}
CeUnmountDBVol(&ceGuidInitDB);
return TRUE;
}
//创建流数据库
BOOL CSysDB::CreateStreamDB(LPTSTR apsDBVolPath)
{
CEGUID ceGuidInitDB;
if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
{
return FALSE;
}
CEDBASEINFOEX ced;
memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
ced.wVersion = CEDBASEINFOEX_VERSION;
ced.dwSize = sizeof(CEDBASEINFOEX);
ced.dwFlags = CEDB_VALIDNAME| CEDB_VALIDSORTSPEC;
//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
wcscpy(ced.szDbaseName, STREAM_DB_NAME); // 数据库的名字
//ced.wNumSortOrder = 2; // 1种排序方式
ced.wNumSortOrder = 1; // 1种排序方式
// 排序方式,把电话号码做为主键,不允许重复。
ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
ced.rgSortSpecs[0].wNumProps = 1;
// if(m_bSetPrimaryKey)
// ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY;
// else
ced.rgSortSpecs[0].wKeyFlags = 0 ;
ced.rgSortSpecs[0].rgPropID[0] = StreamDataPropid; // 默认升序排列
DWORD wProps = 1;
CEPROPSPEC propSpec[1];
memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);
propSpec[0].wVersion = 1;
propSpec[0].propid = StreamDataPropid;
propSpec[0].dwFlags = DB_PROP_NOTNULL;
// propSpec[1].wVersion = 1;
// propSpec[1].propid = PhoneNumberPropid;
// propSpec[1].dwFlags = DB_PROP_NOTNULL;
// propSpec[2].wVersion = 1;
// propSpec[2].propid = OrderPropid;
// propSpec[2].dwFlags = DB_PROP_NOTNULL;
CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
if( NULL ==oid )
{
CeUnmountDBVol(&ceGuidInitDB);
return FALSE;
}
CeUnmountDBVol(&ceGuidInitDB);
return TRUE;
}
/*
// 创建存储拨号前缀的数据库
BOOL CreateDB(LPTSTR apsDBVolPath)
{
CEGUID ceGuidInitDB;
if(FALSE == CeMountDBVolEx(&ceGuidInitDB, apsDBVolPath, 0, OPEN_ALWAYS ))
{
return FALSE;
}
CEDBASEINFOEX ced;
memset(&ced, 0, sizeof(CEDBASEINFOEX)) ;
ced.wVersion = CEDBASEINFOEX_VERSION;
ced.dwSize = sizeof(CEDBASEINFOEX);
ced.dwFlags = CEDB_VALIDNAME| CEDB_VALIDSORTSPEC;
//wcscpy(ced.szDbaseName, L"Prefix"); // 数据库的名字
wcscpy(ced.szDbaseName, DB_NAME); // 数据库的名字
//ced.wNumSortOrder = 2; // 1种排序方式
ced.wNumSortOrder = 1; // 1种排序方式
// 排序方式,把电话号码做为主键,不允许重复。
ced.rgSortSpecs[0].wVersion = SORTORDERSPECEX_VERSION;
ced.rgSortSpecs[0].wNumProps = 1;
ced.rgSortSpecs[0].wKeyFlags = CEDB_SORT_PRIMARYKEY ;
ced.rgSortSpecs[0].rgPropID[0] = PhoneNumberPropid; // 默认升序排列
// 排序方式2,把OrderID按照降序排序
// ced.rgSortSpecs[1].wVersion = SORTORDERSPECEX_VERSION;
// ced.rgSortSpecs[1].wNumProps = 1;
// ced.rgSortSpecs[1].wKeyFlags =CEDB_SORT_UNIQUE;
// ced.rgSortSpecs[1].rgPropID[0] = OrderPropid;
// ced.rgSortSpecs[1].rgdwFlags[0] = CEDB_SORT_DESCENDING; // 降序排列
// 设置每个字段的属性值
// DWORD wProps = 3;
// CEPROPSPEC propSpec[3];
// memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);
DWORD wProps = 2;
CEPROPSPEC propSpec[2];
memset(propSpec,0,sizeof(CEPROPSPEC)*wProps);
propSpec[0].wVersion = 1;
propSpec[0].propid = NamePropid;
propSpec[0].dwFlags = DB_PROP_NOTNULL;
propSpec[1].wVersion = 1;
propSpec[1].propid = PhoneNumberPropid;
propSpec[1].dwFlags = DB_PROP_NOTNULL;
// propSpec[2].wVersion = 1;
// propSpec[2].propid = OrderPropid;
// propSpec[2].dwFlags = DB_PROP_NOTNULL;
CEOID oid = CeCreateDatabaseWithProps(&ceGuidInitDB,&ced,wProps,propSpec);
if( NULL ==oid )
{
CeUnmountDBVol(&ceGuidInitDB);
return FALSE;
}
else // 至此数据库成功创建
{
// 创建预设分组
HANDLE hDB = CeOpenDatabaseInSession(NULL,&ceGuidInitDB,&oid,NULL,NULL,CEDB_AUTOINCREMENT,NULL);
if(hDB != INVALID_HANDLE_VALUE)
{
WORD wProps = 3;
CEPROPVAL propVal[3];
memset(propVal,0,sizeof(CEPROPVAL)*3);
propVal[0].propid = NamePropid;
propVal[1].propid = PhoneNumberPropid;
propVal[2].propid = OrderPropid;
propVal[0].val.lpwstr = L"Voice Modulation";
propVal[1].val.lpwstr = L"*77";
propVal[2].val.ulVal = 1;
CeWriteRecordProps(hDB,0,wProps,propVal);
propVal[0].val.lpwstr = L"Voice SMS";
propVal[1].val.lpwstr = L"*88";
propVal[2].val.ulVal = 2;
CeWriteRecordProps(hDB,0,wProps,propVal);
propVal[0].val.lpwstr = L"Voice Music SMS";
propVal[1].val.lpwstr = L"*89";
propVal[2].val.ulVal = 3;
CeWriteRecordProps(hDB,0,wProps,propVal);
CloseHandle(hDB);
}
}
CeUnmountDBVol(&ceGuidInitDB);
return TRUE;
}
*/
CSysDB::CSysDB(BOOL bSetPrimarykey , LONG iSeekOrder)
{
m_bInitial = FALSE;
m_hDB = INVALID_HANDLE_VALUE;
m_dwMaxPrefixOrderID = 0;
m_iSeekOrder = iSeekOrder;
m_bSetPrimaryKey = bSetPrimarykey;
//Initial(); // 初始化
}
CSysDB::~CSysDB()
{
if(INVALID_HANDLE_VALUE != m_hDB) // 关闭打开的数据库
{
CloseHandle(m_hDB);
}
CeUnmountDBVol(&m_ceGuidDB); // 卸载数据库卷
}
BOOL CSysDB::OpenDB(TCHAR *szwDBName)
{
if(m_bInitial) // 已经初始化
{
return TRUE; // 返回TRUE
}
TCHAR path[256];
TCHAR dbPath[256];
GetCurrAppFolder(path);
//wsprintf(dbPath,L"%s\\%s",path,L"db5.vol");
//wsprintf(dbPath,L"%s\\%s",path,L"SmsBList.dat");
wsprintf(dbPath,L"%s\\%s",path,szwDBName);
//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
{
CreateDBEx(dbPath);
if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
return FALSE;
}
{
CEOID oidb = 0;
/* SORTORDERSPECEX sort;
memset(&sort,0,sizeof(SORTORDERSPECEX));
// 排序方式2,把OrderID按照降序排序
sort.wVersion = SORTORDERSPECEX_VERSION;
sort.wNumProps = 1;
sort.wKeyFlags =CEDB_SORT_UNIQUE;
sort.rgPropID[0] = OrderPropid;
sort.rgdwFlags[0] = CEDB_SORT_DESCENDING; // 降序排列
*/
oidb = 0;
//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb,L"Prefix",&sort,CEDB_AUTOINCREMENT,NULL);
//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,&sort,CEDB_AUTOINCREMENT,NULL);
m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,NULL,CEDB_AUTOINCREMENT,NULL);
if(INVALID_HANDLE_VALUE != m_hDB ) // 成功打开数据库
{
m_bInitial =TRUE;
m_dwMaxPrefixOrderID = GetMaxPrefixOrderID();
return TRUE;
}
CeUnmountDBVol(&m_ceGuidDB);
}
return FALSE;
}
BOOL CSysDB::OpenStreamDB(TCHAR *szwDBName)
{
if(m_bInitial) // 已经初始化
{
return TRUE; // 返回TRUE
}
TCHAR path[256];
TCHAR dbPath[256];
GetCurrAppFolder(path);
//wsprintf(dbPath,L"%s\\%s",path,L"db5.vol");
//wsprintf(dbPath,L"%s\\%s",path,L"SmsBList.dat");
wsprintf(dbPath,L"%s\\%s",path,szwDBName);
//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
//if( CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
{
CreateStreamDB(dbPath);
if(!CeMountDBVolEx(&m_ceGuidDB, dbPath, 0, OPEN_EXISTING ))
return FALSE;
}
{
CEOID oidb = 0;
/* SORTORDERSPECEX sort;
memset(&sort,0,sizeof(SORTORDERSPECEX));
// 排序方式2,把OrderID按照降序排序
sort.wVersion = SORTORDERSPECEX_VERSION;
sort.wNumProps = 1;
sort.wKeyFlags =CEDB_SORT_UNIQUE;
sort.rgPropID[0] = OrderPropid;
sort.rgdwFlags[0] = CEDB_SORT_DESCENDING; // 降序排列
*/
oidb = 0;
//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb,L"Prefix",&sort,CEDB_AUTOINCREMENT,NULL);
//m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, DB_NAME,&sort,CEDB_AUTOINCREMENT,NULL);
m_hDB = CeOpenDatabaseInSession(NULL,&m_ceGuidDB,&oidb, STREAM_DB_NAME,NULL,CEDB_AUTOINCREMENT,NULL);
if(INVALID_HANDLE_VALUE != m_hDB ) // 成功打开数据库
{
m_bInitial =TRUE;
//m_dwMaxPrefixOrderID = GetMaxPrefixOrderID();
return TRUE;
}
CeUnmountDBVol(&m_ceGuidDB);
}
return FALSE;
}
void CSysDB::CloseDBHandle()
{
if(INVALID_HANDLE_VALUE != m_hDB) // 关闭打开的数据库
{
CloseHandle(m_hDB);
m_hDB = INVALID_HANDLE_VALUE;
}
CeUnmountDBVol(&m_ceGuidDB); // 卸载数据库卷
m_bInitial = FALSE; // 初始化开关设为false
}
DWORD CSysDB::AddDBItem(ITEMData &item)
{
//BOOL rs = FALSE;
if(!m_bInitial) // 没有初始化
{
return FALSE; // 返回false
}
//WORD wProps = 3;
//CEPROPVAL propVal[3];
//memset(propVal,0,sizeof(CEPROPVAL)*3);
WORD wProps = 2;
CEPROPVAL propVal[2];
memset(propVal,0,sizeof(CEPROPVAL)*2);
propVal[0].propid = NamePropid;
propVal[0].val.lpwstr = item.name;
propVal[1].propid = PhoneNumberPropid;
propVal[1].val.lpwstr = item.number;
// propVal[2].propid = OrderPropid;
// propVal[2].val.ulVal = ++m_dwMaxPrefixOrderID;
CEOID oidRecord = CeWriteRecordProps(m_hDB,0,wProps,propVal);
DWORD errCoe = GetLastError();
if(errCoe == ERROR_ALREADY_EXISTS)
{
return errCoe;
}
//ERROR_ALREADY_EXISTS
if(oidRecord != 0)
{
item.ceoid = oidRecord;
//rs = TRUE;
}
return errCoe;
//return rs;
}
DWORD CSysDB::AddStreamDBItem(ITEMData &item)
{
//BOOL rs = FALSE;
if(!m_bInitial) // 没有初始化
{
return FALSE; // 返回false
}
//WORD wProps = 3;
//CEPROPVAL propVal[3];
//memset(propVal,0,sizeof(CEPROPVAL)*3);
WORD wProps = 1;
CEPROPVAL propVal[1];
memset(propVal,0,sizeof(CEPROPVAL)*1);
propVal[0].propid = StreamDataPropid;
propVal[0].val.blob.lpb = (LPBYTE)&item;
propVal[0].val.blob.dwCount = sizeof(item);
// propVal[1].propid = PhoneNumberPropid;
// propVal[1].val.lpwstr = item.number;
// propVal[2].propid = OrderPropid;
// propVal[2].val.ulVal = ++m_dwMaxPrefixOrderID;
CEOID oidRecord = CeWriteRecordProps(m_hDB,0,wProps,propVal);
DWORD errCoe = GetLastError();
if(errCoe == ERROR_ALREADY_EXISTS)
{
return errCoe;
}
//ERROR_ALREADY_EXISTS
if(oidRecord != 0)
{
item.ceoid = oidRecord;
//rs = TRUE;
}
return errCoe;
//return rs;
}
DWORD CSysDB::AddStreamDBItem(void *pData , int cbSize)
{
//BOOL rs = FALSE;
if(!m_bInitial) // 没有初始化
{
return FALSE; // 返回false
}
//WORD wProps = 3;
//CEPROPVAL propVal[3];
//memset(propVal,0,sizeof(CEPROPVAL)*3);
WORD wProps = 1;
CEPROPVAL propVal[1];
memset(propVal,0,sizeof(CEPROPVAL)*1);
propVal[0].propid = StreamDataPropid;
propVal[0].val.blob.lpb = (LPBYTE)pData;
propVal[0].val.blob.dwCount = cbSize;
// propVal[1].propid = PhoneNumberPropid;
// propVal[1].val.lpwstr = item.number;
// propVal[2].propid = OrderPropid;
// propVal[2].val.ulVal = ++m_dwMaxPrefixOrderID;
CEOID oidRecord = CeWriteRecordProps(m_hDB,0,wProps,propVal);
DWORD errCoe = GetLastError();
if(errCoe == ERROR_ALREADY_EXISTS)
{
return errCoe;
}
//ERROR_ALREADY_EXISTS
if(oidRecord != 0)
{
//item.ceoid = oidRecord;
//rs = TRUE;
}
return errCoe;
//return rs;
}
BOOL CSysDB::ModifyAnPrefixItem(ITEMData &item)
{
if(m_bInitial)
{
CEOID oid = CeSeekDatabaseEx(m_hDB,CEDB_SEEK_CEOID,item.ceoid,0,NULL);
if(0 != oid)
{
WORD wProps = 2;
CEPROPVAL propVal[2];
memset(propVal,0,sizeof(CEPROPVAL)*2);
propVal[0].propid = NamePropid;
propVal[0].val.lpwstr = item.name;
propVal[1].propid = PhoneNumberPropid;
propVal[1].val.lpwstr = item.number;
CEOID oidRecord = CeWriteRecordProps(m_hDB,oid,wProps,propVal);
if(oidRecord == oid)
{
return TRUE;
}
}
}
return FALSE;
}
BOOL CSysDB::ModifyAnStreamDBItem(ITEMData &item)
{
if(m_bInitial)
{
CEOID oid = CeSeekDatabaseEx(m_hDB,CEDB_SEEK_CEOID,item.ceoid,0,NULL);
if(0 != oid)
{
WORD wProps = 1;
CEPROPVAL propVal[1];
memset(propVal,0,sizeof(CEPROPVAL)*1);
propVal[0].propid = StreamDataPropid;
propVal[0].val.blob.lpb = (LPBYTE)&item;
propVal[0].val.blob.dwCount = sizeof(item);
CEOID oidRecord = CeWriteRecordProps(m_hDB,oid,wProps,propVal);
if(oidRecord == oid)
{
return TRUE;
}
}
}
return FALSE;
}
BOOL CSysDB::DelAnPrefixItem(ITEMData &item)
{
if(m_bInitial)
{
if(CeDeleteRecord(m_hDB,item.ceoid))
return TRUE;
}
return FALSE;
}
DWORD CSysDB::GetAllPrefixItem(std::vector &vecPrefixItem)
{
if(!m_bInitial) // 未初始化,直接返回
{
return -1;
}
ITEMData item;
PCEPROPVAL pRecord = NULL;
PBYTE pString = NULL;
DWORD dwRecSize;
WORD wProps = 2;
//CEOID oid = CeSeekDatabaseEx(m_hDB,CEDB_SEEK_BEGINNING,0,0,NULL);
CEOID oid = CeSeekDatabaseEx(m_hDB,m_iSeekOrder,0,0,NULL);
while(oid)
{
oid = CeReadRecordPropsEx(m_hDB, CEDB_ALLOWREALLOC,&wProps,NULL,(LPBYTE *)&pString,&dwRecSize,NULL);
if(0!=oid)
{
pRecord = (PCEPROPVAL) pString;
memset(&item,0,sizeof(ITEMData));
item.ceoid = oid;
for(int i = 0; i &vecPrefixItem)
{
if(!m_bInitial) // 未初始化,直接返回
{
return -1;
}
ITEMData item;
PCEPROPVAL pRecord = NULL;
PBYTE pString = NULL;
DWORD dwRecSize;
WORD wProps = 1;
//CEOID oid = CeSeekDatabaseEx(m_hDB,CEDB_SEEK_BEGINNING,0,0,NULL);
CEOID oid = CeSeekDatabaseEx(m_hDB,m_iSeekOrder,0,0,NULL);
while(oid)
{
oid = CeReadRecordPropsEx(m_hDB, CEDB_ALLOWREALLOC,&wProps,NULL,(LPBYTE *)&pString,&dwRecSize,NULL);
if(0!=oid)
{
pRecord = (PCEPROPVAL) pString;
memset(&item,0,sizeof(ITEMData));
item.ceoid = oid;
for(int i = 0; i