Skip to content

Commit 2b91c94

Browse files
committed
sqlite address space: support to remove references
1 parent 447699f commit 2b91c94

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

opcua/server/address_space_sqlite.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ def append(self, ref):
7777
self._aspace._insert_reference_threadsafe(self.nodeid, ref, commit=True)
7878

7979
def remove(self, ref):
80-
raise NotImplementedError
80+
self._aspace._remove_reference_threadsafe(self.nodeid, ref, commit=True)
81+
list.remove(self, ref)
8182

8283

8384
class AddressSpaceSQLite(AddressSpace):
@@ -437,9 +438,8 @@ def _insert_reference(backend, nodeid, ref, table=REFS_TABLE_NAME, commit=True):
437438
assert(isinstance(ref.NodeClass, (int, ua.uaprotocol_auto.NodeClass)))
438439
assert(isinstance(ref.TypeDefinition, ua.uatypes.NodeId))
439440

440-
binNodeId = ua.ua_binary.nodeid_to_binary(nodeid) # Our own nodeid
441-
refNodeId = ua.ua_binary.nodeid_to_binary(ref.NodeId) # Referred nodeid
442-
primaryKey = binNodeId + refNodeId + pack(">B", int(ref.IsForward))
441+
binNodeId, refNodeId, primaryKey = \
442+
AddressSpaceSQLite._calcRefPrimaryKey(nodeid, ref)
443443

444444
cmd = 'INSERT OR REPLACE INTO "{tn}" VALUES ({q})'.format(tn=table, q=', '.join('?'*13))
445445
params = (
@@ -459,6 +459,26 @@ def _insert_reference(backend, nodeid, ref, table=REFS_TABLE_NAME, commit=True):
459459
)
460460
backend.execute_write(cmd, params=params, commit=commit)
461461

462+
def _calcRefPrimaryKey(nodeid, ref):
463+
binNodeId = ua.ua_binary.nodeid_to_binary(nodeid) # Our own nodeid
464+
refNodeId = ua.ua_binary.nodeid_to_binary(ref.NodeId) # Referred nodeid
465+
primaryKey = binNodeId + refNodeId + pack(">B", int(ref.IsForward))
466+
return binNodeId, refNodeId, primaryKey
467+
468+
def _remove_reference_threadsafe(self, nodeid, ref, table=REFS_TABLE_NAME, commit=True):
469+
with self._lock:
470+
AddressSpaceSQLite._remove_reference(self.backend, nodeid, ref, table, commit=commit)
471+
472+
@staticmethod
473+
def _remove_reference(backend, nodeid, ref, table=REFS_TABLE_NAME, commit=True):
474+
cmd = 'DELETE FROM "{tn}" WHERE _Id = ?'.format(tn=table)
475+
binNodeId, refNodeId, primaryKey = \
476+
AddressSpaceSQLite._calcRefPrimaryKey(nodeid, ref)
477+
params = (
478+
sqlite3.Binary(primaryKey),
479+
)
480+
backend.execute_write(cmd, params=params, commit=commit)
481+
462482
@staticmethod
463483
def _read_reference_row(row):
464484
ref = ua.uaprotocol_auto.ReferenceDescription()

0 commit comments

Comments
 (0)