Skip to content

Commit 1a7706e

Browse files
committed
Added changes for dbt-oracle 1.8
1 parent 7cd6f7c commit 1a7706e

File tree

13 files changed

+98
-99
lines changed

13 files changed

+98
-99
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Configuration variables
2-
VERSION=1.7.5
2+
VERSION=1.8.0
33
PROJ_DIR?=$(shell pwd)
44
VENV_DIR?=${PROJ_DIR}/.bldenv
55
BUILD_DIR=${PROJ_DIR}/build

dbt/adapters/oracle/connection_helper.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
import enum
1818
import os
1919

20-
import dbt.exceptions
21-
from dbt.events import AdapterLogger
20+
import dbt_common.exceptions
21+
from dbt.adapters.events.logging import AdapterLogger
2222

23-
from dbt.ui import warning_tag, yellow, red
23+
from dbt_common.ui import warning_tag, yellow, red
2424

2525
logger = AdapterLogger("oracle")
2626

@@ -129,5 +129,5 @@ class OracleDriverType(str, enum.Enum):
129129
SQLNET_ORA_CONFIG = OracleNetConfig.from_env()
130130
logger.info("Running in thin mode")
131131
else:
132-
raise dbt.exceptions.DbtRuntimeError("Invalid value set for ORA_PYTHON_DRIVER_TYPE\n"
133-
"Use any one of 'cx', 'thin', or 'thick'")
132+
raise dbt_common.exceptions.DbtRuntimeError("Invalid value set for ORA_PYTHON_DRIVER_TYPE\n"
133+
"Use any one of 'cx', 'thin', or 'thick'")

dbt/adapters/oracle/connections.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,16 @@
2323
import uuid
2424
import platform
2525

26-
import dbt.exceptions
27-
from dbt.adapters.base import Credentials
26+
import dbt_common.exceptions
27+
from dbt.adapters.contracts.connection import AdapterResponse, Credentials
28+
from dbt.adapters.exceptions.connection import FailedToConnectError
2829
from dbt.adapters.sql import SQLConnectionManager
29-
from dbt.contracts.connection import AdapterResponse
30-
from dbt.events.functions import fire_event
31-
from dbt.events.types import ConnectionUsed, SQLQuery, SQLCommit, SQLQueryStatus
32-
from dbt.events import AdapterLogger
33-
from dbt.events.contextvars import get_node_info
34-
from dbt.utils import cast_to_str
30+
from dbt.adapters.events.types import ConnectionUsed, SQLQuery, SQLCommit, SQLQueryStatus
31+
from dbt.adapters.events.logging import AdapterLogger
32+
33+
from dbt_common.events.functions import fire_event
34+
from dbt_common.events.contextvars import get_node_info
35+
from dbt_common.utils import cast_to_str
3536

3637
from dbt.version import __version__ as dbt_version
3738
from dbt.adapters.oracle.connection_helper import oracledb, SQLNET_ORA_CONFIG
@@ -256,7 +257,7 @@ def open(cls, connection):
256257
connection.handle = None
257258
connection.state = 'fail'
258259

259-
raise dbt.exceptions.FailedToConnectError(str(e))
260+
raise FailedToConnectError(str(e))
260261

261262
return connection
262263

@@ -302,18 +303,18 @@ def exception_handler(self, sql):
302303
logger.info("Failed to release connection!")
303304
pass
304305

305-
raise dbt.exceptions.DbtDatabaseError(str(e).strip()) from e
306+
raise dbt_common.exceptions.DbtDatabaseError(str(e).strip()) from e
306307

307308
except Exception as e:
308309
logger.info("Rolling back transaction.")
309310
self.release()
310-
if isinstance(e, dbt.exceptions.DbtRuntimeError):
311+
if isinstance(e, dbt_common.exceptions.DbtRuntimeError):
311312
# during a sql query, an internal to dbt exception was raised.
312313
# this sounds a lot like a signal handler and probably has
313314
# useful information, so raise it without modification.
314315
raise e
315316

316-
raise dbt.exceptions.DbtRuntimeError(str(e)) from e
317+
raise dbt_common.exceptions.DbtRuntimeError(str(e)) from e
317318

318319
@classmethod
319320
def get_credentials(cls, credentials):

dbt/adapters/oracle/impl.py

Lines changed: 37 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Copyright (c) 2023, Oracle and/or its affiliates.
2+
Copyright (c) 2024, Oracle and/or its affiliates.
33
Copyright (c) 2020, Vitor Avancini
44
55
Licensed under the Apache License, Version 2.0 (the "License");
@@ -16,7 +16,7 @@
1616
"""
1717
import datetime
1818
from typing import (
19-
Optional, List, Set
19+
Optional, List, Set, FrozenSet, Tuple, Iterable
2020
)
2121
from itertools import chain
2222
from typing import (
@@ -27,24 +27,23 @@
2727
import agate
2828
import requests
2929

30-
import dbt.exceptions
30+
import dbt_common.exceptions
31+
from dbt_common.contracts.constraints import ConstraintType
32+
from dbt_common.utils import filter_null_values
33+
3134
from dbt.adapters.base.relation import BaseRelation, InformationSchema
3235
from dbt.adapters.base.impl import GET_CATALOG_MACRO_NAME, ConstraintSupport, GET_CATALOG_RELATIONS_MACRO_NAME, _expect_row_value
36+
from dbt.adapters.contracts.relation import RelationConfig
37+
from dbt.adapters.events.logging import AdapterLogger
3338
from dbt.adapters.sql import SQLAdapter
3439
from dbt.adapters.base.meta import available
3540
from dbt.adapters.capability import CapabilityDict, CapabilitySupport, Support, Capability
41+
3642
from dbt.adapters.oracle import OracleAdapterConnectionManager
3743
from dbt.adapters.oracle.column import OracleColumn
3844
from dbt.adapters.oracle.relation import OracleRelation
39-
from dbt.contracts.graph.manifest import Manifest
40-
from dbt.contracts.graph.nodes import ConstraintType
41-
from dbt.events import AdapterLogger
42-
43-
from dbt.utils import filter_null_values
44-
4545
from dbt.adapters.oracle.keyword_catalog import KEYWORDS
4646
from dbt.adapters.oracle.python_submissions import OracleADBSPythonJob
47-
from dbt.adapters.oracle.connections import AdapterResponse
4847

4948
logger = AdapterLogger("oracle")
5049

@@ -139,7 +138,7 @@ def verify_database(self, database):
139138
database = database.strip('"')
140139
expected = self.config.credentials.database
141140
if expected and database.lower() != expected.lower():
142-
raise dbt.exceptions.DbtRuntimeError(
141+
raise dbt_common.exceptions.DbtRuntimeError(
143142
'Cross-db references not allowed in {} ({} vs {})'
144143
.format(self.type(), database, expected)
145144
)
@@ -210,67 +209,56 @@ def _get_one_catalog(
210209
self,
211210
information_schema: InformationSchema,
212211
schemas: Set[str],
213-
manifest: Manifest,
212+
used_schemas: FrozenSet[Tuple[str, str]],
214213
) -> agate.Table:
215-
214+
logger.info(f"GET ONE CATALOG =====> {schemas}")
215+
logger.info(f"GET ONE CATALOG =====> {information_schema}")
216+
logger.info(f"GET ONE CATALOG =====> {used_schemas}")
216217
kwargs = {"information_schema": information_schema, "schemas": schemas}
217-
table = self.execute_macro(
218-
GET_CATALOG_MACRO_NAME,
219-
kwargs=kwargs,
220-
# pass in the full manifest so we get any local project
221-
# overrides
222-
manifest=manifest,
223-
)
224-
# In case database is not defined, we can use the the configured database which we set as part of credentials
225-
for node in chain(manifest.nodes.values(), manifest.sources.values()):
226-
if not node.database or node.database == 'None':
227-
node.database = self.config.credentials.database
228-
229-
results = self._catalog_filter_table(table, manifest)
218+
table = self.execute_macro(GET_CATALOG_MACRO_NAME, kwargs=kwargs)
219+
results = self._catalog_filter_table(table, used_schemas=used_schemas)
220+
logger.info(f"GET ONE CATALOG =====> {results}")
230221
return results
231222

232223
def _get_one_catalog_by_relations(
233224
self,
234225
information_schema: InformationSchema,
235226
relations: List[BaseRelation],
236-
manifest: Manifest,
227+
used_schemas: FrozenSet[Tuple[str, str]],
237228
) -> agate.Table:
238-
229+
logger.info(f"GET ONE _get_one_catalog_by_relations =====> {relations}")
230+
logger.info(f"GET ONE _get_one_catalog_by_relations =====> {information_schema}")
231+
logger.info(f"GET ONE _get_one_catalog_by_relations =====> {used_schemas}")
239232
kwargs = {
240233
"information_schema": information_schema,
241234
"relations": relations,
242235
}
243-
table = self.execute_macro(
244-
GET_CATALOG_RELATIONS_MACRO_NAME,
245-
kwargs=kwargs,
246-
# pass in the full manifest, so we get any local project
247-
# overrides
248-
manifest=manifest,
249-
)
250-
251-
# In case database is not defined, we can use the the configured database which we set as part of credentials
252-
for node in chain(manifest.nodes.values(), manifest.sources.values()):
253-
if not node.database or node.database == 'None':
254-
node.database = self.config.credentials.database
255-
256-
results = self._catalog_filter_table(table, manifest) # type: ignore[arg-type]
236+
table = self.execute_macro(GET_CATALOG_RELATIONS_MACRO_NAME, kwargs=kwargs)
237+
results = self._catalog_filter_table(table, used_schemas) # type: ignore[arg-type]
238+
logger.info(f"GET ONE _get_one_catalog_by_relations =====> {results}")
257239
return results
258240

259241
def get_filtered_catalog(
260-
self, manifest: Manifest, relations: Optional[Set[BaseRelation]] = None
242+
self,
243+
relation_configs: Iterable[RelationConfig],
244+
used_schemas: FrozenSet[Tuple[str, str]],
245+
relations: Optional[Set[BaseRelation]] = None
261246
):
247+
logger.info(f"GET ONE get_filtered_catalog =====> {relations}")
248+
logger.info(f"GET ONE get_filtered_catalog =====> {relations}")
249+
logger.info(f"GET ONE get_filtered_catalog =====> {used_schemas}")
262250
catalogs: agate.Table
263251
if (
264252
relations is None
265253
or len(relations) > 100
266254
or not self.supports(Capability.SchemaMetadataByRelations)
267255
):
268256
# Do it the traditional way. We get the full catalog.
269-
catalogs, exceptions = self.get_catalog(manifest)
257+
catalogs, exceptions = self.get_catalog(relation_configs, used_schemas)
270258
else:
271259
# Do it the new way. We try to save time by selecting information
272260
# only for the exact set of relations we are interested in.
273-
catalogs, exceptions = self.get_catalog_by_relations(manifest, relations)
261+
catalogs, exceptions = self.get_catalog_by_relations(used_schemas, relations)
274262

275263
if relations and catalogs:
276264
relation_map = {
@@ -388,8 +376,8 @@ def quote_seed_column(
388376
elif quote_config is None:
389377
pass
390378
else:
391-
raise dbt.exceptions.CompilationError(f'The seed configuration value of "quote_columns" '
392-
f'has an invalid type {type(quote_config)}')
379+
raise dbt_common.exceptions.CompilationError(f'The seed configuration value of "quote_columns" '
380+
f'has an invalid type {type(quote_config)}')
393381

394382
if quote_columns:
395383
return self.quote(column)
@@ -417,7 +405,7 @@ def render_raw_columns_constraints(cls, raw_columns: Dict[str, Dict[str, Any]])
417405

418406
def get_oml_auth_token(self) -> str:
419407
if self.config.credentials.oml_auth_token_uri is None:
420-
raise dbt.exceptions.DbtRuntimeError("oml_auth_token_uri should be set to run dbt-py models")
408+
raise dbt_common.exceptions.DbtRuntimeError("oml_auth_token_uri should be set to run dbt-py models")
421409
data = {
422410
"grant_type": "password",
423411
"username": self.config.credentials.user,
@@ -428,7 +416,7 @@ def get_oml_auth_token(self) -> str:
428416
json=data)
429417
r.raise_for_status()
430418
except requests.exceptions.RequestException:
431-
raise dbt.exceptions.DbtRuntimeError("Error getting OML OAuth2.0 token")
419+
raise dbt_common.exceptions.DbtRuntimeError("Error getting OML OAuth2.0 token")
432420
else:
433421
return r.json()["accessToken"]
434422

dbt/adapters/oracle/python_submissions.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Copyright (c) 2023, Oracle and/or its affiliates.
2+
Copyright (c) 2024, Oracle and/or its affiliates.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -23,10 +23,10 @@
2323
import requests
2424
import time
2525

26-
import dbt.exceptions
26+
import dbt_common.exceptions
2727
from dbt.adapters.oracle import OracleAdapterCredentials
28-
from dbt.events import AdapterLogger
29-
from dbt.ui import red, green
28+
from dbt.adapters.events.logging import AdapterLogger
29+
from dbt_common.ui import red, green
3030
from dbt.version import __version__ as dbt_version
3131

3232
# ADB-S OML Rest API minimum timeout is 1800 seconds
@@ -170,7 +170,7 @@ def schedule_async_job_and_wait_for_completion(self, data):
170170
r.raise_for_status()
171171
except requests.exceptions.RequestException as e:
172172
logger.error(red(f"Error {e} scheduling async Python job for model {self.identifier}"))
173-
raise dbt.exceptions.DbtRuntimeError(f"Error scheduling Python model {self.identifier}")
173+
raise dbt_common.exceptions.DbtRuntimeError(f"Error scheduling Python model {self.identifier}")
174174

175175
job_location = r.headers["location"]
176176
logger.info(f"Started async job {job_location}")
@@ -192,24 +192,24 @@ def schedule_async_job_and_wait_for_completion(self, data):
192192
job_result_json = job_result.json()
193193
if 'errorMessage' in job_result_json:
194194
logger.error(red(f"FAILURE - Python model {self.identifier} Job failure is: {job_result_json}"))
195-
raise dbt.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
195+
raise dbt_common.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
196196
job_result.raise_for_status()
197197
logger.info(green(f"SUCCESS - Python model {self.identifier} Job result is: {job_result_json}"))
198198
return
199199
elif job_status_code == http.HTTPStatus.INTERNAL_SERVER_ERROR:
200200
logger.error(red(f"FAILURE - Job status is: {job_status.json()}"))
201-
raise dbt.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
201+
raise dbt_common.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
202202
else:
203203
logger.debug(f"Python model {self.identifier} job status is: {job_status.json()}")
204204
job_status.raise_for_status()
205205

206206
except requests.exceptions.RequestException as e:
207207
logger.error(red(f"Error {e} checking status of Python job {job_location} for model {self.identifier}"))
208-
raise dbt.exceptions.DbtRuntimeError(f"Error checking status for job {job_location}")
208+
raise dbt_common.exceptions.DbtRuntimeError(f"Error checking status for job {job_location}")
209209

210210
time.sleep(DEFAULT_DELAY_BETWEEN_POLL_IN_SECONDS)
211211
logger.error(red(f"Timeout error for Python model {self.identifier}"))
212-
raise dbt.exceptions.DbtRuntimeError(f"Timeout error for Python model {self.identifier}")
212+
raise dbt_common.exceptions.DbtRuntimeError(f"Timeout error for Python model {self.identifier}")
213213

214214
def __call__(self, *args, **kwargs):
215215
data = {
@@ -234,10 +234,10 @@ def __call__(self, *args, **kwargs):
234234
job_result = r.json()
235235
if 'errorMessage' in job_result:
236236
logger.error(red(f"FAILURE - Python model {self.identifier} Job failure is: {job_result}"))
237-
raise dbt.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
237+
raise dbt_common.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
238238
r.raise_for_status()
239239
logger.info(green(f"SUCCESS - Python model {self.identifier} Job result is: {job_result}"))
240240
except requests.exceptions.RequestException as e:
241241
logger.error(red(f"Error {e} running Python model {self.identifier}"))
242-
raise dbt.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
242+
raise dbt_common.exceptions.DbtRuntimeError(f"Error running Python model {self.identifier}")
243243

dbt/adapters/oracle/relation.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@
1919
from dataclasses import dataclass, field
2020

2121
from dbt.adapters.base.relation import BaseRelation
22+
from dbt.adapters.events.logging import AdapterLogger
2223
from dbt.adapters.relation_configs import (
2324
RelationConfigBase,
2425
RelationConfigChangeAction,
2526
RelationResults,
2627
)
2728
from dbt.context.providers import RuntimeConfigObject
2829
from dbt.contracts.graph.nodes import ModelNode
29-
from dbt.contracts.relation import RelationType
30+
from dbt.adapters.base import RelationType
3031
from dbt.exceptions import DbtRuntimeError
3132

3233
from dbt.adapters.oracle.relation_configs import (
@@ -40,7 +41,7 @@
4041
OracleQuotePolicy,
4142
OracleIncludePolicy)
4243

43-
from dbt.events import AdapterLogger
44+
4445

4546
logger = AdapterLogger("oracle")
4647

dbt/adapters/oracle/relation_configs/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
RelationResults,
2525
)
2626
from dbt.contracts.graph.nodes import ModelNode
27-
from dbt.contracts.relation import ComponentName
27+
from dbt.adapters.contracts.relation import ComponentName
2828

2929
from dbt.adapters.oracle.relation_configs.policies import (
3030
OracleQuotePolicy,

0 commit comments

Comments
 (0)