1)Итак, утвержден пятый вызов получения данных, используемый для очистки памяти:
DBGetEvents(NULL, NULL, NULL,&IDSet); //clean internal memory
от первого вызова этот вызов отличается IDSet!=0
Подробности использования - см. предыдущее письмо.


2)Предлагается формат функций добавления записи в БД:

int FDBPutEvent(CMessageEvent *event);
int FDBPutCommand(CMessageCommand *cmd);


3)Предлагается формат стандартных команд:

Start :MessageType=1; CommandType=1;
Stop :MessageType=1; CommandType=2;
Restart :MessageType=1; CommandType=3;
Kill :MessageType=1; CommandType=4;

4)Забыл, о чем мы договаривались: в каком виде передавать параметры.
Напомню, что существуют типы параметров:
1)int
2)double
3)string

В данной реализации я предполагаю, что параметры передаются в бинарном виде, т.е.
для int LVar=4
для double LVar=8
для string LVar=sizeof(Var)+1

Если есть потребность все параметры передавать в виде их текстового представления, то просьба об этом сообщить.

остальные поля структуры CMessageCommand не принципиальны

//==========================================================================
ДАЛЕЕ ВСЕ СТАРОЕ!!!
//==========================================================================
//==========================================================================
//------------------------------------------------------------
class CSensor
{public:
//--
int SensorType;
char *SensorID; int LSensorID;
char *Description; int LDescription;
//-- for KEEPALIVE:
int MessageType;//1)IsAlive; 2)IsDead
time_t EventTime;
int Status;//bits: 1=Alive/Not alive
//--
};
//------------------------------------------------------------
class CMessageEventParam
{public:
//--
int Type;//text: 1)int; 2)double; 3)text
char *Name;int LName;//0-terminated
char *Val; int LVal;
//--
};
//==========================================================================
class CMessageEvent
{public:
//---
int MessageType;
char *SensorID; int LSensorID;
int MessageID;
int SensorType;
char *EventName; int LEventName;
time_t EventTime;
int ParNum;
CMessageEventParam *par;
//---
};
//==========================================================================
class CMessageEventRequest
{public:
//--
int NMax;int TakeFirst1_Last0;
int MessageID0,MessageID1; int UseMessageID0,UseMessageID1;
int MessageType; int UseMessageType;
char *SensorID; int LSensorID; int UseSensorID;
int SensorType; int UseSensorType;
char *EventName; int LEventName; int UseEventName;
time_t EventTime0; int UseEventTime0;
time_t EventTime1; int UseEventTime1;
//--
};
//==========================================================================
class CMessageCommand
{public:
//---
int MessageType;
char *SensorID; int LSensorID;
int CommandID;
int CommandType;
time_t EventTime;
int ParNum;
CMessageEventParam *par;
//---
};
//==========================================================================
class CMessageCommandRequest
{public:
//--
int NMax;int TakeFirst1_Last0;
int MessageType; int UseMessageType;
char *SensorID; int LSensorID; int UseSensorID;
int CommandID0,CommandID1; int UseCommandID0,UseCommandID1;
int CommandType; int UseCommandType;
time_t CommandTime0; int UseCommandTime0;
time_t CommandTime1; int UseCommandTime1;
//--
};
//==========================================================================
int FDBGetSensors(int *N, CSensor *s);//if N==NULL then return sizeof(CSensor)
; if N!=NULL then set <=*N sensors

int FInitDBEvents(const char *ConfigDir);
int FDBGetEvents(int *N, CMessageEvent *event, CMessageEventRequest *request);
//if N==NULL then return
//sizeof(CMessageEvent)<<16+sizeof(CMessageEventRequest) ; if N!=NULL then set
//<=*N events

//==========================================================================
int FInitDBSensors(const char* ConfigDir);
int FDBGetSensors(int *N, CSensor *s,int *IDSet);
//if N==NULL then return sizeof(CSensor)

//example of use:
int IDSet=0,NSensors=0; CSensor *Sensor=NULL;
int rtn=FDBGetSensors(&NSensors, NULL,&IDSet);
if(irtn==0 && NSensors>0)
{int i;
Sensor=new CSensor[NSensors];
rtn=FDBGetSensors(&NSensors, Sensor,&IDSet);
for(i=0;i //strings
FDBGetSensors(&NSensors, Sensor,&IDSet);
}
//==========================================================================
int FInitDBEvents(const char *ConfigDir);
int FDBGetEvents(int *N, CMessageEvent *event, CMessageEventRequest *request, int *IDSet);
//if N==NULL then return
//sizeof(CMessageEvent)<<16+sizeof(CMessageEventRequest) ; if N!=NULL then set

//example of use:
int IDSet=0,N=0; CMessageEvent *event=NULL; CMessageEventRequest request;
if(FDBGetEvents(&N, NULL, &request,&IDSet)==0)
{
if(N>0)
{
event=new CMessageEvent[N];
FDBGetEvents(&N, event, &request,&IDSet);
for(i=0;i FDBGetEvents(&N, event, &request,&IDSet);
for(i=0;i //parameters
FDBGetEvents(&N, event, &request,&IDSet);
}
}
//==========================================================================
int FInitDBCommands(const char *ConfigDir);
int FDBGetCommands(int *N, CMessageCommand *cmd, CMessageCommandRequest *request, int *IDSet);
//if N==NULL then return
//sizeof(CMessageCommand)<<16+sizeof(CMessageCommandRequest) ; if N!=NULL then set

//example of use:
int IDSet=0,N=0; CMessageCommand *event=NULL; CMessageCommandRequest request;
if(FDBGetCommands(&N, NULL, &request,&IDSet)==0)
{
if(N>0)
{
command=new CMessageCommand[N];
FDBGetCommands(&N, command, &request,&IDSet);
for(i=0;i FDBGetCommands(&N, command, &request,&IDSet);
for(i=0;i //parameters
FDBGetCommands(&N, command, &request,&IDSet);
}
}

//==========================================================================