📄 extrdbi.cpp
字号:
#include "StdAfx.h"
#include "eXtrDBI.h"
#include "PCAUTO.h"
extern eXtrDBI* g_peXtrDB;
extern PCAUTO* g_pPCAUTO;
static const char DB_NAME[]="IFeXtrDB";
static const int SEGSZ=1024*1024*20;
static const int PAGESZ=128;
static const int MAP_ADDRESS=0x20000000;
eXtrDBI::eXtrDBI()
{
dbh=NULL;
init(true);
}
eXtrDBI::~eXtrDBI(void)
{
close();
}
int eXtrDBI::GetData(LPCTSTR name, float* pv)
{
MCO_RET rc;
mco_trans_h t;
mco_trans_start(dbh,MCO_READ_ONLY,MCO_TRANS_FOREGROUND,&t);
AIO aio;
rc=AIO_idxTree_find(t,name,wcslen(name),&aio);
if (rc)
{
mco_trans_rollback(t);
return FALSE;
}
rc=AIO_PV_get(&aio,pv);
mco_trans_commit(t);
if (rc)
{
mco_trans_rollback(t);
return FALSE;
}
return 0;
}
int eXtrDBI::GetData(LPCTSTR name, double * pv)
{
float fpv;
GetData(name, &fpv);
*pv = fpv;
return 0;
}
int eXtrDBI::GetData(LPCTSTR name, bool * pv)
{
float fpv;
GetData(name,&fpv);
if (fpv - 0.00>0.001)
{
*pv = TRUE;
}
else
{
*pv = FALSE;
}
return 0;
}
int eXtrDBI::SetData(LPCTSTR name, float pv)
{
MCO_RET rc;
mco_trans_h t;
mco_trans_start(dbh,MCO_READ_WRITE,MCO_TRANS_FOREGROUND,&t);
AIO aio;
rc=AIO_idxTree_find(t,name,wcslen(name),&aio);
if (rc)
{
mco_trans_rollback(t);
return FALSE;
}
rc=AIO_PV_put(&aio,pv);
mco_trans_commit(t);
//g_pPCAUTO->putpv(name,pv);
if (rc)
{
mco_trans_rollback(t);
return FALSE;
}
return 0;
}
int eXtrDBI::SetData(LPCTSTR name, double pv)
{
return SetData(name,(float)pv);
}
int eXtrDBI::SetData(LPCTSTR name, bool pv)
{
float fpv=(float)pv;
return SetData(name,fpv);
}
int eXtrDBI::addrecord(LPCTSTR name,float pv)
{
mco_trans_h t=0;
MCO_RET rc;
AIO aio;
mco_trans_start(dbh, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
AIO_new(t,&aio);
AIO_NAME_put(&aio,(wchar_t *)name,(uint2)wcslen(name));
AIO_PV_put(&aio,pv);
rc=mco_trans_commit(t);
if(rc==MCO_S_OK)
return 0;
else
return -1;
}
MCO_RET eXtrDBI::AIO_upd_handler(mco_trans_h t, AIO* obj, MCO_EVENT_TYPE et, /*INOUT*/void* param)
{
((eXtrDBI*)param)->AIO_updata(t, obj, et);
return MCO_S_OK;
}
int eXtrDBI::AIO_updata(mco_trans_h t,AIO* obj,MCO_EVENT_TYPE et)
{//AIO改变,自动更新力控
float pv;
TCHAR name[64];
uint2 len ;
mco_trans_start(dbh,MCO_READ_ONLY,MCO_TRANS_FOREGROUND,&t);
AIO_PV_get(obj,&pv);
AIO_NAME_get(obj,name,64,&len);
mco_trans_commit(t);
g_pPCAUTO->putpv(name,pv);
return 0;
}
MCO_RET eXtrDBI::DIO_upd_handler(mco_trans_h t,DIO* obj,MCO_EVENT_TYPE et,/*INOUT*/void* param)
{
((eXtrDBI*)param)->DIO_updata(t, obj, et);
return MCO_S_OK;
}
int eXtrDBI::DIO_updata(mco_trans_h t,DIO* obj,MCO_EVENT_TYPE et)
{//DIO改变,自动更新力控
return 0;
}
int eXtrDBI::register_upd_events(void)
{
MCO_RET rc;
mco_trans_h t;
mco_trans_start(dbh, MCO_READ_WRITE, MCO_TRANS_FOREGROUND, &t);
mco_register_upd_AIO_handler(t, &eXtrDBI::AIO_upd_handler,(void*)this,MCO_AFTER_UPDATE);
mco_register_upd_DIO_handler(t, &eXtrDBI::DIO_upd_handler, (void*)this, MCO_AFTER_UPDATE);
rc = mco_trans_commit(t);
return TRUE;
}
BOOL eXtrDBI::init(BOOL bMaster)
{
MCO_RET rc;
mco_runtime_start();
if (bMaster)
{
rc=mco_db_open(DB_NAME,IeXtrDB_get_dictionary(),(void*)MAP_ADDRESS,SEGSZ,(uint2)PAGESZ);
if (rc)
{
return FALSE;
}
}
rc=mco_db_connect(DB_NAME,&dbh);
if (rc)
{
return FALSE;
}
register_upd_events();
bIsMaster=bMaster;
return 0;
}
BOOL eXtrDBI::close(void)
{
if (dbh)
{
mco_db_disconnect(dbh);
mco_db_close(DB_NAME);
mco_runtime_stop();
dbh=NULL;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -