21
21
import enum
22
22
import time
23
23
import uuid
24
+ import platform
24
25
25
26
import dbt .exceptions
26
27
from dbt .adapters .base import Credentials
@@ -113,6 +114,9 @@ class OracleAdapterCredentials(Credentials):
113
114
# Base URL for ADB-S OML REST API
114
115
oml_cloud_service_url : Optional [str ] = None
115
116
117
+ # session info is stored in v$session for each dbt run
118
+ session_info : Optional [Dict [str , str ]] = field (default_factory = dict )
119
+
116
120
117
121
_ALIASES = {
118
122
'dbname' : 'database' ,
@@ -137,7 +141,8 @@ def _connection_keys(self) -> Tuple[str]:
137
141
'service' , 'connection_string' ,
138
142
'shardingkey' , 'supershardingkey' ,
139
143
'cclass' , 'purity' , 'retry_count' ,
140
- 'retry_delay' , 'oml_cloud_service_url'
144
+ 'retry_delay' , 'oml_cloud_service_url' ,
145
+ 'session_info'
141
146
)
142
147
143
148
@classmethod
@@ -175,6 +180,20 @@ def get_dsn(self) -> str:
175
180
class OracleAdapterConnectionManager (SQLConnectionManager ):
176
181
TYPE = 'oracle'
177
182
183
+ @staticmethod
184
+ def get_session_info (credentials ):
185
+ default_action = "DBT RUN"
186
+ default_client_identifier = f'dbt-oracle-client-{ uuid .uuid4 ()} '
187
+ default_client_info = "_" .join ([platform .node (), platform .machine ()])
188
+ default_module = f'dbt-{ dbt_version } '
189
+ return {
190
+ "action" : credentials .session_info .get ("action" , default_action ),
191
+ "client_identifier" : credentials .session_info .get ("client_identifier" , default_client_identifier ),
192
+ "clientinfo" : credentials .session_info .get ("client_info" , default_client_info ),
193
+ "module" : credentials .session_info .get ("module" , default_module )
194
+ }
195
+
196
+
178
197
@classmethod
179
198
def open (cls , connection ):
180
199
if connection .state == 'open' :
@@ -219,15 +238,14 @@ def open(cls, connection):
219
238
220
239
try :
221
240
handle = oracledb .connect (** conn_config )
222
- # client_identifier and module are saved in corresponding columns in v$session
223
- action = "dbt run"
224
- client_identifier = f'dbt-oracle-client-{ uuid .uuid4 ()} '
225
- module = f'dbt-{ dbt_version } '
226
- client_info = {"action" : action , "client_identifier" : client_identifier , "module" : module }
227
- logger .info (f"Session info :{ json .dumps (client_info )} " )
228
- handle .module = module
229
- handle .client_identifier = client_identifier
230
- handle .action = action
241
+ # session_info is stored in v$session
242
+ session_info = cls .get_session_info (credentials = credentials )
243
+ logger .info (f"Session info :{ json .dumps (session_info )} " )
244
+ for k , v in session_info .items ():
245
+ try :
246
+ setattr (handle , k , v )
247
+ except AttributeError :
248
+ logger .warning (f"Python driver does not support setting { k } " )
231
249
connection .handle = handle
232
250
connection .state = 'open'
233
251
except oracledb .DatabaseError as e :
0 commit comments