Skip to content

Commit cab0bde

Browse files
Fixed bug in ConnectParams.set() where parameters found in a connect
string (like "host" and "service_name") would be ignored.
1 parent 86d91d3 commit cab0bde

File tree

4 files changed

+103
-29
lines changed

4 files changed

+103
-29
lines changed

doc/src/api_manual/connect_params.rst

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,8 @@ ConnectParams Methods
6161
connection_id_prefix=None, ssl_context=None, sdu=None, \
6262
pool_boundary=None, use_tcp_fast_open=False, handle=None)
6363

64-
Sets the default values for one or more of the parameters of an empty
65-
ConnectParams object. A default will be overriden when a connection string
66-
with that attribute is parsed. After a ConnectParams object has been
67-
populated by parsing a connection string, ``ConnectParams.set()`` will not
68-
override any values.
64+
Sets the values for one or more of the parameters of a ConnectParams
65+
object.
6966

7067
.. versionchanged:: 2.1.0
7168

doc/src/release_notes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ Common Changes
8585
#) If both the ``sid`` and ``service_name`` parameters are specified to
8686
:meth:`oracledb.makedsn()`, now only the ``service_name`` parameter is
8787
used and the ``sid`` parameter is ignored.
88+
#) Fixed bug in :meth:`ConnectParams.set()` where parameters found in a
89+
connect string (like ``host`` and ``service_name``) would be ignored.
8890
#) Fixed bug in :meth:`Connection.tpc_recover()` where the returned items were
8991
not of the type returned by :meth:`Connection.xid()` as documented.
9092
#) Internal changes to ensure that no circular imports occur.

src/oracledb/impl/base/connect_params.pyx

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ cdef class ConnectParamsImpl:
145145
Sets the property values based on the supplied arguments. All values
146146
not supplied will be left unchanged.
147147
"""
148+
cdef:
149+
Description description
150+
Address address
151+
152+
# set parameters found directly on the ConnectParamsImpl object
148153
self._external_handle = args.get("handle", self._external_handle)
149154
_set_str_param(args, "user", self)
150155
_set_str_param(args, "proxy_user", self)
@@ -166,13 +171,21 @@ cdef class ConnectParamsImpl:
166171
_set_obj_param(args, "appcontext", self)
167172
_set_obj_param(args, "shardingkey", self)
168173
_set_obj_param(args, "supershardingkey", self)
169-
self._default_description.set_from_connect_data_args(args)
170-
self._default_description.set_from_description_args(args)
171-
self._default_description.set_from_security_args(args)
172-
self._default_address.set_from_args(args)
173174
_set_bool_param(args, "externalauth", &self.externalauth)
174175
self._set_access_token_param(args.get("access_token"))
175176

177+
# set parameters found on Description instances
178+
self._default_description.set_from_args(args)
179+
for description in self.description_list.children:
180+
if description is not self._default_description:
181+
description.set_from_args(args)
182+
183+
# set parameters found on Address instances
184+
self._default_address.set_from_args(args)
185+
for address in self.description_list.get_addresses():
186+
if address is not self._default_address:
187+
address.set_from_args(args)
188+
176189
cdef int _check_credentials(self) except -1:
177190
"""
178191
Check to see that credentials have been supplied: either a password or
@@ -901,25 +914,32 @@ cdef class Description(ConnectParamsNode):
901914
"""
902915
cdef Description description = Description.__new__(Description)
903916
description._copy(self)
904-
description.service_name = self.service_name
905-
description.sid = self.sid
906-
description.server_type = self.server_type
907-
description.cclass = self.cclass
908-
description.purity = self.purity
909917
description.expire_time = self.expire_time
910-
description.load_balance = self.load_balance
911-
description.source_route = self.source_route
912918
description.retry_count = self.retry_count
913919
description.retry_delay = self.retry_delay
914920
description.sdu = self.sdu
915921
description.tcp_connect_timeout = self.tcp_connect_timeout
922+
description.service_name = self.service_name
923+
description.server_type = self.server_type
924+
description.sid = self.sid
925+
description.cclass = self.cclass
926+
description.connection_id_prefix = self.connection_id_prefix
927+
description.pool_boundary = self.pool_boundary
928+
description.purity = self.purity
916929
description.ssl_server_dn_match = self.ssl_server_dn_match
930+
description.use_tcp_fast_open = self.use_tcp_fast_open
917931
description.ssl_server_cert_dn = self.ssl_server_cert_dn
918932
description.wallet_location = self.wallet_location
919-
description.connection_id_prefix = self.connection_id_prefix
920-
description.use_tcp_fast_open = self.use_tcp_fast_open
921933
return description
922934

935+
def set_from_args(self, dict args):
936+
"""
937+
Set parameter values from an argument dictionary.
938+
"""
939+
self.set_from_connect_data_args(args)
940+
self.set_from_description_args(args)
941+
self.set_from_security_args(args)
942+
923943
def set_from_connect_data_args(self, dict args):
924944
"""
925945
Set parameter values from an argument dictionary or a (CONNECT_DATA)

tests/test_4500_connect_params.py

Lines changed: 66 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -596,18 +596,20 @@ def test_4537(self):
596596
self.assertEqual(params.connection_id_prefix, "prefix4562b")
597597

598598
def test_4538(self):
599-
"4538 - test overriding parameters with parse_connection_string"
599+
"4538 - test overriding parameters"
600600
params = oracledb.ConnectParams()
601-
params.parse_connect_string("my_host:3578/my_service_name")
602-
params.set(service_name="new_service_name", port=613)
603-
self.assertEqual(params.service_name, "my_service_name")
604-
self.assertEqual(params.port, 3578)
605-
606-
params = oracledb.ConnectParams()
607-
params.set(service_name="my_service_name", port=613)
608-
params.parse_connect_string("my_host:3578/new_service_name")
609-
self.assertEqual(params.service_name, "new_service_name")
610-
self.assertEqual(params.port, 3578)
601+
host = "my_host_4538"
602+
port = 3578
603+
service_name = "my_service_name_4538"
604+
connect_string = f"{host}:{port}/{service_name}"
605+
params.parse_connect_string(connect_string)
606+
self.assertEqual(params.service_name, service_name)
607+
self.assertEqual(params.port, port)
608+
new_service_name = "new_service_name_4538"
609+
new_port = 613
610+
params.set(service_name=new_service_name, port=new_port)
611+
self.assertEqual(params.service_name, new_service_name)
612+
self.assertEqual(params.port, new_port)
611613

612614
def test_4539(self):
613615
"4539 - test ConnectParams repr()"
@@ -656,6 +658,59 @@ def test_4539(self):
656658
self.assertEqual(repr(params), expected_value)
657659
self.assertIs(params.purity, oracledb.Purity.SELF)
658660
self.assertIs(params.mode, oracledb.AuthMode.SYSDBA)
661+
new_values = [
662+
("user", "USER_NEW"),
663+
("proxy_user", "PROXY_USER_NEW"),
664+
("host", "my_host_new"),
665+
("port", 1621),
666+
("protocol", "tcps"),
667+
("https_proxy", "proxy_b"),
668+
("https_proxy_port", 4529),
669+
("service_name", "my_service_name_new"),
670+
("sid", "my_sid_new"),
671+
("server_type", "pooled"),
672+
("cclass", "cclass_new"),
673+
("purity", oracledb.PURITY_NEW),
674+
("expire_time", 90),
675+
("retry_count", 8),
676+
("retry_delay", 15),
677+
("tcp_connect_timeout", 15.0),
678+
("ssl_server_dn_match", True),
679+
("ssl_server_cert_dn", "CN=unknown19_new"),
680+
("wallet_location", "/tmp/wallet_loc1_new"),
681+
("events", False),
682+
("externalauth", False),
683+
("mode", oracledb.AUTH_MODE_SYSDGD),
684+
("disable_oob", False),
685+
("stmtcachesize", 35),
686+
("edition", "edition_new"),
687+
("tag", "tag_new"),
688+
("matchanytag", False),
689+
("config_dir", "config_dir_new"),
690+
("appcontext", [("a", "b", "c", "new")]),
691+
("shardingkey", [1, 2, 3, 4]),
692+
("supershardingkey", [6]),
693+
("debug_jdwp", "host=host;port=4638"),
694+
("connection_id_prefix", "prefix4664"),
695+
("ssl_context", ssl.create_default_context()),
696+
("sdu", 32768),
697+
("pool_boundary", "transaction"),
698+
("use_tcp_fast_open", False),
699+
]
700+
params.set(**dict(new_values))
701+
parts = [f"{name}={value!r}" for name, value in new_values]
702+
expected_value = f"ConnectParams({', '.join(parts)})"
703+
self.assertEqual(repr(params), expected_value)
704+
cs_values = dict(
705+
host="my_host_final",
706+
service_name="my_service_final",
707+
)
708+
connect_string = f"{cs_values['host']}/{cs_values['service_name']}"
709+
params.parse_connect_string(connect_string)
710+
final_values = [(n, cs_values.get(n, v)) for n, v in new_values]
711+
parts = [f"{name}={value!r}" for name, value in final_values]
712+
expected_value = f"ConnectParams({', '.join(parts)})"
713+
self.assertEqual(repr(params), expected_value)
659714

660715
def test_4540(self):
661716
"4540 - connect descriptor with SDU"

0 commit comments

Comments
 (0)