@@ -311,10 +311,10 @@ def _delete_node(self, item, user):
311
311
return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
312
312
313
313
if item .DeleteTargetReferences :
314
- for elem in self ._aspace .keys ():
315
- for rdesc in self . _aspace [ elem ] .references :
314
+ for ndata in self ._aspace .values ():
315
+ for rdesc in ndata .references :
316
316
if rdesc .NodeId == item .NodeId :
317
- self . _aspace [ elem ] .references .remove (rdesc )
317
+ ndata .references .remove (rdesc )
318
318
319
319
self ._delete_node_callbacks (self ._aspace [item .NodeId ])
320
320
@@ -479,23 +479,21 @@ class AddressSpace(ThreadSafeDict):
479
479
and helper methods.
480
480
The methods are thread safe
481
481
"""
482
+ DEFAULT_USER_NAMESPACE_INDEX = 2
482
483
483
484
def __init__ (self , cache = None ):
484
485
super (AddressSpace , self ).__init__ (cache )
485
486
self .logger = logging .getLogger (__name__ )
486
487
self ._datachange_callback_counter = 200
487
488
self ._handle_to_attribute_map = {}
488
- self ._default_idx = 2
489
489
self ._nodeid_counter = {0 : 20000 , 1 : 2000 }
490
490
491
- def generate_nodeid (self , idx = None ):
492
- if idx is None :
493
- idx = self ._default_idx
491
+ def generate_nodeid (self , idx = DEFAULT_USER_NAMESPACE_INDEX ):
494
492
if idx in self ._nodeid_counter :
495
493
self ._nodeid_counter [idx ] += 1
496
494
else :
497
495
# get the biggest identifier number from the existed nodes in address space
498
- identifier_list = sorted ([nodeid .Identifier for nodeid in self . keys ()
496
+ identifier_list = sorted ([nodeid .Identifier for nodeid in self
499
497
if nodeid .NamespaceIndex == idx and nodeid .NodeIdType
500
498
in (ua .NodeIdType .Numeric , ua .NodeIdType .TwoByte , ua .NodeIdType .FourByte )])
501
499
if identifier_list :
@@ -505,15 +503,15 @@ def generate_nodeid(self, idx=None):
505
503
nodeid = ua .NodeId (self ._nodeid_counter [idx ], idx )
506
504
with self ._lock : # OK since reentrant lock
507
505
while True :
508
- if nodeid in self . keys () :
506
+ if nodeid in self :
509
507
nodeid = self .generate_nodeid (idx )
510
508
else :
511
509
return nodeid
512
510
513
511
def get_attribute_value (self , nodeid , attr ):
514
512
with self ._lock :
515
513
self .logger .debug ("get attr val: %s %s" , nodeid , attr )
516
- if nodeid not in self . keys () :
514
+ if nodeid not in self :
517
515
dv = ua .DataValue ()
518
516
dv .StatusCode = ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
519
517
return dv
@@ -530,10 +528,11 @@ def get_attribute_value(self, nodeid, attr):
530
528
def set_attribute_value (self , nodeid , attr , value ):
531
529
with self ._lock :
532
530
self .logger .debug ("set attr val: %s %s %s" , nodeid , attr , value )
533
- node = self .get (nodeid , None )
534
- if node is None :
531
+
532
+ try :
533
+ attval = self [nodeid ].attributes .get (attr , None )
534
+ except KeyError :
535
535
return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
536
- attval = node .attributes .get (attr , None )
537
536
if attval is None :
538
537
return ua .StatusCode (ua .StatusCodes .BadAttributeIdInvalid )
539
538
@@ -554,12 +553,13 @@ def set_attribute_value(self, nodeid, attr, value):
554
553
def add_datachange_callback (self , nodeid , attr , callback ):
555
554
with self ._lock :
556
555
self .logger .debug ("set attr callback: %s %s %s" , nodeid , attr , callback )
557
- if nodeid not in self .keys ():
556
+
557
+ try :
558
+ attval = self [nodeid ].attributes .get (attr , None )
559
+ except KeyError :
558
560
return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown ), 0
559
- node = self [nodeid ]
560
- if attr not in node .attributes :
561
+ if attval is None :
561
562
return ua .StatusCode (ua .StatusCodes .BadAttributeIdInvalid ), 0
562
- attval = node .attributes [attr ]
563
563
self ._datachange_callback_counter += 1
564
564
handle = self ._datachange_callback_counter
565
565
attval .datachange_callbacks [handle ] = callback
0 commit comments