blob: e7722f3a70f021adffff7beec274f0924e293ca6 [file] [log] [blame]
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* Copyright 2018 (c) basysKom GmbH <opensource@basyskom.com> (Author: Peter Rustler)
*/
#ifndef UA_PLUGIN_HISTORY_DATA_BACKEND_H_
#define UA_PLUGIN_HISTORY_DATA_BACKEND_H_
#include <open62541/server.h>
_UA_BEGIN_DECLS
typedef enum {
MATCH_EQUAL, /* Match with the exact timestamp. */
MATCH_AFTER, /* Match the value with the timestamp in the
database that is the first later in time from the provided timestamp. */
MATCH_EQUAL_OR_AFTER, /* Match exactly if possible, or the first timestamp
later in time from the provided timestamp. */
MATCH_BEFORE, /* Match the first timestamp in the database that is earlier
in time from the provided timestamp. */
MATCH_EQUAL_OR_BEFORE /* Match exactly if possible, or the first timestamp
that is earlier in time from the provided timestamp. */
} MatchStrategy;
typedef struct UA_HistoryDataBackend UA_HistoryDataBackend;
struct UA_HistoryDataBackend {
void *context;
void
(*deleteMembers)(UA_HistoryDataBackend *backend);
/* This function sets a DataValue for a node in the historical data storage.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node for which the value shall be stored.
* value is the value which shall be stored.
* historizing is the historizing flag of the node identified by nodeId.
* If sessionId is NULL, the historizing flag is invalid and must not be used. */
UA_StatusCode
(*serverSetHistoryData)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
UA_Boolean historizing,
const UA_DataValue *value);
/* This function is the high level interface for the ReadRaw operation. Set
* it to NULL if you use the low level API for your plugin. It should be
* used if the low level interface does not suite your database. It is more
* complex to implement the high level interface but it also provide more
* freedom. If you implement this, then set all low level api function
* pointer to NULL.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* backend is the HistoryDataBackend whose storage is to be queried.
* start is the start time of the HistoryRead request.
* end is the end time of the HistoryRead request.
* nodeId is the node id of the node for which historical data is requested.
* maxSizePerResponse is the maximum number of items per response the server can provide.
* numValuesPerNode is the maximum number of items per response the client wants to receive.
* returnBounds determines if the client wants to receive bounding values.
* timestampsToReturn contains the time stamps the client is interested in.
* range is the numeric range the client wants to read.
* releaseContinuationPoints determines if the continuation points shall be released.
* continuationPoint is the continuation point the client wants to release or start from.
* outContinuationPoint is the continuation point that gets passed to the
* client by the HistoryRead service.
* result contains the result histoy data that gets passed to the client. */
UA_StatusCode
(*getHistoryData)(UA_Server *server,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_HistoryDataBackend *backend,
const UA_DateTime start,
const UA_DateTime end,
const UA_NodeId *nodeId,
size_t maxSizePerResponse,
UA_UInt32 numValuesPerNode,
UA_Boolean returnBounds,
UA_TimestampsToReturn timestampsToReturn,
UA_NumericRange range,
UA_Boolean releaseContinuationPoints,
const UA_ByteString *continuationPoint,
UA_ByteString *outContinuationPoint,
UA_HistoryData *result);
/* This function is part of the low level HistoryRead API. It returns the
* index of a value in the database which matches certain criteria.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the matching value shall be found.
* timestamp is the timestamp of the requested index.
* strategy is the matching strategy which shall be applied in finding the index. */
size_t
(*getDateTimeMatch)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
const UA_DateTime timestamp,
const MatchStrategy strategy);
/* This function is part of the low level HistoryRead API. It returns the
* index of the element after the last valid entry in the database for a
* node.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the end of storage shall be returned. */
size_t
(*getEnd)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId);
/* This function is part of the low level HistoryRead API. It returns the
* index of the last element in the database for a node.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the index of the last element
* shall be returned. */
size_t
(*lastIndex)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId);
/* This function is part of the low level HistoryRead API. It returns the
* index of the first element in the database for a node.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the index of the first
* element shall be returned. */
size_t
(*firstIndex)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId);
/* This function is part of the low level HistoryRead API. It returns the
* number of elements between startIndex and endIndex including both.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the number of elements shall be returned.
* startIndex is the index of the first element in the range.
* endIndex is the index of the last element in the range. */
size_t
(*resultSize)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
size_t startIndex,
size_t endIndex);
/* This function is part of the low level HistoryRead API. It copies data
* values inside a certain range into a buffer.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the data values shall be copied.
* startIndex is the index of the first value in the range.
* endIndex is the index of the last value in the range.
* reverse determines if the values shall be copied in reverse order.
* valueSize is the maximal number of data values to copy.
* range is the numeric range which shall be copied for every data value.
* releaseContinuationPoints determines if the continuation points shall be released.
* continuationPoint is a continuation point the client wants to release or start from.
* outContinuationPoint is a continuation point which will be passed to the client.
* providedValues contains the number of values that were copied.
* values contains the values that have been copied from the database. */
UA_StatusCode
(*copyDataValues)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
size_t startIndex,
size_t endIndex,
UA_Boolean reverse,
size_t valueSize,
UA_NumericRange range,
UA_Boolean releaseContinuationPoints,
const UA_ByteString *continuationPoint,
UA_ByteString *outContinuationPoint,
size_t *providedValues,
UA_DataValue *values);
/* This function is part of the low level HistoryRead API. It returns the
* data value stored at a certain index in the database.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the data value shall be returned.
* index is the index in the database for which the data value is requested. */
const UA_DataValue*
(*getDataValue)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
size_t index);
/* This function returns UA_TRUE if the backend supports returning bounding
* values for a node. This function is mandatory.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read
* historical data.
* nodeId is the node id of the node for which the capability to return
* bounds shall be queried. */
UA_Boolean
(*boundSupported)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId);
/* This function returns UA_TRUE if the backend supports returning the
* requested timestamps for a node. This function is mandatory.
*
* server is the server the node lives in.
* hdbContext is the context of the UA_HistoryDataBackend.
* sessionId and sessionContext identify the session that wants to read historical data.
* nodeId is the node id of the node for which the capability to return
* certain timestamps shall be queried. */
UA_Boolean
(*timestampsToReturnSupported)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
const UA_TimestampsToReturn timestampsToReturn);
UA_StatusCode
(*insertDataValue)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
const UA_DataValue *value);
UA_StatusCode
(*replaceDataValue)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
const UA_DataValue *value);
UA_StatusCode
(*updateDataValue)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
const UA_DataValue *value);
UA_StatusCode
(*removeDataValue)(UA_Server *server,
void *hdbContext,
const UA_NodeId *sessionId,
void *sessionContext,
const UA_NodeId *nodeId,
UA_DateTime startTimestamp,
UA_DateTime endTimestamp);
};
_UA_END_DECLS
#endif /* UA_PLUGIN_HISTORY_DATA_BACKEND_H_ */