Storage: make storage class virtual with default implementations.
This commit is contained in:
@@ -39,16 +39,26 @@ static GWEN_BUFFER *_getDataFilePathForValueId(const AQH_STORAGE *sto, uint64_t
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* implementations
|
||||
* GWEN macros
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
GWEN_INHERIT_FUNCTIONS(AQH_STORAGE)
|
||||
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------------------------------
|
||||
* implementations
|
||||
* ------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
AQH_STORAGE *AQH_Storage_new(void)
|
||||
{
|
||||
AQH_STORAGE *sto;
|
||||
|
||||
GWEN_NEW_OBJECT(AQH_STORAGE, sto);
|
||||
GWEN_INHERIT_INIT(AQH_STORAGE, sto);
|
||||
|
||||
sto->deviceList=AQH_Device_List_new();
|
||||
sto->valueList=AQH_Value_List_new();
|
||||
sto->dataFileList=AQH_DataFile_List_new();
|
||||
@@ -61,6 +71,7 @@ AQH_STORAGE *AQH_Storage_new(void)
|
||||
void AQH_Storage_free(AQH_STORAGE *sto)
|
||||
{
|
||||
if (sto) {
|
||||
GWEN_INHERIT_FINI(AQH_STORAGE, sto);
|
||||
AQH_DataFile_List_free(sto->dataFileList);
|
||||
AQH_Value_List_free(sto->valueList);
|
||||
AQH_Device_List_free(sto->deviceList);
|
||||
@@ -194,6 +205,116 @@ void AQH_Storage_SubRuntimeFlags(AQH_STORAGE *sto, uint32_t flags)
|
||||
|
||||
|
||||
|
||||
int AQH_Storage_WriteState(AQH_STORAGE *sto)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv=AQH_Storage_WriteStateFile(sto, sto->stateFile);
|
||||
if (rv<0) {
|
||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
||||
return rv;
|
||||
}
|
||||
sto->runtimeFlags&=~AQH_STORAGE_RTFLAGS_MODIFIED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const char *AQH_Storage_GetDataFileFolder(const AQH_STORAGE *sto)
|
||||
{
|
||||
return sto?sto->dataFileFolder:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AQH_Storage_SetDataFileFolder(AQH_STORAGE *sto, const char *s)
|
||||
{
|
||||
if (sto) {
|
||||
free(sto->dataFileFolder);
|
||||
sto->dataFileFolder=s?strdup(s):NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_INIT_FN AQH_Storage_SetInitFn(AQH_STORAGE *sto, AQH_STORAGE_INIT_FN fn)
|
||||
{
|
||||
AQH_STORAGE_INIT_FN oldFn;
|
||||
|
||||
oldFn=sto->initFn;
|
||||
sto->initFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_FINI_FN AQH_Storage_SetFiniFn(AQH_STORAGE *sto, AQH_STORAGE_FINI_FN fn)
|
||||
{
|
||||
AQH_STORAGE_FINI_FN oldFn;
|
||||
|
||||
oldFn=sto->finiFn;
|
||||
sto->finiFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_ADDDATAPOINT_FN AQH_Storage_SetAddDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_ADDDATAPOINT_FN fn)
|
||||
{
|
||||
AQH_STORAGE_ADDDATAPOINT_FN oldFn;
|
||||
|
||||
oldFn=sto->addDatapointFn;
|
||||
sto->addDatapointFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_GETDATAPOINTS_FN AQH_Storage_SetGetDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETDATAPOINTS_FN fn)
|
||||
{
|
||||
AQH_STORAGE_GETDATAPOINTS_FN oldFn;
|
||||
|
||||
oldFn=sto->getDatapointsFn;
|
||||
sto->getDatapointsFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_GETFIRSTDATAPOINT_FN AQH_Storage_SetGetFirstDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETFIRSTDATAPOINT_FN fn)
|
||||
{
|
||||
AQH_STORAGE_GETFIRSTDATAPOINT_FN oldFn;
|
||||
|
||||
oldFn=sto->getFirstDatapointFn;
|
||||
sto->getFirstDatapointFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_GETLASTDATAPOINT_FN AQH_Storage_SetGetLastDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTDATAPOINT_FN fn)
|
||||
{
|
||||
AQH_STORAGE_GETLASTDATAPOINT_FN oldFn;
|
||||
|
||||
oldFn=sto->getLastDatapointFn;
|
||||
sto->getLastDatapointFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
AQH_STORAGE_GETLASTNDATAPOINTS_FN AQH_Storage_SetGetLastNDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTNDATAPOINTS_FN fn)
|
||||
{
|
||||
AQH_STORAGE_GETLASTNDATAPOINTS_FN oldFn;
|
||||
|
||||
oldFn=sto->getLastNDatapointsFn;
|
||||
sto->getLastNDatapointsFn=fn;
|
||||
return oldFn;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int AQH_Storage_Init(AQH_STORAGE *sto)
|
||||
{
|
||||
int rv;
|
||||
@@ -244,39 +365,6 @@ int AQH_Storage_Fini(AQH_STORAGE *sto)
|
||||
|
||||
|
||||
|
||||
int AQH_Storage_WriteState(AQH_STORAGE *sto)
|
||||
{
|
||||
int rv;
|
||||
|
||||
rv=AQH_Storage_WriteStateFile(sto, sto->stateFile);
|
||||
if (rv<0) {
|
||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
||||
return rv;
|
||||
}
|
||||
sto->runtimeFlags&=~AQH_STORAGE_RTFLAGS_MODIFIED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
const char *AQH_Storage_GetDataFileFolder(const AQH_STORAGE *sto)
|
||||
{
|
||||
return sto?sto->dataFileFolder:NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void AQH_Storage_SetDataFileFolder(AQH_STORAGE *sto, const char *s)
|
||||
{
|
||||
if (sto) {
|
||||
free(sto->dataFileFolder);
|
||||
sto->dataFileFolder=s?strdup(s):NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
int AQH_Storage_AddDatapoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint)
|
||||
{
|
||||
AQH_DATAFILE *df;
|
||||
@@ -471,6 +559,34 @@ int AQH_Storage_GetLastDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *p
|
||||
|
||||
|
||||
|
||||
int AQH_Storage_GetFirstDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue)
|
||||
{
|
||||
AQH_DATAFILE *df;
|
||||
uint64_t numEntries;
|
||||
int rv;
|
||||
|
||||
df=_getDataFileByValueId(sto, valueId);
|
||||
if (df==NULL) {
|
||||
DBG_ERROR(AQH_LOGDOMAIN, "No file for value id %lu", (unsigned long int) valueId);
|
||||
return GWEN_ERROR_INVALID;
|
||||
}
|
||||
numEntries=AQH_DataFile_GetNumberOfEntries(df);
|
||||
if (numEntries<2) {
|
||||
DBG_INFO(AQH_LOGDOMAIN, "No data entries in file");
|
||||
return GWEN_ERROR_NO_DATA;
|
||||
}
|
||||
|
||||
rv=AQH_DataFile_ReadRecord(df, 1, pTimestamp, pValue);
|
||||
if (rv<0) {
|
||||
DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
AQH_DATAFILE *_getDataFileByValueId(AQH_STORAGE *sto, uint64_t valueId)
|
||||
{
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
#include <aqhome/api.h>
|
||||
|
||||
#include <gwenhywfar/inherit.h>
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -20,6 +22,8 @@ extern "C" {
|
||||
|
||||
|
||||
typedef struct AQH_STORAGE AQH_STORAGE;
|
||||
GWEN_INHERIT_FUNCTION_LIB_DEFS(AQH_STORAGE, AQHOME_API)
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -40,6 +44,17 @@ typedef struct AQH_STORAGE AQH_STORAGE;
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef int (*AQH_STORAGE_INIT_FN)(AQH_STORAGE *sto);
|
||||
typedef int (*AQH_STORAGE_FINI_FN)(AQH_STORAGE *sto);
|
||||
|
||||
typedef int (*AQH_STORAGE_ADDDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint);
|
||||
typedef uint64_t *(*AQH_STORAGE_GETDATAPOINTS_FN)(AQH_STORAGE *sto, uint64_t valueId,
|
||||
uint64_t fromTime, uint64_t toTime,
|
||||
uint64_t maxArrayLen);
|
||||
typedef int (*AQH_STORAGE_GETFIRSTDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue);
|
||||
typedef int (*AQH_STORAGE_GETLASTDATAPOINT_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue);
|
||||
typedef uint64_t *(*AQH_STORAGE_GETLASTNDATAPOINTS_FN)(AQH_STORAGE *sto, uint64_t valueId, uint64_t maxDataPointsRequested);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
@@ -74,14 +89,23 @@ AQHOME_API int AQH_Storage_Fini(AQH_STORAGE *sto);
|
||||
|
||||
AQHOME_API int AQH_Storage_WriteState(AQH_STORAGE *sto);
|
||||
|
||||
|
||||
AQHOME_API int AQH_Storage_AddDatapoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t timestamp, double dataPoint);
|
||||
AQHOME_API uint64_t *AQH_Storage_GetDataPoints(AQH_STORAGE *sto, uint64_t valueId,
|
||||
uint64_t fromTime, uint64_t toTime,
|
||||
uint64_t maxArrayLen);
|
||||
AQHOME_API int AQH_Storage_GetFirstDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue);
|
||||
AQHOME_API int AQH_Storage_GetLastDataPoint(AQH_STORAGE *sto, uint64_t valueId, uint64_t *pTimestamp, double *pValue);
|
||||
AQHOME_API uint64_t *AQH_Storage_GetLastNDataPoints(AQH_STORAGE *sto, uint64_t valueId, uint64_t maxDataPointsRequested);
|
||||
|
||||
|
||||
AQHOME_API AQH_STORAGE_INIT_FN AQH_Storage_SetInitFn(AQH_STORAGE *sto, AQH_STORAGE_INIT_FN fn);
|
||||
AQHOME_API AQH_STORAGE_FINI_FN AQH_Storage_SetFiniFn(AQH_STORAGE *sto, AQH_STORAGE_FINI_FN fn);
|
||||
AQHOME_API AQH_STORAGE_ADDDATAPOINT_FN AQH_Storage_SetAddDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_ADDDATAPOINT_FN fn);
|
||||
AQHOME_API AQH_STORAGE_GETDATAPOINTS_FN AQH_Storage_SetGetDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETDATAPOINTS_FN fn);
|
||||
AQHOME_API AQH_STORAGE_GETFIRSTDATAPOINT_FN AQH_Storage_SetGetFirstDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETFIRSTDATAPOINT_FN fn);
|
||||
AQHOME_API AQH_STORAGE_GETLASTDATAPOINT_FN AQH_Storage_SetGetLastDatapointFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTDATAPOINT_FN fn);
|
||||
AQHOME_API AQH_STORAGE_GETLASTNDATAPOINTS_FN AQH_Storage_SetGetLastNDatapointsFn(AQH_STORAGE *sto, AQH_STORAGE_GETLASTNDATAPOINTS_FN fn);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
|
||||
struct AQH_STORAGE {
|
||||
GWEN_INHERIT_ELEMENT(AQH_STORAGE)
|
||||
|
||||
AQH_VALUE_LIST *valueList;
|
||||
AQH_DEVICE_LIST *deviceList;
|
||||
|
||||
@@ -37,6 +39,14 @@ struct AQH_STORAGE {
|
||||
AQH_DATAFILE_LIST *dataFileList;
|
||||
|
||||
uint32_t runtimeFlags;
|
||||
|
||||
AQH_STORAGE_INIT_FN initFn;
|
||||
AQH_STORAGE_FINI_FN finiFn;
|
||||
AQH_STORAGE_ADDDATAPOINT_FN addDatapointFn;
|
||||
AQH_STORAGE_GETDATAPOINTS_FN getDatapointsFn;
|
||||
AQH_STORAGE_GETFIRSTDATAPOINT_FN getFirstDatapointFn;
|
||||
AQH_STORAGE_GETLASTDATAPOINT_FN getLastDatapointFn;
|
||||
AQH_STORAGE_GETLASTNDATAPOINTS_FN getLastNDatapointsFn;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user