11"""Databases Utilities."""
22
3+ import importlib .util
34import logging
45import ssl
56from typing import Any , Dict , Generator , Iterator , List , NamedTuple , Optional , Tuple , Union , cast
1112from awswrangler import _data_types , _utils , exceptions , secretsmanager
1213from awswrangler .catalog import get_connection
1314
15+ _cx_Oracle_found = importlib .util .find_spec ("cx_Oracle" )
16+ if _cx_Oracle_found :
17+ import cx_Oracle # pylint: disable=import-error
18+
1419_logger : logging .Logger = logging .getLogger (__name__ )
1520
1621
@@ -42,7 +47,7 @@ def _get_connection_attributes_from_catalog(
4247 database_sep = ";databaseName="
4348 else :
4449 database_sep = "/"
45- port , database = details ["JDBC_CONNECTION_URL" ].split (":" )[3 ].split (database_sep )
50+ port , database = details ["JDBC_CONNECTION_URL" ].split (":" )[- 1 ].split (database_sep )
4651 ssl_context : Optional [ssl .SSLContext ] = None
4752 if details .get ("JDBC_ENFORCE_SSL" ) == "true" :
4853 ssl_cert_path : Optional [str ] = details .get ("CUSTOM_JDBC_CERT" )
@@ -57,11 +62,12 @@ def _get_connection_attributes_from_catalog(
5762 f"No CA certificate found at { ssl_cert_path } ."
5863 )
5964 ssl_context = ssl .create_default_context (cadata = ssl_cadata )
65+
6066 return ConnectionAttributes (
6167 kind = details ["JDBC_CONNECTION_URL" ].split (":" )[1 ].lower (),
6268 user = details ["USERNAME" ],
6369 password = details ["PASSWORD" ],
64- host = details ["JDBC_CONNECTION_URL" ].split (":" )[2 ].replace ("/" , "" ),
70+ host = details ["JDBC_CONNECTION_URL" ].split (":" )[- 2 ].replace ("/" , "" ). replace ( "@ " , "" ),
6571 port = int (port ),
6672 database = dbname if dbname is not None else database ,
6773 ssl_context = ssl_context ,
@@ -122,6 +128,16 @@ def _convert_params(sql: str, params: Optional[Union[List[Any], Tuple[Any, ...],
122128 return args
123129
124130
131+ def _convert_db_specific_objects (col_values : List [Any ]) -> List [Any ]:
132+ if _cx_Oracle_found :
133+ if any (isinstance (col_value , cx_Oracle .LOB ) for col_value in col_values ):
134+ col_values = [
135+ col_value .read () if isinstance (col_value , cx_Oracle .LOB ) else col_value for col_value in col_values
136+ ]
137+
138+ return col_values
139+
140+
125141def _records2df (
126142 records : List [Tuple [Any ]],
127143 cols_names : List [str ],
@@ -133,12 +149,15 @@ def _records2df(
133149 arrays : List [pa .Array ] = []
134150 for col_values , col_name in zip (tuple (zip (* records )), cols_names ): # Transposing
135151 if (dtype is None ) or (col_name not in dtype ):
152+ col_values = _convert_db_specific_objects (col_values )
136153 try :
137154 array : pa .Array = pa .array (obj = col_values , safe = safe ) # Creating Arrow array
138155 except pa .ArrowInvalid as ex :
139156 array = _data_types .process_not_inferred_array (ex , values = col_values ) # Creating Arrow array
140157 else :
141158 try :
159+ if dtype [col_name ] == pa .string ():
160+ col_values = _convert_db_specific_objects (col_values )
142161 array = pa .array (obj = col_values , type = dtype [col_name ], safe = safe ) # Creating Arrow array with dtype
143162 except pa .ArrowInvalid :
144163 array = pa .array (obj = col_values , safe = safe ) # Creating Arrow array
0 commit comments