Nodestore --------- Stores nodes that can be indexed by their NodeId. Internally, it is based on a hash-map implementation. .. code-block:: c struct UA_NodeStore; typedef struct UA_NodeStore UA_NodeStore; Nodestore Lifecycle ^^^^^^^^^^^^^^^^^^^ .. code-block:: c /* Create a new nodestore */ UA_NodeStore * UA_NodeStore_new(void); /* Delete the nodestore and all nodes in it. Do not call from a read-side critical section (multithreading). */ void UA_NodeStore_delete(UA_NodeStore *ns); Node Lifecycle ^^^^^^^^^^^^^^ The following definitions are used to create empty nodes of the different node types. The memory is managed by the nodestore. Therefore, the node has to be removed via a special deleteNode function. (If the new node is not added to the nodestore.) .. code-block:: c /* Create an editable node of the given NodeClass. */ UA_Node * UA_NodeStore_newNode(UA_NodeClass nodeClass); #define UA_NodeStore_newObjectNode() \ (UA_ObjectNode*)UA_NodeStore_newNode(UA_NODECLASS_OBJECT) #define UA_NodeStore_newVariableNode() \ (UA_VariableNode*)UA_NodeStore_newNode(UA_NODECLASS_VARIABLE) #define UA_NodeStore_newMethodNode() \ (UA_MethodNode*)UA_NodeStore_newNode(UA_NODECLASS_METHOD) #define UA_NodeStore_newObjectTypeNode() \ (UA_ObjectTypeNode*)UA_NodeStore_newNode(UA_NODECLASS_OBJECTTYPE) #define UA_NodeStore_newVariableTypeNode() \ (UA_VariableTypeNode*)UA_NodeStore_newNode(UA_NODECLASS_VARIABLETYPE) #define UA_NodeStore_newReferenceTypeNode() \ (UA_ReferenceTypeNode*)UA_NodeStore_newNode(UA_NODECLASS_REFERENCETYPE) #define UA_NodeStore_newDataTypeNode() \ (UA_DataTypeNode*)UA_NodeStore_newNode(UA_NODECLASS_DATATYPE) #define UA_NodeStore_newViewNode() \ (UA_ViewNode*)UA_NodeStore_newNode(UA_NODECLASS_VIEW) /* Delete an editable node. */ void UA_NodeStore_deleteNode(UA_Node *node); Insert / Get / Replace / Remove ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: c /* Inserts a new node into the nodestore. If the nodeid is zero, then a fresh * numeric nodeid from namespace 1 is assigned. If insertion fails, the node is * deleted. */ UA_StatusCode UA_NodeStore_insert(UA_NodeStore *ns, UA_Node *node); /* The returned node is immutable. */ const UA_Node * UA_NodeStore_get(UA_NodeStore *ns, const UA_NodeId *nodeid); /* Returns an editable copy of a node (needs to be deleted with the deleteNode function or inserted / replaced into the nodestore). */ UA_Node * UA_NodeStore_getCopy(UA_NodeStore *ns, const UA_NodeId *nodeid); /* To replace a node, get an editable copy of the node, edit and replace with * this function. If the node was already replaced since the copy was made, * UA_STATUSCODE_BADINTERNALERROR is returned. If the nodeid is not found, * UA_STATUSCODE_BADNODEIDUNKNOWN is returned. In both error cases, the editable * node is deleted. */ UA_StatusCode UA_NodeStore_replace(UA_NodeStore *ns, UA_Node *node); /* Remove a node in the nodestore. */ UA_StatusCode UA_NodeStore_remove(UA_NodeStore *ns, const UA_NodeId *nodeid); Iteration ^^^^^^^^^ The following definitions are used to call a callback for every node in the nodestore. .. code-block:: c typedef void (*UA_NodeStore_nodeVisitor)(const UA_Node *node); void UA_NodeStore_iterate(UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor);