sdmxlib 0.28.1__tar.gz → 0.28.3__tar.gz
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.
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/PKG-INFO +1 -1
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/pyproject.toml +1 -1
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/_data_store.py +30 -2
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/README.md +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/client.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/federated.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/filters.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/policy.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/providers.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/query.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/registry.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/api/session.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/catalog.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/data_store.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/reader.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_csv/writer.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/metadata.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/reader.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_json/writer.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/namespaces.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/reader.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml21/writer.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/metadata.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/namespaces.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/reader.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/formats/sdmx_ml30/writer.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/local/_registry.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/annotations.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/base.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/binding.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/category.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/code_query.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/codelist.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/collections.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/concept.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/constraint.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/convert.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/dataflow.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/dataset.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/datastructure.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/expr.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/hierarchy_query.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/in_memory_registry.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/istring.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/mapping.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/message.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataflow.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadataset.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/metadatastructure.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/organisation.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/provision.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/ref.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/registry.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/representation.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/urn.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/model/validation.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/polars.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/py.typed +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/rest.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/sql.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/__init__.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/lazy.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/readers.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/schema.py +0 -0
- {sdmxlib-0.28.1 → sdmxlib-0.28.3}/src/sdmxlib/storage/writers.py +0 -0
|
@@ -195,6 +195,23 @@ class DuckDBDataStore:
|
|
|
195
195
|
# Loading extensions can change the search_path; reset to
|
|
196
196
|
# ``sdmx`` so any colocated Registry's internal queries stay clean.
|
|
197
197
|
self._conn.execute("SET search_path = 'sdmx'")
|
|
198
|
+
if self._needs_azure():
|
|
199
|
+
# Force the named curl transport adapter. The Azure SDK's
|
|
200
|
+
# default transport on Linux uses a statically-linked HTTP
|
|
201
|
+
# stack that doesn't honour the standard ``SSL_CERT_FILE`` /
|
|
202
|
+
# ``CURL_CA_BUNDLE`` environment variables, so it fails on
|
|
203
|
+
# any image whose CA store is at a non-default path. The
|
|
204
|
+
# ``curl`` adapter delegates to libcurl, which reads those
|
|
205
|
+
# env vars at handshake time.
|
|
206
|
+
#
|
|
207
|
+
# ``SET GLOBAL`` (not bare ``SET``) is required because the
|
|
208
|
+
# data-plane uses per-thread cursors (Phase 5 of #75). A
|
|
209
|
+
# bare ``SET`` is session-scoped and bypassed by every cursor
|
|
210
|
+
# opened later, so the curl transport wouldn't take effect on
|
|
211
|
+
# the codepath where abfss reads actually happen — surfacing
|
|
212
|
+
# as "Problem with the SSL CA cert" on every data query. See
|
|
213
|
+
# issue #81.
|
|
214
|
+
self._conn.execute("SET GLOBAL azure_transport_option_type = 'curl'")
|
|
198
215
|
if self._azure_credentials:
|
|
199
216
|
sql = _azure_create_secret_sql(self._azure_credentials)
|
|
200
217
|
self._conn.execute(sql)
|
|
@@ -208,13 +225,24 @@ class DuckDBDataStore:
|
|
|
208
225
|
self._conn.execute("SET search_path = 'sdmx'")
|
|
209
226
|
|
|
210
227
|
def _needs_azure(self) -> bool:
|
|
211
|
-
"""True if Azure secret/extension setup is required for this session.
|
|
228
|
+
"""True if Azure secret/extension setup is required for this session.
|
|
229
|
+
|
|
230
|
+
Matches against ATTACH specs that either (a) name an ``abfss://``
|
|
231
|
+
path directly or (b) ATTACH a DuckLake catalog (``ducklake:``)
|
|
232
|
+
whose ``data_path`` is stored inside the lake metadata file —
|
|
233
|
+
invisible to the ATTACH SQL but routed through the Azure backend
|
|
234
|
+
on first read. Catching ``ducklake:`` here is over-broad for
|
|
235
|
+
purely local lakes, but the cost of a spurious curl-transport SET
|
|
236
|
+
is zero (DuckDB ignores it until something talks to Azure); the
|
|
237
|
+
cost of a false negative is a TLS handshake failure on every data
|
|
238
|
+
query. See issue #81.
|
|
239
|
+
"""
|
|
212
240
|
if self._azure_credentials:
|
|
213
241
|
return True
|
|
214
242
|
if self._attach:
|
|
215
243
|
for spec in self._attach.values():
|
|
216
244
|
spec_text = spec if isinstance(spec, str) else " ".join(s for s in spec if s)
|
|
217
|
-
if "abfss://" in spec_text:
|
|
245
|
+
if "abfss://" in spec_text or "ducklake:" in spec_text:
|
|
218
246
|
return True
|
|
219
247
|
return False
|
|
220
248
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|