@@ -311,10 +311,10 @@ def _delete_node(self, item, user):
311311 return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
312312
313313 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 :
316316 if rdesc .NodeId == item .NodeId :
317- self . _aspace [ elem ] .references .remove (rdesc )
317+ ndata .references .remove (rdesc )
318318
319319 self ._delete_node_callbacks (self ._aspace [item .NodeId ])
320320
@@ -479,23 +479,21 @@ class AddressSpace(ThreadSafeDict):
479479 and helper methods.
480480 The methods are thread safe
481481 """
482+ DEFAULT_USER_NAMESPACE_INDEX = 2
482483
483484 def __init__ (self , cache = None ):
484485 super (AddressSpace , self ).__init__ (cache )
485486 self .logger = logging .getLogger (__name__ )
486487 self ._datachange_callback_counter = 200
487488 self ._handle_to_attribute_map = {}
488- self ._default_idx = 2
489489 self ._nodeid_counter = {0 : 20000 , 1 : 2000 }
490490
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 ):
494492 if idx in self ._nodeid_counter :
495493 self ._nodeid_counter [idx ] += 1
496494 else :
497495 # 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
499497 if nodeid .NamespaceIndex == idx and nodeid .NodeIdType
500498 in (ua .NodeIdType .Numeric , ua .NodeIdType .TwoByte , ua .NodeIdType .FourByte )])
501499 if identifier_list :
@@ -505,15 +503,15 @@ def generate_nodeid(self, idx=None):
505503 nodeid = ua .NodeId (self ._nodeid_counter [idx ], idx )
506504 with self ._lock : # OK since reentrant lock
507505 while True :
508- if nodeid in self . keys () :
506+ if nodeid in self :
509507 nodeid = self .generate_nodeid (idx )
510508 else :
511509 return nodeid
512510
513511 def get_attribute_value (self , nodeid , attr ):
514512 with self ._lock :
515513 self .logger .debug ("get attr val: %s %s" , nodeid , attr )
516- if nodeid not in self . keys () :
514+ if nodeid not in self :
517515 dv = ua .DataValue ()
518516 dv .StatusCode = ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
519517 return dv
@@ -530,10 +528,11 @@ def get_attribute_value(self, nodeid, attr):
530528 def set_attribute_value (self , nodeid , attr , value ):
531529 with self ._lock :
532530 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 :
535535 return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown )
536- attval = node .attributes .get (attr , None )
537536 if attval is None :
538537 return ua .StatusCode (ua .StatusCodes .BadAttributeIdInvalid )
539538
@@ -554,12 +553,13 @@ def set_attribute_value(self, nodeid, attr, value):
554553 def add_datachange_callback (self , nodeid , attr , callback ):
555554 with self ._lock :
556555 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 :
558560 return ua .StatusCode (ua .StatusCodes .BadNodeIdUnknown ), 0
559- node = self [nodeid ]
560- if attr not in node .attributes :
561+ if attval is None :
561562 return ua .StatusCode (ua .StatusCodes .BadAttributeIdInvalid ), 0
562- attval = node .attributes [attr ]
563563 self ._datachange_callback_counter += 1
564564 handle = self ._datachange_callback_counter
565565 attval .datachange_callbacks [handle ] = callback
0 commit comments