@@ -320,7 +320,7 @@ cdef class ConnectParamsImpl:
320320 # to be a full connect descriptor
321321 if connect_string.startswith(" (" ):
322322 _parse_connect_descriptor(connect_string, args)
323- return self ._process_connect_descriptor(args)
323+ return self ._process_connect_descriptor(connect_string, args)
324324
325325 # otherwise, see if the connect string is an EasyConnect string
326326 m = re.search(EASY_CONNECT_PATTERN, connect_string)
@@ -342,7 +342,7 @@ cdef class ConnectParamsImpl:
342342 self ._parse_easy_connect_string(connect_string, m)
343343 else :
344344 _parse_connect_descriptor(connect_string, args)
345- self ._process_connect_descriptor(args)
345+ self ._process_connect_descriptor(connect_string, args)
346346
347347 cdef int _parse_easy_connect_string(self , str connect_string,
348348 object match) except - 1 :
@@ -382,26 +382,28 @@ cdef class ConnectParamsImpl:
382382 self .description_list = DescriptionList()
383383 self .description_list.children.append(description)
384384
385- cdef int _process_connect_descriptor(self , dict args) except - 1 :
385+ cdef int _process_connect_descriptor(self , str connect_string,
386+ dict args) except - 1 :
386387 """
387388 Internal method used for processing the parsed connect descriptor into
388389 the set of DescriptionList, Description, AddressList and Address
389390 container objects.
390391 """
391392 cdef:
393+ DescriptionList description_list
392394 AddressList address_list
393395 Description description
394396 Address address
395- self . description_list = DescriptionList()
397+ description_list = DescriptionList()
396398 list_args = args.get(" description_list" )
397399 if list_args is not None :
398- self . description_list.set_from_args(list_args)
400+ description_list.set_from_args(list_args)
399401 else :
400402 list_args = args
401403 for desc_args in list_args.get(" description" , [list_args]):
402404 description = self ._default_description.copy()
403405 description.set_from_description_args(desc_args)
404- self . description_list.children.append(description)
406+ description_list.children.append(description)
405407 sub_args = desc_args.get(" connect_data" )
406408 if sub_args is not None :
407409 description.set_from_connect_data_args(sub_args)
@@ -416,6 +418,10 @@ cdef class ConnectParamsImpl:
416418 address = self ._default_address.copy()
417419 address.set_from_args(addr_args)
418420 address_list.children.append(address)
421+ if not description_list.get_addresses():
422+ errors._raise_err(errors.ERR_MISSING_ADDRESS,
423+ connect_string = connect_string)
424+ self .description_list = description_list
419425
420426 cdef int _set_access_token(self , object val, int error_num) except - 1 :
421427 """
@@ -513,13 +519,7 @@ cdef class ConnectParamsImpl:
513519 """
514520 Return a list of the stored addresses.
515521 """
516- cdef:
517- AddressList addr_list
518- Description desc
519- Address addr
520- return [addr for desc in self .description_list.children \
521- for addr_list in desc.children \
522- for addr in addr_list.children]
522+ return self .description_list.get_addresses()
523523
524524 def get_connect_string (self ):
525525 """
@@ -980,6 +980,18 @@ cdef class DescriptionList(ConnectParamsNode):
980980 return parts[0 ]
981981 return f' (DESCIPTION_LIST={"".join(parts)})'
982982
983+ cdef list get_addresses(self ):
984+ """
985+ Return a list of the stored addresses.
986+ """
987+ cdef:
988+ AddressList addr_list
989+ Description desc
990+ Address addr
991+ return [addr for desc in self .children \
992+ for addr_list in desc.children \
993+ for addr in addr_list.children]
994+
983995 def set_from_args (self , dict args ):
984996 """
985997 Set paramter values from an argument dictionary or a (DESCRIPTION_LIST)
0 commit comments