castor-extractor 0.24.33__py3-none-any.whl → 0.24.34__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of castor-extractor might be problematic. Click here for more details.

CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.24.34 - 2025-07-02
4
+
5
+ * SQLServer: multiple databases
6
+
3
7
  ## 0.24.33 - 2025-07-10
4
8
 
5
9
  * Tableau - Add an option to skip fields ingestion
@@ -10,7 +14,7 @@
10
14
 
11
15
  ## 0.24.31 - 2025-07-02
12
16
 
13
- * Looker Studio: add option to list users via a provided JSON file
17
+ * Looker Studio: add an option to list users via a provided JSON file
14
18
 
15
19
  ## 0.24.30 - 2025-06-26
16
20
 
@@ -23,6 +23,16 @@ def main():
23
23
  action="store_true",
24
24
  help="Skips files already extracted instead of replacing them",
25
25
  )
26
+ parser.add_argument(
27
+ "--db-allowed",
28
+ nargs="*",
29
+ help="List of databases that should be extracted",
30
+ )
31
+ parser.add_argument(
32
+ "--db-blocked",
33
+ nargs="*",
34
+ help="List of databases that should not be extracted",
35
+ )
26
36
  parser.set_defaults(skip_existing=False)
27
37
 
28
38
  args = parser.parse_args()
@@ -35,4 +45,6 @@ def main():
35
45
  password=args.password,
36
46
  output_directory=args.output,
37
47
  skip_existing=args.skip_existing,
48
+ db_allowed=args.db_allowed,
49
+ db_blocked=args.db_blocked,
38
50
  )
@@ -19,7 +19,13 @@ from .client import (
19
19
  handle_response,
20
20
  uri_encode,
21
21
  )
22
- from .collection import deduplicate, empty_iterator, group_by, mapping_from_rows
22
+ from .collection import (
23
+ deduplicate,
24
+ empty_iterator,
25
+ filter_items,
26
+ group_by,
27
+ mapping_from_rows,
28
+ )
23
29
  from .constants import OUTPUT_DIR
24
30
  from .deprecate import deprecate_python
25
31
  from .env import from_env
@@ -2,6 +2,8 @@ from collections import defaultdict
2
2
  from collections.abc import Iterable, Sequence
3
3
  from typing import (
4
4
  Any,
5
+ List,
6
+ Optional,
5
7
  TypeVar,
6
8
  )
7
9
 
@@ -80,3 +82,27 @@ def deduplicate(
80
82
  deduplicated.append(element)
81
83
 
82
84
  return deduplicated
85
+
86
+
87
+ def filter_items(
88
+ items: Iterable[T],
89
+ allowed: Optional[Iterable[T]] = None,
90
+ blocked: Optional[Iterable[T]] = None,
91
+ ) -> List[T]:
92
+ """
93
+ Filters `items` by excluding any in `blocked` or including only those in `allowed`.
94
+ If both `allowed` and `blocked` are None, returns all items.
95
+ If both are provided, raise an error.
96
+ """
97
+ items = list(items)
98
+
99
+ if allowed and blocked:
100
+ raise AttributeError(
101
+ "Only one of `allowed` and `blocked` can be provided"
102
+ )
103
+ if blocked:
104
+ return [item for item in items if item not in blocked]
105
+ if allowed:
106
+ return [item for item in items if item in allowed]
107
+
108
+ return items
@@ -1,4 +1,6 @@
1
- from .collection import deduplicate, mapping_from_rows
1
+ import pytest
2
+
3
+ from .collection import deduplicate, filter_items, mapping_from_rows
2
4
 
3
5
 
4
6
  def test__mapping_from_rows__basic_mapping():
@@ -72,3 +74,31 @@ def test_deduplicate():
72
74
  {"id": "2", "name": "duplicate"},
73
75
  ]
74
76
  assert deduplicate("id", elements) == [e1, e2, e3]
77
+
78
+
79
+ def test_sqlserver_databases():
80
+ databases = [
81
+ "prod",
82
+ "staging",
83
+ "test",
84
+ ]
85
+
86
+ # 1. No allowed or blocked: should return all
87
+ result1 = filter_items(databases)
88
+ assert result1 == [
89
+ "prod",
90
+ "staging",
91
+ "test",
92
+ ]
93
+
94
+ # 2. Block "prod": only staging and test should remain
95
+ result2 = filter_items(databases, blocked=["prod"])
96
+ assert result2 == ["staging", "test"]
97
+
98
+ # 3. Only allow "staging" and "test"
99
+ result3 = filter_items(databases, allowed=["staging", "test"])
100
+ assert result3 == ["staging", "test"]
101
+
102
+ # 4. allowed and blocked, should raise
103
+ with pytest.raises(AttributeError):
104
+ filter_items(databases, blocked=["prod"], allowed=["staging", "test"])
@@ -29,6 +29,7 @@ WITH ranked_by_datasource AS (
29
29
  `{project}.region-{region}.INFORMATION_SCHEMA.JOBS_BY_PROJECT`
30
30
  WHERE
31
31
  job_type = 'QUERY'
32
+ AND ARRAY_LENGTH(referenced_tables) > 0
32
33
  AND EXISTS (
33
34
  SELECT
34
35
  1
@@ -1,15 +1,20 @@
1
+ import logging
1
2
  from collections.abc import Iterator
2
3
 
3
4
  from sqlalchemy import text
4
5
 
5
6
  from ...utils import ExtractionQuery, SqlalchemyClient, uri_encode
6
7
 
8
+ logger = logging.getLogger(__name__)
9
+
7
10
  SERVER_URI = "{user}:{password}@{host}:{port}/{database}"
8
11
  MSSQL_URI = f"mssql+pymssql://{SERVER_URI}"
9
12
  DEFAULT_PORT = 1433
10
13
 
11
14
  _KEYS = ("user", "password", "host", "port", "database")
12
15
 
16
+ _SYSTEM_DATABASES = ("master", "model", "msdb", "tempdb", "DBAdmin")
17
+
13
18
 
14
19
  def _check_key(credentials: dict) -> None:
15
20
  for key in _KEYS:
@@ -51,3 +56,13 @@ class MSSQLClient(SqlalchemyClient):
51
56
  yield from results
52
57
  finally:
53
58
  self.close()
59
+
60
+ def get_databases(self) -> list[str]:
61
+ result = self.execute(
62
+ ExtractionQuery("SELECT name FROM sys.databases", {})
63
+ )
64
+ return [
65
+ row["name"]
66
+ for row in result
67
+ if row["name"] not in _SYSTEM_DATABASES
68
+ ]
@@ -1,6 +1,6 @@
1
1
  import logging
2
2
 
3
- from ...utils import LocalStorage, from_env, write_summary
3
+ from ...utils import LocalStorage, filter_items, from_env, write_summary
4
4
  from ..abstract import (
5
5
  CATALOG_ASSETS,
6
6
  EXTERNAL_LINEAGE_ASSETS,
@@ -51,7 +51,13 @@ def extract_all(**kwargs) -> None:
51
51
 
52
52
  client = MSSQLClient(credentials=_credentials(kwargs))
53
53
 
54
- query_builder = MSSQLQueryBuilder()
54
+ databases = filter_items(
55
+ client.get_databases(), kwargs.get("allowed"), kwargs.get("blocked")
56
+ )
57
+
58
+ query_builder = MSSQLQueryBuilder(
59
+ databases=databases,
60
+ )
55
61
 
56
62
  storage = LocalStorage(directory=output_directory)
57
63
 
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- sys.tables
14
+ {database}.sys.tables
15
15
 
16
16
  UNION
17
17
 
@@ -21,7 +21,7 @@ WITH extended_tables AS (
21
21
  table_owner_id = principal_id,
22
22
  schema_id
23
23
  FROM
24
- sys.views
24
+ {database}.sys.views
25
25
 
26
26
  UNION
27
27
 
@@ -31,7 +31,7 @@ WITH extended_tables AS (
31
31
  table_owner_id = principal_id,
32
32
  schema_id
33
33
  FROM
34
- sys.external_tables
34
+ {database}.sys.external_tables
35
35
  ),
36
36
  /*
37
37
  `sys.columns` contains, among others:
@@ -54,11 +54,11 @@ column_ids AS (
54
54
  schema_name = ss.name,
55
55
  schema_id = ss.schema_id,
56
56
  comment = CONVERT(varchar(1024), ep.value)
57
- FROM sys.columns AS sc
57
+ FROM {database}.sys.columns AS sc
58
58
  LEFT JOIN extended_tables AS et ON sc.object_id = et.table_id
59
- LEFT JOIN sys.schemas AS ss ON et.schema_id = ss.schema_id
60
- LEFT JOIN sys.databases AS sd ON sd.name = DB_NAME()
61
- LEFT JOIN sys.extended_properties AS ep
59
+ LEFT JOIN {database}.sys.schemas AS ss ON et.schema_id = ss.schema_id
60
+ LEFT JOIN {database}.sys.databases AS sd ON sd.name = '{database}'
61
+ LEFT JOIN {database}.sys.extended_properties AS ep
62
62
  ON
63
63
  sc.object_id = ep.major_id
64
64
  AND sc.column_id = ep.minor_id
@@ -70,9 +70,9 @@ columns AS (
70
70
  i.database_name,
71
71
  i.database_id,
72
72
  schema_name = c.table_schema,
73
- i.schema_id,
73
+ schema_id = CAST(i.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)),
74
74
  table_name = c.table_name,
75
- i.table_id,
75
+ table_id = CAST(i.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)) + '_' + CAST(i.table_id AS VARCHAR(10)),
76
76
  c.column_name,
77
77
  c.data_type,
78
78
  c.ordinal_position,
@@ -87,7 +87,7 @@ columns AS (
87
87
  i.comment,
88
88
  column_id = CONCAT(i.table_id, '.', c.column_name)
89
89
  FROM
90
- information_schema.columns AS c
90
+ {database}.information_schema.columns AS c
91
91
  LEFT JOIN column_ids AS i
92
92
  ON
93
93
  (
@@ -2,4 +2,4 @@ SELECT
2
2
  db.database_id,
3
3
  database_name = db.name
4
4
  FROM sys.databases AS db
5
- WHERE db.name = DB_NAME()
5
+ WHERE db.name NOT IN ('master', 'model', 'msdb', 'tempdb', 'DBAdmin');
@@ -3,21 +3,20 @@ WITH ids AS (
3
3
  SELECT DISTINCT
4
4
  table_catalog,
5
5
  table_schema
6
- FROM information_schema.tables
7
- WHERE table_catalog = DB_NAME()
6
+ FROM {database}.information_schema.tables
8
7
  )
9
8
 
10
9
  SELECT
11
10
  d.database_id,
12
11
  database_name = i.table_catalog,
13
12
  schema_name = s.name,
14
- s.schema_id,
13
+ schema_id = CAST(d.database_id AS VARCHAR(10)) + '_' + CAST(s.schema_id AS VARCHAR(10)),
15
14
  schema_owner = u.name,
16
15
  schema_owner_id = u.uid
17
- FROM sys.schemas AS s
16
+ FROM {database}.sys.schemas AS s
18
17
  INNER JOIN ids AS i
19
18
  ON s.name = i.table_schema
20
- LEFT JOIN sys.sysusers AS u
19
+ LEFT JOIN {database}.sys.sysusers AS u
21
20
  ON s.principal_id = u.uid
22
- LEFT JOIN sys.databases AS d
21
+ LEFT JOIN {database}.sys.databases AS d
23
22
  ON i.table_catalog = d.name
@@ -11,7 +11,7 @@ WITH extended_tables AS (
11
11
  table_owner_id = principal_id,
12
12
  schema_id
13
13
  FROM
14
- sys.tables
14
+ {database}.sys.tables
15
15
 
16
16
  UNION
17
17
 
@@ -21,7 +21,7 @@ WITH extended_tables AS (
21
21
  table_owner_id = principal_id,
22
22
  schema_id
23
23
  FROM
24
- sys.views
24
+ {database}.sys.views
25
25
 
26
26
  UNION
27
27
 
@@ -31,14 +31,14 @@ WITH extended_tables AS (
31
31
  table_owner_id = principal_id,
32
32
  schema_id
33
33
  FROM
34
- sys.external_tables
34
+ {database}.sys.external_tables
35
35
  ),
36
36
  -- Get the row count per table
37
37
  partitions AS (
38
38
  SELECT
39
39
  object_id,
40
40
  row_count = SUM(rows)
41
- FROM sys.partitions
41
+ FROM {database}.sys.partitions
42
42
  GROUP BY object_id
43
43
  ),
44
44
  -- Append row count to table properties
@@ -69,13 +69,12 @@ table_ids AS (
69
69
  table_owner = u.name,
70
70
  row_count,
71
71
  comment = CONVERT(varchar(1024), ep.value)
72
- FROM
73
- extended_tables_with_row_count AS et
74
- LEFT JOIN sys.schemas AS ss
72
+ FROM extended_tables_with_row_count AS et
73
+ LEFT JOIN {database}.sys.schemas AS ss
75
74
  ON et.schema_id = ss.schema_id
76
- LEFT JOIN sys.sysusers AS u
75
+ LEFT JOIN {database}.sys.sysusers AS u
77
76
  ON et.table_owner_id = u.uid
78
- LEFT JOIN sys.extended_properties AS ep
77
+ LEFT JOIN {database}.sys.extended_properties AS ep
79
78
  ON (
80
79
  et.table_id = ep.major_id
81
80
  AND ep.minor_id = 0
@@ -91,19 +90,18 @@ meta AS (
91
90
  t.table_name,
92
91
  t.table_type
93
92
  FROM
94
- information_schema.tables AS t
95
- LEFT JOIN sys.databases AS db
93
+ {database}.information_schema.tables AS t
94
+ LEFT JOIN {database}.sys.databases AS db
96
95
  ON t.table_catalog = db.name
97
- WHERE t.table_catalog = db_name()
98
96
  )
99
97
 
100
98
  SELECT
101
99
  m.database_name,
102
100
  m.database_id,
103
101
  m.schema_name,
104
- i.schema_id,
102
+ schema_id = CAST(m.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)),
105
103
  m.table_name,
106
- i.table_id,
104
+ table_id = CAST(m.database_id AS VARCHAR(10)) + '_' + CAST(i.schema_id AS VARCHAR(10)) + '_' + CAST(i.table_id AS VARCHAR(10)),
107
105
  m.table_type,
108
106
  i.table_owner,
109
107
  i.table_owner_id,
@@ -1,3 +1,4 @@
1
+ import logging
1
2
  from typing import Optional
2
3
 
3
4
  from ..abstract import (
@@ -7,6 +8,15 @@ from ..abstract import (
7
8
  WarehouseAsset,
8
9
  )
9
10
 
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ _DATABASE_REQUIRED = (
15
+ WarehouseAsset.SCHEMA,
16
+ WarehouseAsset.TABLE,
17
+ WarehouseAsset.COLUMN,
18
+ )
19
+
10
20
 
11
21
  class MSSQLQueryBuilder(AbstractQueryBuilder):
12
22
  """
@@ -15,10 +25,29 @@ class MSSQLQueryBuilder(AbstractQueryBuilder):
15
25
 
16
26
  def __init__(
17
27
  self,
28
+ databases: list[str],
18
29
  time_filter: Optional[TimeFilter] = None,
19
30
  ):
20
31
  super().__init__(time_filter=time_filter)
32
+ self._databases = databases
33
+
34
+ @staticmethod
35
+ def _format(query: ExtractionQuery, values: dict) -> ExtractionQuery:
36
+ return ExtractionQuery(
37
+ statement=query.statement.format(**values),
38
+ params=query.params,
39
+ )
21
40
 
22
41
  def build(self, asset: WarehouseAsset) -> list[ExtractionQuery]:
23
42
  query = self.build_default(asset)
24
- return [query]
43
+
44
+ if asset not in _DATABASE_REQUIRED:
45
+ return [query]
46
+
47
+ logger.info(
48
+ f"\tWill run queries with following database params: {self._databases}",
49
+ )
50
+ return [
51
+ self._format(query, {"database": database})
52
+ for database in self._databases
53
+ ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: castor-extractor
3
- Version: 0.24.33
3
+ Version: 0.24.34
4
4
  Summary: Extract your metadata assets.
5
5
  Home-page: https://www.castordoc.com/
6
6
  License: EULA
@@ -215,6 +215,10 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
215
215
 
216
216
  # Changelog
217
217
 
218
+ ## 0.24.34 - 2025-07-02
219
+
220
+ * SQLServer: multiple databases
221
+
218
222
  ## 0.24.33 - 2025-07-10
219
223
 
220
224
  * Tableau - Add an option to skip fields ingestion
@@ -225,7 +229,7 @@ For any questions or bug report, contact us at [support@coalesce.io](mailto:supp
225
229
 
226
230
  ## 0.24.31 - 2025-07-02
227
231
 
228
- * Looker Studio: add option to list users via a provided JSON file
232
+ * Looker Studio: add an option to list users via a provided JSON file
229
233
 
230
234
  ## 0.24.30 - 2025-06-26
231
235
 
@@ -1,4 +1,4 @@
1
- CHANGELOG.md,sha256=jKQMJGiDeDEZG-753wDrtfOoOYa5Db5Liy0AsATdsuc,18779
1
+ CHANGELOG.md,sha256=4PQMZjH-5BKSERREUHivWM7KKl_PpIDieFYH2PeRmGQ,18840
2
2
  Dockerfile,sha256=xQ05-CFfGShT3oUqaiumaldwA288dj9Yb_pxofQpufg,301
3
3
  DockerfileUsage.md,sha256=2hkJQF-5JuuzfPZ7IOxgM6QgIQW7l-9oRMFVwyXC4gE,998
4
4
  LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
@@ -24,7 +24,7 @@ castor_extractor/commands/extract_salesforce.py,sha256=3j3YTmMkPAwocR-B1ozJQai0U
24
24
  castor_extractor/commands/extract_salesforce_reporting.py,sha256=FdANTNiLkIPdm80XMYxWReHjdycLsIa61pyeCD-sUDk,962
25
25
  castor_extractor/commands/extract_sigma.py,sha256=sxewHcZ1Doq35V2qnpX_zCKKXkrb1_9bYjUMg7BOW-k,643
26
26
  castor_extractor/commands/extract_snowflake.py,sha256=GwlrRxwEBjHqGs_3bs5vM9fzmv61_iwvBr1KcIgFgWM,2161
27
- castor_extractor/commands/extract_sqlserver.py,sha256=lwhbcNChaXHZgMgSOch3faVr7WJw-sDU6GHl3lzBt_0,1141
27
+ castor_extractor/commands/extract_sqlserver.py,sha256=-20AlQbJ4W3oQytHLKdN8GX__UkrrQukOgSzy2l1WZY,1483
28
28
  castor_extractor/commands/extract_strategy.py,sha256=Q-pUymatPrBFGXobhyUPzFph0-t774-XOpjdCFF1dYo,821
29
29
  castor_extractor/commands/extract_tableau.py,sha256=LNtI29LbVk1vp4RNrn89GmdW6R_7QBYunRmkowDhbco,1982
30
30
  castor_extractor/commands/extract_thoughtspot.py,sha256=caAYJlH-vK7u5IUB6OKXxcaWfLgc7d_XqnFDWK6YNS4,639
@@ -96,7 +96,7 @@ castor_extractor/uploader/settings.py,sha256=3MvOX-UFRqrLZoiT7wYn9jUGro7NX4RCafY
96
96
  castor_extractor/uploader/upload.py,sha256=PSQfkO_7LSE0WBo9Tm_hlS2ONepKeB0cBFdJXySnues,4310
97
97
  castor_extractor/uploader/upload_test.py,sha256=7fwstdQe7FjuwGilsCdFpEQr1qLoR2WTRUzyy93fISw,402
98
98
  castor_extractor/uploader/utils.py,sha256=otAaySj5aeem6f0CTd0Te6ioJ6uP2J1p348j-SdIwDI,802
99
- castor_extractor/utils/__init__.py,sha256=_hC54hBfPH41TTuWMsqQcyYVF7SojrOevW3OAv8M05E,1652
99
+ castor_extractor/utils/__init__.py,sha256=z_BdKTUyuug3I5AzCuSGrAVskfLax4_olfORIjhZw_M,1691
100
100
  castor_extractor/utils/argument_parser.py,sha256=S4EcIh3wNDjs3fOrQnttCcPsAmG8m_Txl7xvEh0Q37s,283
101
101
  castor_extractor/utils/argument_parser_test.py,sha256=wnyLFJ74iEiPxxLSbwFtckR7FIHxsFOVU38ljs9gqRA,633
102
102
  castor_extractor/utils/batch.py,sha256=SFlLmJgVjV2nVhIrjVIEp8wJ9du4dKKHq8YVYubnwQQ,448
@@ -118,8 +118,8 @@ castor_extractor/utils/client/postgres.py,sha256=n6ulaT222WWPY0_6qAZ0MHF0m91HtI9
118
118
  castor_extractor/utils/client/query.py,sha256=O6D5EjD1KmBlwa786Uw4D4kzxx97_HH50xIIeSWt0B8,205
119
119
  castor_extractor/utils/client/uri.py,sha256=jmP9hY-6PRqdc3-vAOdtll_U6q9VCqSqmBAN6QRs3ZI,150
120
120
  castor_extractor/utils/client/uri_test.py,sha256=1XKF6qSseCeD4G4ckaNO07JXfGbt7XUVinOZdpEYrDQ,259
121
- castor_extractor/utils/collection.py,sha256=FiIJWZZ865oqNjtTm40gQ13R9zh--W2W5YsMBZJf2bk,2334
122
- castor_extractor/utils/collection_test.py,sha256=XJAGo0Veg0H8wZRCESIkU2t8bXxTNET0BdosomO3-Ls,2104
121
+ castor_extractor/utils/collection.py,sha256=g2HmB0ievvYHWaZ8iEzkcPPkrBFsh6R6b_liBqcsMjc,3044
122
+ castor_extractor/utils/collection_test.py,sha256=mlw33u4VidazQwWxJMvaFeYX3VB5CAj6rqRG-cRsLrw,2884
123
123
  castor_extractor/utils/constants.py,sha256=qBQprS9U66mS-RIBXiLujdTSV3WvGv40Bc0khP4Abdk,39
124
124
  castor_extractor/utils/deprecate.py,sha256=aBIN2QqZUx5CBNZMFfOUhi8QqtPqRcJtmrN6xqfm-y8,805
125
125
  castor_extractor/utils/env.py,sha256=TqdtB50U8LE0993WhhEhpy89TJrHbjtIKjvg6KQ-5q0,596
@@ -197,7 +197,7 @@ castor_extractor/visualization/looker_studio/client/endpoints.py,sha256=5eY-ffqN
197
197
  castor_extractor/visualization/looker_studio/client/enums.py,sha256=fHgemTaQpnwee8cw1YQVDsVnH--vTyFwT4Px8aVYYHQ,167
198
198
  castor_extractor/visualization/looker_studio/client/looker_studio_api_client.py,sha256=Phq378VEaFLD-nyP2_A1wge6HUP45jSthhlNjD7aqSg,4085
199
199
  castor_extractor/visualization/looker_studio/client/pagination.py,sha256=9HQ3Rkdiz2VB6AvYtZ0F-WouiD0pMmdZyAmkv-3wh08,783
200
- castor_extractor/visualization/looker_studio/client/queries/query.sql,sha256=Ub4rdrJ5WTPWKI-eVmXrNMv0Ktmti4b-93zZBr0xEB0,1426
200
+ castor_extractor/visualization/looker_studio/client/queries/query.sql,sha256=p7fiXu5--BlY1FKnoW2CAQF7kPKjcN1tYf_SwvCZus4,1474
201
201
  castor_extractor/visualization/looker_studio/extract.py,sha256=NU48xQ83UtRW3jXKJcvofzqgEM2lHGjtTzjbKOSB50A,4059
202
202
  castor_extractor/visualization/looker_studio/extract_test.py,sha256=ZckAxUMuoEjJ9RWkfRvt9M8SxblkQvsq-Grb8GSs-y0,492
203
203
  castor_extractor/visualization/metabase/__init__.py,sha256=3E36cmkMyEgBB6Ot5rWk-N75i0G-7k24QTlc-Iol4pM,193
@@ -420,18 +420,18 @@ castor_extractor/warehouse/snowflake/queries/user.sql,sha256=88V8eRj1NDaD_ufclsK
420
420
  castor_extractor/warehouse/snowflake/queries/view_ddl.sql,sha256=eWsci_50cxiYIv3N7BKkbXVM3RoIzqSDtohqRnE5kg4,673
421
421
  castor_extractor/warehouse/snowflake/query.py,sha256=C2LTdPwBzMQ_zMncg0Kq4_WkoY7K9as5tvxBDrIOlwI,1763
422
422
  castor_extractor/warehouse/sqlserver/__init__.py,sha256=PdOuYznmvKAbfWAm8UdN47MfEsd9jqPi_dDi3WEo1KY,116
423
- castor_extractor/warehouse/sqlserver/client.py,sha256=pO5JNykET9luT2h9iAeI2jX-WBkWklXaYmmYIxQMm1o,1601
424
- castor_extractor/warehouse/sqlserver/extract.py,sha256=2mBNx9clyrhoiirD635BW-5u6pPoxHyIsB071XoZjho,2087
423
+ castor_extractor/warehouse/sqlserver/client.py,sha256=Bjfpw96IKAQfWPiU5SZYEDfetwfkqZrnKbQYoStcnZc,2007
424
+ castor_extractor/warehouse/sqlserver/extract.py,sha256=-LoHY5wAGJk4vutrO3N0_PaRqts7rkEn7pADRHzoxiI,2249
425
425
  castor_extractor/warehouse/sqlserver/queries/.sqlfluff,sha256=yy0KQdz8I_67vnXyX8eeWwOWkxTXvHyVKSVwhURktd8,48
426
- castor_extractor/warehouse/sqlserver/queries/column.sql,sha256=Szdf8hwcDffRTgtD6zf4ZuIyHIVijFgSDk1rZbKI3g8,2480
427
- castor_extractor/warehouse/sqlserver/queries/database.sql,sha256=4eO6ck-smsDYValYMHLf1CTZu_zIqYycN77jqJH5H7E,106
428
- castor_extractor/warehouse/sqlserver/queries/schema.sql,sha256=elM9s02I9d9F5E4MHfJBfria5QT1hHycZHrn06wn9tg,535
429
- castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=kbBQP-TdG5px1IVgyx_LGkIf7LX6ojTjI8wgJDxm3f0,2542
426
+ castor_extractor/warehouse/sqlserver/queries/column.sql,sha256=_K5OS63N7fM7kGPudnnjJEnIyaxR1xE2hoZgnJ_A3p8,2763
427
+ castor_extractor/warehouse/sqlserver/queries/database.sql,sha256=4dPeBCn85MEOXr1f-DPXxiI3RvvoE_1n8lsbTs26E0I,150
428
+ castor_extractor/warehouse/sqlserver/queries/schema.sql,sha256=UR3eTiYw7Iq5-GukelnNg_uq6haZ_dwg_SedZfOWUoA,619
429
+ castor_extractor/warehouse/sqlserver/queries/table.sql,sha256=4RgeSkHDWTWRyU2iLxaBR0KuSwIBvb3GbQGdkJYXbn0,2787
430
430
  castor_extractor/warehouse/sqlserver/queries/user.sql,sha256=gOrZsMVypusR2dc4vwVs4E1a-CliRsr_UjnD2EbXs-A,94
431
- castor_extractor/warehouse/sqlserver/query.py,sha256=g0hPT-RmeGi2DyenAi3o72cTlQsLToXIFYojqc8E5fQ,533
431
+ castor_extractor/warehouse/sqlserver/query.py,sha256=7sW8cK3JzxPt6faTJ7e4lk9tE4fo_AeCymI-LqsSols,1276
432
432
  castor_extractor/warehouse/synapse/queries/column.sql,sha256=lNcFoIW3Y0PFOqoOzJEXmPvZvfAsY0AP63Mu2LuPzPo,1351
433
- castor_extractor-0.24.33.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
434
- castor_extractor-0.24.33.dist-info/METADATA,sha256=vCEpwDM8sngoUEfrGtRPSjtCjTw6zxJGiJrnmj4eq_Y,26232
435
- castor_extractor-0.24.33.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
436
- castor_extractor-0.24.33.dist-info/entry_points.txt,sha256=_F-qeZCybjoMkNb9ErEhnyqXuG6afHIFQhakdBHZsr4,1803
437
- castor_extractor-0.24.33.dist-info/RECORD,,
433
+ castor_extractor-0.24.34.dist-info/LICENCE,sha256=sL-IGa4hweyya1HgzMskrRdybbIa2cktzxb5qmUgDg8,8254
434
+ castor_extractor-0.24.34.dist-info/METADATA,sha256=-xB8vdjxDHFkDYbyAlL8L-nEbQMqs44GVzN5wgvKfjs,26293
435
+ castor_extractor-0.24.34.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
436
+ castor_extractor-0.24.34.dist-info/entry_points.txt,sha256=_F-qeZCybjoMkNb9ErEhnyqXuG6afHIFQhakdBHZsr4,1803
437
+ castor_extractor-0.24.34.dist-info/RECORD,,