# This file contains metadata for your plugin.

# This file should be included when you package your plugin.# Mandatory items:

[general]
name=Snowflake Connector for QGIS
qgisMinimumVersion=3.34.1
qgisMaximumVersion=4.99
description=This package includes the Snowflake Connector for QGIS.
version=1.0.28
author=Snowflake Inc.
email=erick.cuberojimenez@snowflake.com

about=The Snowflake Connector for QGIS provides an interface for open-source GIS application QGIS that can connect to Snowflake and perform all standard operations.

tracker=https://github.com/snowflakedb/qgis-snowflake-connector/issues/
repository=https://github.com/snowflakedb/qgis-snowflake-connector/
# End of mandatory metadata

# Recommended items:

hasProcessingProvider=yes
changelog=1.0.28 - Packaging re-release of 1.0.27: ship the plugin as a
 properly packaged ZIP whose top-level folder is "qgis-snowflake-connector"
 (no version suffix), so installing via Plugins > Install from ZIP no longer
 fails with "ModuleNotFoundError: No module named 'qgis-snowflake-connector-1'"
 that occurs when QGIS is pointed at GitHub's auto-generated source archive.
 No functional code change since 1.0.27.
 1.0.27 - Security-scan fix: replace the three remaining silent
 best-effort try/except/pass blocks (remove_connection's auth-config removal
 and cached-session purge in helpers/utils.py, and the connection close in
 SFConnectionManager.purge_connection) with QgsMessageLog warning diagnostics,
 so the Python security scanner's "Try, Except, Pass" (bandit B110) findings
 are resolved without suppressions and cleanup failures are no longer silent.
 No user-visible behaviour change.
 1.0.26 - Fixes from end-to-end testing:
 * Filtering/subset-querying a layer by its primary-key column no longer fails
   with "ambiguous column name": the feature iterator was projecting the
   primary key twice (once in the field list and again as a trailing column).
 * Export to Snowflake no longer creates the target table during parameter
   validation; all table/schema creation now happens after the user consents,
   so a cancelled export leaves no table behind.
 * Spatial Join with the ST_DWITHIN predicate now exposes a validated Distance
   parameter and generates valid SQL (ST_DWITHIN requires a distance argument).
 * After an in-place upgrade, the plugin detects that a previous version's
   vector provider is still registered (QGIS cannot replace it while running)
   and logs a warning asking the user to restart QGIS to finish the upgrade.
 1.0.25 - Fix the Qt6 compatibility issues reported by the QGIS
 Plugin Repository scan. Every flagged enum member is now accessed through
 its enum scope (QgsWkbTypes.Type, QgsTask.Flag, QgsFeatureRequest.FilterType,
 QgsVectorDataProvider.Capability, QgsProcessingParameterNumber.Type,
 QgsProcessingAlgorithm.Flag, QDialogButtonBox.StandardButton), the provider's
 defaultValue() returns qgis.core NULL instead of a bare QVariant(), and the
 QGIS < 3.38 QVariant.Type fallback in create_qgs_field is resolved
 dynamically because that attribute only exists on PyQt5. Scoped access is
 value-identical on Qt5, so there is no behaviour change on QGIS 3.34-3.44.
 1.0.24 - Packaging/security fixes for the QGIS Plugin Repository
 validation scan: annotate two best-effort cleanup try/except blocks (the
 Buffer algorithm's temp-table teardown and the feature iterator's cursor
 close) with documented bandit B110 suppressions, matching the convention
 already used elsewhere, and remove the Sphinx help/make.bat Windows helper
 so it no longer trips the suspicious-file check. No user-visible behaviour
 change.
 1.0.23 - Fix plugin load failure ("AttributeError: module 'lib'
 has no attribute 'GEN_EMAIL'"): this is a cryptography/pyOpenSSL version
 mismatch in the QGIS Python environment (cryptography 49+ removed OpenSSL
 bindings that older pyOpenSSL still references), not a QGIS version issue.
 classFactory now catches any load-time exception (not just ImportError) so
 the plugin degrades to a no-op stub with an actionable message instead of a
 raw traceback dialog, and logs the resolved versions and paths of
 snowflake-connector-python, cryptography and pyOpenSSL to help diagnose
 per-user site-packages shadowing.
 1.0.22 - Fix from end-to-end feature testing: editing a feature on a
 Snowflake layer crashed with "TypeError: list indices must be integers or
 slices, not str" because FilterFid/FilterFids requests were pushed down to SQL
 using a column name as a list index. Feature ids are fetch-order positions, not
 primary keys, so these requests are now resolved from the in-memory feature
 cache instead, fixing the identify/attribute-table edit workflow.
 1.0.21 - Fix from end-to-end feature testing: the custom Snowflake
 expression functions (sf_h3_resolution, sf_h3_is_valid, sf_h3_to_string) were
 declared with an extra "node" parameter that QGIS never injects, so every call
 raised a TypeError and returned NULL in the field calculator, labeling, and
 symbology. The unused parameter was removed so the functions evaluate
 correctly.
 1.0.20 - Fix from end-to-end processing testing: Import from
 Snowflake now stores TIMESTAMP/DATE/TIME columns correctly instead of
 silently dropping every feature. Snowflake returns temporal values as
 Python datetime objects, which the memory/OGR sink cannot store directly;
 they are now coerced to QDateTime/QDate/QTime, mirroring the existing
 NUMBER (Decimal) handling.
 1.0.19 - Fixes from end-to-end processing testing:
 * Buffer (server-side) on GEOGRAPHY no longer freezes QGIS. Snowflake's
   optimizer produced a never-returning plan when ST_TRANSFORM and ST_BUFFER
   were fused in one expression; the reproject/buffer/reproject steps are now
   materialized into separate temporary tables.
 * Import from Snowflake now stores numeric (NUMBER) values correctly instead
   of silently dropping every feature (Decimal values are coerced to float).
 * Connections set a bounded STATEMENT_TIMEOUT_IN_SECONDS so a stuck query can
   no longer block the UI indefinitely.
 1.0.18 - Processing algorithms (Buffer, H3 index, Spatial join,
 Execute SQL) now reuse the existing Snowflake connection instead of
 force-closing and rebuilding it, fixing a UI freeze and the disruption of
 already-loaded layers when running an algorithm.
 1.0.17 - Correctness and performance fixes from end-to-end testing:
 integer/NUMBER columns (including primary keys) now display as integers instead
 of decimals; table layers reference their fully-qualified database.schema.table
 so counts/extent/queries no longer depend on the session's current schema;
 single-geometry layers use a cheaper feature count; field type names now show
 the Snowflake source type; and custom SQL-query layers no longer log a
 misleading "primary key not verified" read-only reason.
 1.0.16 - Packaging/metadata cleanup for the QGIS plugin repository:
 remove the deprecated supportsQt6 flag (QGIS 4 compatibility is set via
 qgisMaximumVersion) and exclude the Sphinx help/make.bat from the package so
 it no longer trips the repository's suspicious-file scan.
 1.0.15 - Fix layer load/rendering error at its root: remove a stray
 sys.path entry that let the plugin modules import under two names, causing a
 ModuleNotFoundError in SFFeatureSource. Restores the canonical package folder
 name for the QGIS plugin repository.
 1.0.14 - Packaging change (superseded by 1.0.15).
 1.0.13 - Fix SNOW-3712094 auth-config reuse: load the stored config
 with full=True so the connection alias is matched and the existing authcfg id
 is reused, instead of leaking a new QGIS auth config on every layer creation.
 1.0.12 - Fix plugin load failure ("cannot import name
 'QgsSqlExpressionCompiler' from 'qgis.core'"): reimplement the filter/subset
 expression compiler as a pure-Python QgsExpression AST walker, since
 QgsSqlExpressionCompiler is not exposed in the PyQGIS bindings. Injection
 protection and fail-safe fallback behaviour are preserved.
 1.0.11 - Security hardening for QGIS plugin portal scan:
 route all remaining raw identifier interpolation in helpers/layer_creation.py
 and tasks/sf_connect_task.py through quote_identifier / quote_literal /
 qualified_table_name; validate URL scheme and host before the GitHub update
 check in qgis_snowflake_connector.py; replace silent exception swallowing in
 the feature iterator and export algorithm with QgsMessageLog diagnostics;
 annotate already-sanitized SQL construction sites with documented bandit
 suppressions. No user-visible behaviour change.
 1.0.10 - Refresh attribute table after edits without reopening the layer;
 advertise auto-increment default for numeric primary keys via defaultValueClause();
 add "Load all rows" option for tables exceeding the 50,000-row visualization limit.

# Tags are comma separated with spaces allowed
tags=Snowflake, data provider

homepage=https://docs.snowflake.com/en/sql-reference/functions-geospatial/
category=Analysis
icon=icon.png
# experimental flag
experimental=False

# deprecated flag (applies to the whole plugin, not just a single version)
deprecated=False

# Since QGIS 3.8, a comma separated list of plugins to be installed
# (or upgraded) can be specified.
# Check the documentation for more information.
# plugin_dependencies=

Category of the plugin: Raster, Vector, Database or Web
# category=Database

# If the plugin can run on QGIS Server.
server=False

