📄 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 + -