?? ccdb.cpp
字號:
// ccdb.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include <winsock2.h>
#include "ccdb.h"
#include "BusDef.h"
#include "busdata.h"
#include "database.h"
#include "Sysinterfacedata.h"
#include "DeviceType.h"
#include "ini.h"
//日志的宏定義
unsigned short g_unBugPort=0;
char g_szBufIp[20]="";
#define DBBUG_FILENAME "\\storage card\\log.ini" //日志輸出配置文件名稱
#define DBBUG_SECTION "dbsvr"
#define DBBUG_PORTITEM "Port"
#define DBBUG_IPITEM "IpAddr"
extern CMap<int,int,unsigned short,unsigned short> g_DevValueMap;
CDataBase g_DataBase;
void Init();
void writebuginfo(const char* lpszFormat, ...);
void ReplaceYinhao(WCHAR *p)
{
WCHAR *ptemp=wcschr(p,L'\'');
while(ptemp!= NULL)
{
for(int i=wcslen(ptemp);i>0;i--)
{
*(ptemp+i)=*(ptemp+i-1);
}
ptemp=wcschr(ptemp+2,L'\'');
}
}
int DLLSynFuntInterfaceBug(int SynCmmd,int action,char* m_rc_main_key,int m_rc_key_num,char* arg=NULL,int argLen=0)
{
// writebuginfo("Syn:busid=%d,act=%d\n",SynCmmd,action);
return DLLSynFuntInterface(SynCmmd,action,m_rc_main_key,m_rc_key_num,arg,argLen);
}
/*
功能:完成動態庫使用前的初始化
參數:無
返回:無
編寫人:呂黃梁
時間:2004-12-24
*/
void Init()
{
int i,num;
//對表的所有字段的總長進行計算
num=sizeof(BusList)/sizeof(BusList[0]);
for(i=0;i<num;i++)
{
BusFieldStruct *pField=BusList[i].pBusFields;
BusList[i].Size=0;
for(int j=0;j<BusList[i].Num;j++,pField++)
BusList[i].Size +=pField->Length;
}
CIni ini;
if(ini.Open(DBBUG_FILENAME))
{
g_unBugPort=ini.ReadInt(DBBUG_SECTION,DBBUG_PORTITEM);
char *p=ini.ReadText(DBBUG_SECTION,DBBUG_IPITEM);
if(p !=NULL)
strncpy(g_szBufIp,p,16);
ini.Close();
}
}
/*
功能:釋放申請的的查詢記錄結構鏈表
參數:
RetResultStruct **pOut--要釋放的查詢記錄指針的指針
返回:無
編寫人:呂黃梁
時間:2005-01-06
*/
void FreeResult(RetResultStruct **pOut)
{
if(pOut ==NULL)
{
ASSERT(0);
return ;
}
RetResultStruct *pCur,*pNext;
pCur=*pOut;
*pOut=NULL;
while(pCur)
{
pNext=pCur->pNext;
free(pCur->pBuf);
free(pCur);
pCur=pNext;
}
}
/*
功能:根據指定的業務表及操作類型對數據庫進行操作
參數:
ReqParamStruct *pstrReqParam--數據庫操作的請求參數
RetResultStruct **ppResult--要返回的查詢記錄指針的指針
返回:int
< 0 --錯誤代碼
>=0--正確或查詢結果記錄個數
編寫人:呂黃梁
時間:2004-12-24
*/
int ModifyData(ReqParamStruct *pstrReqParam,RetResultStruct **pOut,BOOL bSyn)
{
if(pstrReqParam == NULL)
return ERR_BUS_PARAM_NULL;
WCHAR cwSql[3000]=L"",*pSql;
ASSERT(pstrReqParam!=NULL);
//檢查業務類型是否可識別
int i,num;
int busindex=-1; //業務的定義
// writebuginfo(L"Enter Fun!");
// swprintf(cwSql,L"bus=%d,act=%d,size=%d\r\n",pstrReqParam->nBusID,pstrReqParam->nMethod,pstrReqParam->nSize);
// writebuginfo(cwSql);
writebuginfo("bus=%d,act=%d,size=%d,bSyn=%d\n",pstrReqParam->nBusID,pstrReqParam->nMethod,pstrReqParam->nSize,bSyn);
num=sizeof(BusList)/sizeof(BusList[0]);
for(i=0;i<num;i++)
{
if(BusList[i].BusID == pstrReqParam->nBusID)
break;
}
if(i>=num)
goto CombBus;//return ERR_BUS_TYPE;
busindex=i;
switch(pstrReqParam->nMethod)
{
case ACTION_ADD: //新增一條記錄
{
//檢查參數是否大小正確
int nID=0;
if(BusList[busindex].Size != pstrReqParam->nSize)
return ERR_BUS_PARAMSIZE;
switch(pstrReqParam->nBusID)
{
// case BUSINESS_CCINFO: // 中控用戶信息表
// case BUSINESS_SECTION: // 區號表
// case BUSINESS_PROVINCE: // 省表
case BUSINESS_TIMER: // 定時器表
case BUSINESS_CLOCK: // 鬧鐘表
case BUSINESS_RING: // 鈴聲表
case BUSINESS_SCHEDULE: // 日程表
case BUSINESS_HOUSE: // 房間
// case BUSINESS_HOUSETYPE: // 房間類型表
case BUSINESS_CARD: // 卡號(用戶
case BUSINESS_GUARDLOCK: // 門禁門磁綁定表
case BUSINESS_PASSRECORD: // 進出記錄表
case BUSINESS_TICKLER: // 備忘錄表
// case BUSINESS_MAIL: // 郵件表
// case BUSINESS_ALARMCONFIG: // 報警設置表
case BUSINESS_ALARMSPRING: // 報警觸發表
case BUSINESS_ALARMNOTIFY: // 報警通知記錄表
case BUSINESS_INFRAREFUN: // 紅外功能表
case BUSINESS_INFRAREFUNBIND: // 紅外功能綁定表
case BUSINESS_ADDRLIST_GROUP: //通訊簿分組表
case BUSINESS_ADDRLIST_PT: //普通用戶通訊錄
case BUSINESS_PARTDEFENCE: //局部設防表
case BUSINESS_CARDTIMER: //卡有效時間表
case BUSINESS_TELVIDEORECORD: //局部設防表
case BUSINESS_INTERFPHONERECORD: //可視對講記錄
case BUSINESS_SHORTMSG: //短信
{
if(!g_DataBase.OpenData())
{
return ERR_PROG_NOTOPEN;
}
nID=g_DataBase.Insert(BusList+busindex,(char *)pstrReqParam->pBuf);
g_DataBase.CloseData();
}
break;
//非自增長主鍵表的記錄增加
case BUSINESS_LOCKCODE: //門磁碼表
case BUSINESS_SCENEDEV: // 場景設備表
case BUSINESS_ADDRLIST_PM: //普美用戶通訊錄
case BUSINESS_VOICEMSG: // 語音留言表
case BUSINESS_DEV: // 設備表
case BUSINESS_SCENE: // 場景表
case BUSINESS_OUTGOING: // 開支明顯表
{
if(!g_DataBase.OpenData())
{
return ERR_PROG_NOTOPEN;
}
nID=g_DataBase.Insert(BusList+busindex,(char *)pstrReqParam->pBuf,FALSE);
g_DataBase.CloseData();
}
break;
default:
return ERR_BUS_MOTHEDSUPPORT;
break;
}
//添加設備值列表
if(BUSINESS_DEV==pstrReqParam->nBusID)
{
g_DevValueMap.SetAt(*((int*)((char *)pstrReqParam->pBuf +DEV_ADDR_POS)),*(unsigned short *)((char *)pstrReqParam->pBuf +DEV_VALUE_POS));
}
//發送同步消息
/* num=sizeof(BusToCmdList)/sizeof(BusToCmdList[0]);
for(i=0;i<num;i++)
{
if(BusToCmdList[i].nBus== pstrReqParam->nBusID)
break;
}
if(i <num && nID >0 && bSyn)
*/ if( nID >0 && bSyn)
{
#ifndef _USEBYLHL
if(pstrReqParam->nBusID ==BUSINESS_SCENEDEV )
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_ADD,(char*)pstrReqParam->pBuf,sizeof(int)*2);
//lhl,0628 對語音留言、可視對講、可視電話修改為發送內容
else if(BUSINESS_VOICEMSG==pstrReqParam->nBusID || BUSINESS_TELVIDEORECORD==pstrReqParam->nBusID || BUSINESS_INTERFPHONERECORD==pstrReqParam->nBusID )
{
*(int*)pstrReqParam->pBuf=nID;
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_ADD,(char*)&nID,sizeof(int),(char*)pstrReqParam->pBuf,pstrReqParam->nSize);
}
else
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_ADD,(char*)&nID,sizeof(int));
#endif
}
return nID;
}
break;
case ACTION_MODIFY: //修改指定記錄,指定條件為該業務的主鍵
{
//檢查參數是否大小正確
// writebuginfo(L"begin modify!");
if(BusList[busindex].Size != pstrReqParam->nSize)
{
// writebuginfo(L"Exit modify!");
return ERR_BUS_PARAMSIZE;
}
switch(pstrReqParam->nBusID)
{
case BUSINESS_CCINFO: // 中控用戶信息表
// case BUSINESS_SECTION: // 區號表
// case BUSINESS_PROVINCE: // 省表
case BUSINESS_DEV: // 設備表
case BUSINESS_SCENE: // 場景表
case BUSINESS_SCENEDEV: // 場景設備表
case BUSINESS_TIMER: // 定時器表
case BUSINESS_CLOCK: // 鬧鐘表
case BUSINESS_RING: // 鈴聲表
case BUSINESS_SCHEDULE: // 日程表
case BUSINESS_HOUSE: // 房間
// case BUSINESS_HOUSETYPE: // 房間類型表
case BUSINESS_CARD: // 卡號(用戶
case BUSINESS_GUARDLOCK: // 門禁門磁綁定表
// case BUSINESS_PASSRECORD: // 進出記錄表
case BUSINESS_VOICEMSG: // 語音留言表
case BUSINESS_TICKLER: // 備忘錄表
// case BUSINESS_MAIL: // 郵件表
case BUSINESS_ALARMCONFIG: // 報警設置表
// case BUSINESS_ALARMSPRING: // 報警觸發表
// case BUSINESS_ALARMNOTIFY: // 報警通知記錄表
case BUSINESS_INFRAREFUN: // 紅外功能表
case BUSINESS_INFRAREFUNBIND: // 紅外功能綁定表
case BUSINESS_OUTGOING: // 開支明顯表
case BUSINESS_ADDRLIST_GROUP: //通訊簿分組表
case BUSINESS_ADDRLIST_PM: //普美用戶通訊錄
case BUSINESS_ADDRLIST_PT: //普通用戶通訊錄
case BUSINESS_PARTDEFENCE: //局部設防表
case BUSINESS_LOCKCODE: //門磁碼表
case BUSINESS_CARDTIMER: //卡有效時間表
case BUSINESS_SHORTMSG: //短信
{
if(!g_DataBase.OpenData())
{
// writebuginfo(L"Exit modify!");
return ERR_PROG_NOTOPEN;
}
int nID=g_DataBase.Update(BusList+busindex,(char*)pstrReqParam->pBuf);
g_DataBase.CloseData();
if(nID ==0)
{
//修改設備值列表
if(BUSINESS_DEV==pstrReqParam->nBusID)
{
g_DevValueMap.SetAt(*((int*)((char *)pstrReqParam->pBuf +DEV_ADDR_POS)),*(unsigned short *)((char *)pstrReqParam->pBuf +DEV_VALUE_POS));
}
//發送同步消息
/* num=sizeof(BusToCmdList)/sizeof(BusToCmdList[0]);
for(i=0;i<num;i++)
{
if(BusToCmdList[i].nBus== pstrReqParam->nBusID)
break;
}
if(i <num && bSyn)
*/ if( bSyn)
{//默認都是第一個為主鍵ID
#ifndef _USEBYLHL
if(pstrReqParam->nBusID ==BUSINESS_SCENEDEV )
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_MODIFY,(char*)pstrReqParam->pBuf,sizeof(int)*2);
//lhl,0628 對語音留言、可視對講、可視電話修改為發送內容
else if(BUSINESS_VOICEMSG==pstrReqParam->nBusID || BUSINESS_TELVIDEORECORD==pstrReqParam->nBusID || BUSINESS_INTERFPHONERECORD==pstrReqParam->nBusID )
{
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_MODIFY,(char*)&nID,sizeof(int),(char*)pstrReqParam->pBuf,pstrReqParam->nSize);
}
else
DLLSynFuntInterfaceBug(pstrReqParam->nBusID,SYS_ACTION_MODIFY,(char*)pstrReqParam->pBuf,sizeof(int));
#endif
}
}
// writebuginfo(L"Exit modify!");
return nID;
}
break;
default:
return ERR_BUS_MOTHEDSUPPORT;
break;
}
}
break;
case ACTION_DELID: //刪除指定主鍵的記錄
{
switch(pstrReqParam->nBusID)
{//特殊的刪除
case BUSINESS_DEV: // 設備表
{
WCHAR SqlIst[8][150];
swprintf(SqlIst[0],L"Delete from LockCodeTable where LockID=%d",*((int *)pstrReqParam->pBuf));
swprintf(SqlIst[1],L"Update DevTable set RealDevID=0 where RealDevID=%d",*((int *)pstrReqParam->pBuf));
swprintf(SqlIst[2],L"Delete from GuardLocktable where GuardID=%d or LockID=%d",
*((int *)pstrReqParam->pBuf),*((int *)pstrReqParam->pBuf));
swprintf(SqlIst[3],L"Delete from SceneDevTable where DevID=%d",
*((int *)pstrReqParam->pBuf));
//刪除日程:先刪除定時器
swprintf(SqlIst[4],L"delete from timertable where timerid in(select StartTimerID from scheduletable where objectId=%d and (type=%d or type=%d))",
*((int *)pstrReqParam->pBuf),SCHEDULE_DEV_TIMEPOINT,SCHEDULE_DEV_TIMESECTION);
swprintf(SqlIst[5],L"delete from timertable where timerid in(select EndTimerID from scheduletable where objectId=%d and type=%d)",
*((int *)pstrReqParam->pBuf),SCHEDULE_DEV_TIMESECTION);
swprintf(SqlIst[6],L"delete from scheduletable where ObjectId =%d and (type=%d or type=%d)",
*((int *)pstrReqParam->pBuf),SCHEDULE_DEV_TIMEPOINT,SCHEDULE_DEV_TIMESECTION);
swprintf(SqlIst[7],L"Delete from DevTable where DevID=%d",
*((int *)pstrReqParam->pBuf));
if(!g_DataBase.OpenData())
{
return ERR_PROG_NOTOPEN;
}
NodeSql *pFirst,*pNode=NULL,*pNext=NULL;
for(int i=0;i<8;i++)
{
pNext=new NodeSql;
memset(pNext,0,sizeof(NodeSql));
pNext->pSql = SqlIst[i];
if(pNode==NULL)
{
pNode=pNext;
pFirst=pNext;
}else
{
pNode->pNext=pNext;
pNode=pNext;
}
}
BOOL bDel=g_DataBase.ExecuteSql(pFirst);
//刪除
while(pFirst)
{
pNode=pFirst;
pFirst=pFirst->pNext;
delete pNode;
}
g_DataBase.CloseData();
if(bDel)
{
//刪除設備值列表
if(BUSINESS_DEV==pstrReqParam->nBusID)
{//??不知道怎么刪除了,因為無法取得系統地址和設備地址,留著也沒關系
// g_DevValueMap.RemoveKey(*((int *)pstrReqParam->pBuf));
}
//發送同步消息
/* num=sizeof(BusToCmdList)/sizeof(BusToCmdList[0]);
for(int i=0;i<num;i++)
{
if(BusToCmdList[i].nBus== pstrReqParam->nBusID)
break;
}
*/
#ifndef _USEBYLHL
// if(i <num && bSyn)
if(bSyn)
{//??默認都是第一個為主鍵ID
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -