snowflake-connector-python 3.12.0__tar.gz → 3.12.1__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.
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/DESCRIPTION.md +9 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/PKG-INFO +11 -2
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/README.md +29 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/setup.cfg +1 -2
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/_auth.py +1 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/okta.py +1 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/webbrowser.py +1 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/connection.py +24 -20
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/errors.py +0 -6
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/network.py +22 -68
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/ocsp_snowflake.py +0 -11
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/sf_dirs.py +4 -4
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/version.py +1 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/PKG-INFO +11 -2
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/entry_points.txt +0 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/requires.txt +1 -1
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/CONTRIBUTING.md +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/LICENSE.txt +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/MANIFEST.in +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/NOTICE +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/SECURITY.md +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/pyproject.toml +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/setup.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/_query_context_cache.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/_sql_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/arrow_context.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/by_plugin.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/default.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/idtoken.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/keypair.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/oauth.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/auth/usrpwdmfa.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/azure_storage_client.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/backoff_policies.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/bind_upload_agent.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/cache.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/compat.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/config_manager.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/connection_diagnostic.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/constants.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/converter.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/converter_issue23517.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/converter_null.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/converter_snowsql.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/cursor.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/dbapi.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/description.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/encryption_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/errorcode.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/feature.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/file_compression_type.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/file_transfer_agent.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/file_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/gcs_storage_client.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/gzip_decoder.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/local_storage_client.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/log_configuration.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BinaryConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/BooleanConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowChunkIterator.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowIterator.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/CArrowTableIterator.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DateConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/DecimalConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FixedSizeListConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/FloatConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IColumnConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/IntConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/LICENSE.txt +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/MapConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ObjectConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Common.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Python/Helpers.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/SnowflakeType.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/StringConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/TimeStampConverter.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/macros.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/Util/time.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_accessors.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_alloc.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_assert.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_builder.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_emitter.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_endian.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_epilogue.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_flatbuffers.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_identifier.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_iov.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_prologue.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_refmap.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_rtconfig.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_types.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/flatcc_verifier.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/flatcc_portable.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/paligned_alloc.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pattributes.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_pop.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pdiagnostic_push.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pendian_detect.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinline.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pinttypes.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/portable_basic.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstatic_assert.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdalign.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pstdint.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/punaligned.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pversion.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc/portable/pwarnings.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/flatcc.c +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.c +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_arrow_iterator.pyx +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.c +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_device.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.c +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/ArrowIterator/nanoarrow_ipc.h +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.cpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/nanoarrow_cpp/Logging/logging.hpp +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/ocsp_asn1crypto.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/options.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/pandas_tools.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/proxy.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/py.typed +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/result_batch.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/result_set.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/s3_storage_client.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/secret_detector.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/sfbinaryformat.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/sfdatetime.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/snow_logging.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/sqlstate.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/ssd_internal_keys.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/ssl_wrap_socket.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/storage_client.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/telemetry.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/telemetry_oob.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/test_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/time_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/tool/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/tool/dump_certs.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/tool/dump_ocsp_response.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/tool/dump_ocsp_response_cache.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/tool/probe_connection.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/url_util.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/util_text.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/LICENSE +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/__version__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/_internal_utils.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/adapters.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/api.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/auth.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/certs.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/compat.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/cookies.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/exceptions.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/help.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/hooks.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/models.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/sessions.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/status_codes.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/structures.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/requests/utils.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/LICENSE.txt +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/_collections.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/_version.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/connection.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/connectionpool.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/_appengine_environ.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/bindings.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/_securetransport/low_level.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/appengine.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/ntlmpool.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/pyopenssl.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/securetransport.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/contrib/socks.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/exceptions.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/fields.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/filepost.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/packages/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/packages/backports/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/packages/backports/makefile.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/packages/backports/weakref_finalize.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/packages/six.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/poolmanager.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/request.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/response.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/__init__.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/connection.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/proxy.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/queue.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/request.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/response.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/retry.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/ssl_.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/ssl_match_hostname.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/ssltransport.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/timeout.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/url.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake/connector/vendored/urllib3/util/wait.py +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/SOURCES.txt +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/dependency_links.txt +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/not-zip-safe +0 -0
- {snowflake_connector_python-3.12.0 → snowflake_connector_python-3.12.1}/src/snowflake_connector_python.egg-info/top_level.txt +0 -0
|
@@ -8,6 +8,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
8
8
|
|
|
9
9
|
# Release Notes
|
|
10
10
|
|
|
11
|
+
- v3.12.1(August 20,2024)
|
|
12
|
+
- Fixed a bug that logged the session token when renewing a session.
|
|
13
|
+
- Fixed a bug where disabling client telemetry did not work.
|
|
14
|
+
- Fixed a bug where passing `login_timeout` as a string raised a `TypeError` during the login retry step.
|
|
15
|
+
- Use `pathlib` instead of `os` for default config file location resolution.
|
|
16
|
+
- Removed upper `cryptogaphy` version pin.
|
|
17
|
+
- Removed reference to script `snowflake-export-certs` (its backing module was already removed long ago)
|
|
18
|
+
- Enhanced retry mechanism for handling transient network failures during query result polling when no server response is received.
|
|
19
|
+
|
|
11
20
|
- v3.12.0(July 24,2024)
|
|
12
21
|
- Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.
|
|
13
22
|
- Optimized `to_pandas()` performance by fully parallel downloading logic.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.12.
|
|
3
|
+
Version: 3.12.1
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -40,7 +40,7 @@ License-File: LICENSE.txt
|
|
|
40
40
|
License-File: NOTICE
|
|
41
41
|
Requires-Dist: asn1crypto<2.0.0,>0.24.0
|
|
42
42
|
Requires-Dist: cffi<2.0.0,>=1.9
|
|
43
|
-
Requires-Dist: cryptography
|
|
43
|
+
Requires-Dist: cryptography>=3.1.0
|
|
44
44
|
Requires-Dist: pyOpenSSL<25.0.0,>=16.2.0
|
|
45
45
|
Requires-Dist: pyjwt<3.0.0
|
|
46
46
|
Requires-Dist: pytz
|
|
@@ -85,6 +85,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
85
85
|
|
|
86
86
|
# Release Notes
|
|
87
87
|
|
|
88
|
+
- v3.12.1(August 20,2024)
|
|
89
|
+
- Fixed a bug that logged the session token when renewing a session.
|
|
90
|
+
- Fixed a bug where disabling client telemetry did not work.
|
|
91
|
+
- Fixed a bug where passing `login_timeout` as a string raised a `TypeError` during the login retry step.
|
|
92
|
+
- Use `pathlib` instead of `os` for default config file location resolution.
|
|
93
|
+
- Removed upper `cryptogaphy` version pin.
|
|
94
|
+
- Removed reference to script `snowflake-export-certs` (its backing module was already removed long ago)
|
|
95
|
+
- Enhanced retry mechanism for handling transient network failures during query result polling when no server response is received.
|
|
96
|
+
|
|
88
97
|
- v3.12.0(July 24,2024)
|
|
89
98
|
- Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.
|
|
90
99
|
- Optimized `to_pandas()` performance by fully parallel downloading logic.
|
|
@@ -52,3 +52,32 @@ These tools are integrated into `tox` to allow us to easily set them up universa
|
|
|
52
52
|
* **coverage**: Runs `coverage.py` to combine generated coverage data files. Useful when multiple categories were run
|
|
53
53
|
and we would like to have an overall coverage data file created for them.
|
|
54
54
|
* **flake8**: (Deprecated) Similar to `fix_lint`, but only runs `flake8` checks.
|
|
55
|
+
|
|
56
|
+
## Disable telemetry
|
|
57
|
+
|
|
58
|
+
By default, the Snowflake Connector for Python collects telemetry data to improve the product.
|
|
59
|
+
You can disable the telemetry data collection by setting the session parameter `CLIENT_TELEMETRY_ENABLED` to `False`
|
|
60
|
+
when connecting to Snowflake:
|
|
61
|
+
```python
|
|
62
|
+
import snowflake.connector
|
|
63
|
+
conn = snowflake.connector.connect(
|
|
64
|
+
user='XXXX',
|
|
65
|
+
password='XXXX',
|
|
66
|
+
account='XXXX',
|
|
67
|
+
session_parameters={
|
|
68
|
+
"CLIENT_TELEMETRY_ENABLED": False,
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Alternatively, you can disable the telemetry data collection
|
|
74
|
+
by setting the `telemetry_enabled` property to `False` on the `SnowflakeConnection` object:
|
|
75
|
+
```python
|
|
76
|
+
import snowflake.connector
|
|
77
|
+
conn = snowflake.connector.connect(
|
|
78
|
+
user='XXXX',
|
|
79
|
+
password='XXXX',
|
|
80
|
+
account='XXXX',
|
|
81
|
+
)
|
|
82
|
+
conn.telemetry_enabled = False
|
|
83
|
+
```
|
|
@@ -45,7 +45,7 @@ packages = find_namespace:
|
|
|
45
45
|
install_requires =
|
|
46
46
|
asn1crypto>0.24.0,<2.0.0
|
|
47
47
|
cffi>=1.9,<2.0.0
|
|
48
|
-
cryptography>=3.1.0
|
|
48
|
+
cryptography>=3.1.0
|
|
49
49
|
pyOpenSSL>=16.2.0,<25.0.0
|
|
50
50
|
pyjwt<3.0.0
|
|
51
51
|
pytz
|
|
@@ -76,7 +76,6 @@ console_scripts =
|
|
|
76
76
|
snowflake-dump-ocsp-response = snowflake.connector.tool.dump_ocsp_response:main
|
|
77
77
|
snowflake-dump-ocsp-response-cache = snowflake.connector.tool.dump_ocsp_response_cache:main
|
|
78
78
|
snowflake-dump-certs = snowflake.connector.tool.dump_certs:main
|
|
79
|
-
snowflake-export-certs = snowflake.connector.tool.export_certs:main
|
|
80
79
|
|
|
81
80
|
[options.extras_require]
|
|
82
81
|
development =
|
|
@@ -198,7 +198,7 @@ class Auth:
|
|
|
198
198
|
self._rest._connection._internal_application_name,
|
|
199
199
|
self._rest._connection._internal_application_version,
|
|
200
200
|
self._rest._connection._ocsp_mode(),
|
|
201
|
-
self._rest._connection.
|
|
201
|
+
self._rest._connection.login_timeout,
|
|
202
202
|
self._rest._connection._network_timeout,
|
|
203
203
|
self._rest._connection._socket_timeout,
|
|
204
204
|
)
|
|
@@ -462,7 +462,7 @@ You can close this window now and go back where you started from.
|
|
|
462
462
|
conn._rest._connection._internal_application_name,
|
|
463
463
|
conn._rest._connection._internal_application_version,
|
|
464
464
|
conn._rest._connection._ocsp_mode(),
|
|
465
|
-
conn._rest._connection.
|
|
465
|
+
conn._rest._connection.login_timeout,
|
|
466
466
|
conn._rest._connection._network_timeout,
|
|
467
467
|
)
|
|
468
468
|
|
|
@@ -61,7 +61,6 @@ from .constants import (
|
|
|
61
61
|
PARAMETER_CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY,
|
|
62
62
|
PARAMETER_CLIENT_STORE_TEMPORARY_CREDENTIAL,
|
|
63
63
|
PARAMETER_CLIENT_TELEMETRY_ENABLED,
|
|
64
|
-
PARAMETER_CLIENT_TELEMETRY_OOB_ENABLED,
|
|
65
64
|
PARAMETER_CLIENT_VALIDATE_DEFAULT_PARAMETERS,
|
|
66
65
|
PARAMETER_ENABLE_STAGE_S3_PRIVATELINK_FOR_US_EAST_1,
|
|
67
66
|
PARAMETER_QUERY_CONTEXT_CACHE_SIZE,
|
|
@@ -106,7 +105,6 @@ from .network import (
|
|
|
106
105
|
)
|
|
107
106
|
from .sqlstate import SQLSTATE_CONNECTION_NOT_EXISTS, SQLSTATE_FEATURE_NOT_SUPPORTED
|
|
108
107
|
from .telemetry import TelemetryClient, TelemetryData, TelemetryField
|
|
109
|
-
from .telemetry_oob import TelemetryService
|
|
110
108
|
from .time_util import HeartBeatTimer, get_time_millis
|
|
111
109
|
from .url_util import extract_top_level_domain_from_hostname
|
|
112
110
|
from .util_text import construct_hostname, parse_account, split_statements
|
|
@@ -409,7 +407,8 @@ class SnowflakeConnection:
|
|
|
409
407
|
self.messages = []
|
|
410
408
|
self._async_sfqids: dict[str, None] = {}
|
|
411
409
|
self._done_async_sfqids: dict[str, None] = {}
|
|
412
|
-
self.
|
|
410
|
+
self._client_param_telemetry_enabled = True
|
|
411
|
+
self._server_param_telemetry_enabled = False
|
|
413
412
|
self._session_parameters: dict[str, str | int | bool] = {}
|
|
414
413
|
logger.info(
|
|
415
414
|
"Snowflake Connector for Python Version: %s, "
|
|
@@ -626,11 +625,22 @@ class SnowflakeConnection:
|
|
|
626
625
|
|
|
627
626
|
@property
|
|
628
627
|
def telemetry_enabled(self) -> bool:
|
|
629
|
-
return
|
|
628
|
+
return bool(
|
|
629
|
+
self._client_param_telemetry_enabled
|
|
630
|
+
and self._server_param_telemetry_enabled
|
|
631
|
+
)
|
|
630
632
|
|
|
631
633
|
@telemetry_enabled.setter
|
|
632
634
|
def telemetry_enabled(self, value) -> None:
|
|
633
|
-
self.
|
|
635
|
+
self._client_param_telemetry_enabled = True if value else False
|
|
636
|
+
if (
|
|
637
|
+
self._client_param_telemetry_enabled
|
|
638
|
+
and not self._server_param_telemetry_enabled
|
|
639
|
+
):
|
|
640
|
+
logger.info(
|
|
641
|
+
"Telemetry has been disabled by the session parameter CLIENT_TELEMETRY_ENABLED."
|
|
642
|
+
" Set session parameter CLIENT_TELEMETRY_ENABLED to true to enable telemetry."
|
|
643
|
+
)
|
|
634
644
|
|
|
635
645
|
@property
|
|
636
646
|
def service_name(self) -> str | None:
|
|
@@ -720,7 +730,6 @@ class SnowflakeConnection:
|
|
|
720
730
|
logger.debug("connect")
|
|
721
731
|
if len(kwargs) > 0:
|
|
722
732
|
self.__config(**kwargs)
|
|
723
|
-
TelemetryService.get_instance().update_context(kwargs)
|
|
724
733
|
|
|
725
734
|
if self.enable_connection_diag:
|
|
726
735
|
exceptions_dict = {}
|
|
@@ -777,7 +786,7 @@ class SnowflakeConnection:
|
|
|
777
786
|
|
|
778
787
|
# close telemetry first, since it needs rest to send remaining data
|
|
779
788
|
logger.info("closed")
|
|
780
|
-
self._telemetry.close(send_on_close=retry)
|
|
789
|
+
self._telemetry.close(send_on_close=bool(retry and self.telemetry_enabled))
|
|
781
790
|
if (
|
|
782
791
|
self._all_async_queries_finished()
|
|
783
792
|
and not self._server_session_keep_alive
|
|
@@ -1009,7 +1018,7 @@ class SnowflakeConnection:
|
|
|
1009
1018
|
elif self._authenticator == DEFAULT_AUTHENTICATOR:
|
|
1010
1019
|
self.auth_class = AuthByDefault(
|
|
1011
1020
|
password=self._password,
|
|
1012
|
-
timeout=self.
|
|
1021
|
+
timeout=self.login_timeout,
|
|
1013
1022
|
backoff_generator=self._backoff_generator,
|
|
1014
1023
|
)
|
|
1015
1024
|
elif self._authenticator == EXTERNAL_BROWSER_AUTHENTICATOR:
|
|
@@ -1029,7 +1038,7 @@ class SnowflakeConnection:
|
|
|
1029
1038
|
protocol=self._protocol,
|
|
1030
1039
|
host=self.host,
|
|
1031
1040
|
port=self.port,
|
|
1032
|
-
timeout=self.
|
|
1041
|
+
timeout=self.login_timeout,
|
|
1033
1042
|
backoff_generator=self._backoff_generator,
|
|
1034
1043
|
)
|
|
1035
1044
|
else:
|
|
@@ -1039,7 +1048,7 @@ class SnowflakeConnection:
|
|
|
1039
1048
|
protocol=self._protocol,
|
|
1040
1049
|
host=self.host,
|
|
1041
1050
|
port=self.port,
|
|
1042
|
-
timeout=self.
|
|
1051
|
+
timeout=self.login_timeout,
|
|
1043
1052
|
backoff_generator=self._backoff_generator,
|
|
1044
1053
|
)
|
|
1045
1054
|
|
|
@@ -1054,13 +1063,13 @@ class SnowflakeConnection:
|
|
|
1054
1063
|
|
|
1055
1064
|
self.auth_class = AuthByKeyPair(
|
|
1056
1065
|
private_key=private_key,
|
|
1057
|
-
timeout=self.
|
|
1066
|
+
timeout=self.login_timeout,
|
|
1058
1067
|
backoff_generator=self._backoff_generator,
|
|
1059
1068
|
)
|
|
1060
1069
|
elif self._authenticator == OAUTH_AUTHENTICATOR:
|
|
1061
1070
|
self.auth_class = AuthByOAuth(
|
|
1062
1071
|
oauth_token=self._token,
|
|
1063
|
-
timeout=self.
|
|
1072
|
+
timeout=self.login_timeout,
|
|
1064
1073
|
backoff_generator=self._backoff_generator,
|
|
1065
1074
|
)
|
|
1066
1075
|
elif self._authenticator == USR_PWD_MFA_AUTHENTICATOR:
|
|
@@ -1076,14 +1085,14 @@ class SnowflakeConnection:
|
|
|
1076
1085
|
self.auth_class = AuthByUsrPwdMfa(
|
|
1077
1086
|
password=self._password,
|
|
1078
1087
|
mfa_token=self.rest.mfa_token,
|
|
1079
|
-
timeout=self.
|
|
1088
|
+
timeout=self.login_timeout,
|
|
1080
1089
|
backoff_generator=self._backoff_generator,
|
|
1081
1090
|
)
|
|
1082
1091
|
else:
|
|
1083
1092
|
# okta URL, e.g., https://<account>.okta.com/
|
|
1084
1093
|
self.auth_class = AuthByOkta(
|
|
1085
1094
|
application=self.application,
|
|
1086
|
-
timeout=self.
|
|
1095
|
+
timeout=self.login_timeout,
|
|
1087
1096
|
backoff_generator=self._backoff_generator,
|
|
1088
1097
|
)
|
|
1089
1098
|
|
|
@@ -1717,12 +1726,7 @@ class SnowflakeConnection:
|
|
|
1717
1726
|
for name, value in parameters.items():
|
|
1718
1727
|
self._session_parameters[name] = value
|
|
1719
1728
|
if PARAMETER_CLIENT_TELEMETRY_ENABLED == name:
|
|
1720
|
-
self.
|
|
1721
|
-
elif PARAMETER_CLIENT_TELEMETRY_OOB_ENABLED == name:
|
|
1722
|
-
if value:
|
|
1723
|
-
TelemetryService.get_instance().enable()
|
|
1724
|
-
else:
|
|
1725
|
-
TelemetryService.get_instance().disable()
|
|
1729
|
+
self._server_param_telemetry_enabled = value
|
|
1726
1730
|
elif PARAMETER_CLIENT_SESSION_KEEP_ALIVE == name:
|
|
1727
1731
|
# Only set if the local config is None.
|
|
1728
1732
|
# Always give preference to user config.
|
|
@@ -15,7 +15,6 @@ from typing import TYPE_CHECKING, Any
|
|
|
15
15
|
from .compat import BASE_EXCEPTION_CLASS
|
|
16
16
|
from .secret_detector import SecretDetector
|
|
17
17
|
from .telemetry import TelemetryData, TelemetryField
|
|
18
|
-
from .telemetry_oob import TelemetryService
|
|
19
18
|
from .time_util import get_time_millis
|
|
20
19
|
|
|
21
20
|
if TYPE_CHECKING: # pragma: no cover
|
|
@@ -167,11 +166,6 @@ class Error(BASE_EXCEPTION_CLASS):
|
|
|
167
166
|
)
|
|
168
167
|
except AttributeError:
|
|
169
168
|
logger.debug("Cursor failed to log to telemetry.", exc_info=True)
|
|
170
|
-
elif connection is None:
|
|
171
|
-
# Send with out-of-band telemetry
|
|
172
|
-
|
|
173
|
-
telemetry_oob = TelemetryService.get_instance()
|
|
174
|
-
telemetry_oob.log_general_exception(self.__class__.__name__, telemetry_data)
|
|
175
169
|
|
|
176
170
|
def exception_telemetry(
|
|
177
171
|
self,
|
|
@@ -13,7 +13,6 @@ import json
|
|
|
13
13
|
import logging
|
|
14
14
|
import re
|
|
15
15
|
import time
|
|
16
|
-
import traceback
|
|
17
16
|
import uuid
|
|
18
17
|
from collections import OrderedDict
|
|
19
18
|
from threading import Lock
|
|
@@ -92,9 +91,7 @@ from .sqlstate import (
|
|
|
92
91
|
SQLSTATE_CONNECTION_NOT_EXISTS,
|
|
93
92
|
SQLSTATE_CONNECTION_REJECTED,
|
|
94
93
|
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
95
|
-
SQLSTATE_IO_ERROR,
|
|
96
94
|
)
|
|
97
|
-
from .telemetry_oob import TelemetryService
|
|
98
95
|
from .time_util import (
|
|
99
96
|
DEFAULT_MASTER_VALIDITY_IN_SECONDS,
|
|
100
97
|
TimeoutBackoffCtx,
|
|
@@ -230,14 +227,6 @@ def raise_failed_request_error(
|
|
|
230
227
|
method: str,
|
|
231
228
|
response: Response,
|
|
232
229
|
) -> None:
|
|
233
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
234
|
-
f"HttpError{response.status_code}",
|
|
235
|
-
url,
|
|
236
|
-
method,
|
|
237
|
-
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
238
|
-
ER_FAILED_TO_REQUEST,
|
|
239
|
-
response=response,
|
|
240
|
-
)
|
|
241
230
|
Error.errorhandler_wrapper(
|
|
242
231
|
connection,
|
|
243
232
|
None,
|
|
@@ -568,7 +557,7 @@ class SnowflakeRestful:
|
|
|
568
557
|
token=header_token,
|
|
569
558
|
)
|
|
570
559
|
if ret.get("success") and ret.get("data", {}).get("sessionToken"):
|
|
571
|
-
logger.debug("success: %s", ret)
|
|
560
|
+
logger.debug("success: %s", SecretDetector.mask_secrets(str(ret)))
|
|
572
561
|
self.update_tokens(
|
|
573
562
|
ret["data"]["sessionToken"],
|
|
574
563
|
ret["data"].get("masterToken"),
|
|
@@ -577,7 +566,7 @@ class SnowflakeRestful:
|
|
|
577
566
|
logger.debug("updating session completed")
|
|
578
567
|
return ret
|
|
579
568
|
else:
|
|
580
|
-
logger.debug("failed: %s", ret)
|
|
569
|
+
logger.debug("failed: %s", SecretDetector.mask_secrets(str(ret)))
|
|
581
570
|
err = ret.get("message")
|
|
582
571
|
if err is not None and ret.get("data"):
|
|
583
572
|
err += ret["data"].get("errorMessage", "")
|
|
@@ -690,6 +679,7 @@ class SnowflakeRestful:
|
|
|
690
679
|
headers: dict[str, str],
|
|
691
680
|
token: str = None,
|
|
692
681
|
timeout: int | None = None,
|
|
682
|
+
is_fetch_query_status: bool = False,
|
|
693
683
|
) -> dict[str, Any]:
|
|
694
684
|
if "Content-Encoding" in headers:
|
|
695
685
|
del headers["Content-Encoding"]
|
|
@@ -703,6 +693,7 @@ class SnowflakeRestful:
|
|
|
703
693
|
headers,
|
|
704
694
|
timeout=timeout,
|
|
705
695
|
token=token,
|
|
696
|
+
is_fetch_query_status=is_fetch_query_status,
|
|
706
697
|
)
|
|
707
698
|
if ret.get("code") == SESSION_EXPIRED_GS_CODE:
|
|
708
699
|
try:
|
|
@@ -717,7 +708,12 @@ class SnowflakeRestful:
|
|
|
717
708
|
)
|
|
718
709
|
)
|
|
719
710
|
if ret.get("success"):
|
|
720
|
-
return self._get_request(
|
|
711
|
+
return self._get_request(
|
|
712
|
+
url,
|
|
713
|
+
headers,
|
|
714
|
+
token=self.token,
|
|
715
|
+
is_fetch_query_status=is_fetch_query_status,
|
|
716
|
+
)
|
|
721
717
|
|
|
722
718
|
return ret
|
|
723
719
|
|
|
@@ -790,7 +786,13 @@ class SnowflakeRestful:
|
|
|
790
786
|
result_url = ret["data"]["getResultUrl"]
|
|
791
787
|
logger.debug("ping pong starting...")
|
|
792
788
|
ret = self._get_request(
|
|
793
|
-
result_url,
|
|
789
|
+
result_url,
|
|
790
|
+
headers,
|
|
791
|
+
token=self.token,
|
|
792
|
+
timeout=timeout,
|
|
793
|
+
is_fetch_query_status=bool(
|
|
794
|
+
re.match(r"^/queries/.+/result$", result_url)
|
|
795
|
+
),
|
|
794
796
|
)
|
|
795
797
|
logger.debug("ret[code] = %s", ret.get("code", "N/A"))
|
|
796
798
|
logger.debug("ping pong done")
|
|
@@ -889,6 +891,7 @@ class SnowflakeRestful:
|
|
|
889
891
|
|
|
890
892
|
full_url = retry_ctx.add_retry_params(full_url)
|
|
891
893
|
full_url = SnowflakeRestful.add_request_guid(full_url)
|
|
894
|
+
is_fetch_query_status = kwargs.pop("is_fetch_query_status", False)
|
|
892
895
|
try:
|
|
893
896
|
return_object = self._request_exec(
|
|
894
897
|
session=session,
|
|
@@ -901,33 +904,13 @@ class SnowflakeRestful:
|
|
|
901
904
|
)
|
|
902
905
|
if return_object is not None:
|
|
903
906
|
return return_object
|
|
907
|
+
if is_fetch_query_status:
|
|
908
|
+
err_msg = "fetch query status failed and http request returned None, this is usually caused by transient network failures, retrying..."
|
|
909
|
+
logger.info(err_msg)
|
|
910
|
+
raise RetryRequest(err_msg)
|
|
904
911
|
self._handle_unknown_error(method, full_url, headers, data, conn)
|
|
905
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
906
|
-
"HttpRequestUnknownError",
|
|
907
|
-
full_url,
|
|
908
|
-
method,
|
|
909
|
-
SQLSTATE_IO_ERROR,
|
|
910
|
-
ER_FAILED_TO_REQUEST,
|
|
911
|
-
retry_timeout=retry_ctx.timeout,
|
|
912
|
-
retry_count=retry_ctx.current_retry_count,
|
|
913
|
-
)
|
|
914
912
|
return {}
|
|
915
913
|
except RetryRequest as e:
|
|
916
|
-
if (
|
|
917
|
-
retry_ctx.current_retry_count
|
|
918
|
-
== TelemetryService.get_instance().num_of_retry_to_trigger_telemetry
|
|
919
|
-
):
|
|
920
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
921
|
-
"HttpRequestRetry%dTimes" % retry_ctx.current_retry_count,
|
|
922
|
-
full_url,
|
|
923
|
-
method,
|
|
924
|
-
SQLSTATE_IO_ERROR,
|
|
925
|
-
ER_FAILED_TO_REQUEST,
|
|
926
|
-
retry_timeout=retry_ctx.timeout,
|
|
927
|
-
retry_count=retry_ctx.current_retry_count,
|
|
928
|
-
exception=str(e),
|
|
929
|
-
stack_trace=traceback.format_exc(),
|
|
930
|
-
)
|
|
931
914
|
cause = e.args[0]
|
|
932
915
|
if no_retry:
|
|
933
916
|
self.log_and_handle_http_error_with_cause(
|
|
@@ -1001,17 +984,6 @@ class SnowflakeRestful:
|
|
|
1001
984
|
) -> None:
|
|
1002
985
|
cause = e.args[0]
|
|
1003
986
|
logger.error(cause, exc_info=True)
|
|
1004
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
1005
|
-
"HttpRequestRetryTimeout" if timed_out else f"HttpRequestError: {cause}",
|
|
1006
|
-
full_url,
|
|
1007
|
-
method,
|
|
1008
|
-
SQLSTATE_IO_ERROR,
|
|
1009
|
-
ER_FAILED_TO_REQUEST,
|
|
1010
|
-
retry_timeout=retry_timeout,
|
|
1011
|
-
retry_count=retry_count,
|
|
1012
|
-
exception=str(e),
|
|
1013
|
-
stack_trace=traceback.format_exc(),
|
|
1014
|
-
)
|
|
1015
987
|
if isinstance(cause, Error):
|
|
1016
988
|
Error.errorhandler_wrapper_from_cause(conn, cause)
|
|
1017
989
|
else:
|
|
@@ -1149,15 +1121,6 @@ class SnowflakeRestful:
|
|
|
1149
1121
|
raw_ret.close() # ensure response is closed
|
|
1150
1122
|
except SSLError as se:
|
|
1151
1123
|
logger.debug("Hit non-retryable SSL error, %s", str(se))
|
|
1152
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
1153
|
-
"CertificateException%s" % str(se),
|
|
1154
|
-
full_url,
|
|
1155
|
-
method,
|
|
1156
|
-
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
1157
|
-
ER_FAILED_TO_REQUEST,
|
|
1158
|
-
exception=se,
|
|
1159
|
-
stack_trace=traceback.format_exc(),
|
|
1160
|
-
)
|
|
1161
1124
|
|
|
1162
1125
|
except (
|
|
1163
1126
|
BadStatusLine,
|
|
@@ -1190,15 +1153,6 @@ class SnowflakeRestful:
|
|
|
1190
1153
|
)
|
|
1191
1154
|
raise RetryRequest(err)
|
|
1192
1155
|
except Exception as err:
|
|
1193
|
-
TelemetryService.get_instance().log_http_request_error(
|
|
1194
|
-
"HttpException%s" % str(err),
|
|
1195
|
-
full_url,
|
|
1196
|
-
method,
|
|
1197
|
-
SQLSTATE_CONNECTION_WAS_NOT_ESTABLISHED,
|
|
1198
|
-
ER_FAILED_TO_REQUEST,
|
|
1199
|
-
exception=err,
|
|
1200
|
-
stack_trace=traceback.format_exc(),
|
|
1201
|
-
)
|
|
1202
1156
|
raise err
|
|
1203
1157
|
|
|
1204
1158
|
def make_requests_session(self) -> Session:
|
|
@@ -13,7 +13,6 @@ import re
|
|
|
13
13
|
import sys
|
|
14
14
|
import tempfile
|
|
15
15
|
import time
|
|
16
|
-
import traceback
|
|
17
16
|
from base64 import b64decode, b64encode
|
|
18
17
|
from datetime import datetime, timezone
|
|
19
18
|
from logging import getLogger
|
|
@@ -56,7 +55,6 @@ from snowflake.connector.errorcode import (
|
|
|
56
55
|
)
|
|
57
56
|
from snowflake.connector.errors import RevocationCheckError
|
|
58
57
|
from snowflake.connector.network import PYTHON_CONNECTOR_USER_AGENT
|
|
59
|
-
from snowflake.connector.telemetry_oob import TelemetryService
|
|
60
58
|
|
|
61
59
|
from . import constants
|
|
62
60
|
from .backoff_policies import exponential_backoff
|
|
@@ -250,15 +248,6 @@ class OCSPTelemetryData:
|
|
|
250
248
|
is_oob_telemetry=True,
|
|
251
249
|
)
|
|
252
250
|
|
|
253
|
-
telemetry_client = TelemetryService.get_instance()
|
|
254
|
-
telemetry_client.log_ocsp_exception(
|
|
255
|
-
event_type,
|
|
256
|
-
telemetry_data,
|
|
257
|
-
exception=str(exception),
|
|
258
|
-
stack_trace=traceback.format_exc(),
|
|
259
|
-
urgent=urgent,
|
|
260
|
-
)
|
|
261
|
-
|
|
262
251
|
return telemetry_data
|
|
263
252
|
# To be updated once Python Driver has out of band telemetry.
|
|
264
253
|
# telemetry_client = TelemetryClient()
|
|
@@ -31,12 +31,12 @@ def _resolve_platform_dirs() -> PlatformDirsProto:
|
|
|
31
31
|
"appname": "snowflake",
|
|
32
32
|
"appauthor": False,
|
|
33
33
|
}
|
|
34
|
-
snowflake_home =
|
|
34
|
+
snowflake_home = pathlib.Path(
|
|
35
35
|
os.environ.get("SNOWFLAKE_HOME", "~/.snowflake/"),
|
|
36
|
-
)
|
|
37
|
-
if
|
|
36
|
+
).expanduser()
|
|
37
|
+
if snowflake_home.exists():
|
|
38
38
|
return SFPlatformDirs(
|
|
39
|
-
snowflake_home,
|
|
39
|
+
str(snowflake_home),
|
|
40
40
|
**platformdir_kwargs,
|
|
41
41
|
)
|
|
42
42
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: snowflake-connector-python
|
|
3
|
-
Version: 3.12.
|
|
3
|
+
Version: 3.12.1
|
|
4
4
|
Summary: Snowflake Connector for Python
|
|
5
5
|
Home-page: https://www.snowflake.com/
|
|
6
6
|
Author: Snowflake, Inc
|
|
@@ -40,7 +40,7 @@ License-File: LICENSE.txt
|
|
|
40
40
|
License-File: NOTICE
|
|
41
41
|
Requires-Dist: asn1crypto<2.0.0,>0.24.0
|
|
42
42
|
Requires-Dist: cffi<2.0.0,>=1.9
|
|
43
|
-
Requires-Dist: cryptography
|
|
43
|
+
Requires-Dist: cryptography>=3.1.0
|
|
44
44
|
Requires-Dist: pyOpenSSL<25.0.0,>=16.2.0
|
|
45
45
|
Requires-Dist: pyjwt<3.0.0
|
|
46
46
|
Requires-Dist: pytz
|
|
@@ -85,6 +85,15 @@ Source code is also available at: https://github.com/snowflakedb/snowflake-conne
|
|
|
85
85
|
|
|
86
86
|
# Release Notes
|
|
87
87
|
|
|
88
|
+
- v3.12.1(August 20,2024)
|
|
89
|
+
- Fixed a bug that logged the session token when renewing a session.
|
|
90
|
+
- Fixed a bug where disabling client telemetry did not work.
|
|
91
|
+
- Fixed a bug where passing `login_timeout` as a string raised a `TypeError` during the login retry step.
|
|
92
|
+
- Use `pathlib` instead of `os` for default config file location resolution.
|
|
93
|
+
- Removed upper `cryptogaphy` version pin.
|
|
94
|
+
- Removed reference to script `snowflake-export-certs` (its backing module was already removed long ago)
|
|
95
|
+
- Enhanced retry mechanism for handling transient network failures during query result polling when no server response is received.
|
|
96
|
+
|
|
88
97
|
- v3.12.0(July 24,2024)
|
|
89
98
|
- Set default connection timeout of 10 seconds and socket read timeout of 10 minutes for HTTP calls in file transfer.
|
|
90
99
|
- Optimized `to_pandas()` performance by fully parallel downloading logic.
|
|
@@ -2,4 +2,3 @@
|
|
|
2
2
|
snowflake-dump-certs = snowflake.connector.tool.dump_certs:main
|
|
3
3
|
snowflake-dump-ocsp-response = snowflake.connector.tool.dump_ocsp_response:main
|
|
4
4
|
snowflake-dump-ocsp-response-cache = snowflake.connector.tool.dump_ocsp_response_cache:main
|
|
5
|
-
snowflake-export-certs = snowflake.connector.tool.export_certs:main
|
|
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
|