📄 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)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -