odbc_fast 1.2.1
odbc_fast: ^1.2.1 copied to clipboard
Enterprise-grade ODBC data platform for Dart with a Rust native engine, streaming queries, pooling, and structured diagnostics.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.2.1 - 2026-03-10 #
Fixed #
- FFI buffer-retry reliability hardening:
- preserved stream chunks across
-2retries inodbc_stream_fetch - preserved async payloads across
-2retries inodbc_async_get_result - avoided re-execution for
-2retries by serving pending payloads in:odbc_exec_query,odbc_exec_query_params,odbc_exec_query_multi, andodbc_execute - fixed
odbc_get_driver_capabilitiesto return-2(instead of truncating JSON with success)
- preserved stream chunks across
- Added regression coverage for retry semantics in stream, async, and execute paths (including side-effect safety check for prepared execute retry).
- Removed CI flakiness in async invalid-request tests by avoiding ID collision
between
TEST_INVALID_IDand generated invalid test IDs.
1.2.0 - 2026-03-10 #
Added #
- Schema reflection API for primary keys, foreign keys, and indexes:
catalogPrimaryKeys(connectionId, table)- Lists primary keys for a tablecatalogForeignKeys(connectionId, table)- Lists foreign keys for a tablecatalogIndexes(connectionId, table)- Lists indexes for a table (PRIMARY KEY and UNIQUE constraints)
- FFI exports:
odbc_catalog_primary_keys,odbc_catalog_foreign_keys,odbc_catalog_indexes - Full implementation from Rust engine -> FFI -> Dart bindings -> Repository -> Service
- Type mapping documentation consolidated:
- Added "Type Mapping" section to README with implemented vs planned status
doc/notes/TYPE_MAPPING.mdupdated with verified implementation statuscolumnar_protocol.dartmarked as experimental/not used
- Example:
example/catalog_reflection_demo.dart - Experimental typed parameter prototype:
SqlDataType,SqlTypedValue, andtypedParam(...)
- Protocol performance benchmark suite:
test/performance/protocol_performance_test.dart
Changed #
- Reliability/performance hardening completed:
- fail-fast nullability and per-type validation in
BulkInsertBuilder.addRow() - text validation by character and UTF-8 byte length
- canonical
doublemapping to fixed-scale decimal string DateTimeyear range validation (1..9999)- complex unsupported-type error message construction via
StringBuffer
- fail-fast nullability and per-type validation in
- Documentation cleanup:
- removed completed execution plans from
doc/notes/ - added
Validation examplessection in rootREADME.md
- removed completed execution plans from
Removed #
- Orphaned
native/telemetry/directory (not compiled in workspace; actual implementation is innative/odbc_engine/src/observability/telemetry/)
Fixed #
- Streaming integration stability and cleanup:
- unique dynamic test tables and safer assertions
- CI reliability:
- Rust fmt alignment and test thread safety adjustments
1.1.2 - 2026-03-03 #
Added #
workflow_dispatchsupport in publish workflow for manual pub.dev publishing
1.1.0 - 2026-02-19 #
Added #
- Statement cancellation API exposed at high-level service/repository layers:
cancelStatement(connectionId, stmtId) UnsupportedFeatureErrorin Dart domain errors for explicit unsupported capability reporting
Changed #
- Statement cancellation contract standardized as explicit unsupported at runtime
(Option B path), with structured native error SQLSTATE
0A000 - Sync and async cancellation paths now aligned with equivalent behavior and consistent unsupported semantics
- Canonical docs aligned for cancellation status and workaround guidance:
README.md,doc/TROUBLESHOOTING.md,example/README.md
Fixed #
- Removed ambiguity between exposed cancellation entrypoints and current runtime capability by returning explicit unsupported contract instead of implicit behavior
1.0.3 - 2026-02-16 #
Added #
- New canonical type mapping documentation:
doc/TYPE_MAPPING.md - New implementation checklists:
doc/notes/TYPE_MAPPING_IMPLEMENTATION_CHECKLIST.mddoc/notes/STATEMENT_CANCELLATION_IMPLEMENTATION_CHECKLIST.mddoc/notes/NULL_HANDLING_RELIABILITY_PERFORMANCE_PLAN.md
- New/updated example coverage docs and demo files for advanced/service/telemetry scenarios
Changed #
- Root and docs indexes now reference canonical type-mapping documentation
- Master gaps plan now tracks open execution checklists for remaining gaps
Fixed #
- Documentation consistency across root README,
doc/README.md, and notes references
1.0.2 - 2026-02-15 #
1.0.0 - 2026-02-15 #
Added #
- Async API request timeout:
AsyncNativeOdbcConnection(requestTimeout: Duration?)— optional timeout per request; default 30s;Duration.zeroornulldisables - AsyncError new codes:
requestTimeout(worker did not respond in time),workerTerminated(disposed or crashed) - Parallel bulk insert (pool-based) end-to-end: Rust FFI
odbc_bulk_insert_parallelnow implemented and exposed in Dart sync/async service/repository stack - Bulk insert comparative benchmark: new ignored Rust E2E benchmark test
e2e_bulk_compare_benchmark_testforArrayBindingvsParallelBulkInsert
Changed #
- Async dispose: Pending requests now complete with
AsyncError(workerTerminated) instead of hanging whendispose()is called - Worker crash handling: When the worker isolate dies, pending requests complete with error instead of hanging
- BinaryProtocolParser: Truncated buffers now throw
FormatException('Buffer too small for payload')instead ofRangeError
Fixed #
- Array binding tail chunk panic: fixed
copy_from_slicelength mismatch when the final bulk-insert chunk is smaller than configured batch size
0.3.1 - 2026-01-29 #
Changed #
- Improved download experience: Native library download now includes retry logic with exponential backoff (up to 3 attempts)
- Better error messages: Download failures now show detailed troubleshooting steps and clearly explain what went wrong
- HTTP 404 handling: When GitHub release doesn't exist, provides clear instructions for production vs development scenarios
- Connection timeout: Added 30-second timeout to HTTP client to prevent hanging on slow connections
- Download feedback: Shows file size after successful download
- CI/pub.dev detection: Skip download in CI environments to avoid analysis timeout, with clear logging
Fixed #
- pub.dev analysis timeout: Hook now detects CI/pub.dev environment and skips external download, allowing pub.dev to analyze the package correctly
0.3.0 - 2026-01-29 #
Added #
- Configurable result buffer size:
ConnectionOptions.maxResultBufferBytes(optional). When set at connect time, caps the size of query result buffers for that connection; when null, the package default (16 MB) is used. Use for large result sets to avoid "Buffer too small" errors. ConstantdefaultMaxResultBufferBytesis exported for reference.
0.2.9 - 2026-01-29 #
Fixed #
- Async API "QueryError: No error": when executing queries with no parameters, the Dart FFI was passing
nullfor the params buffer toodbc_exec_query_params, which caused invalid arguments and led to failures reported as "No error". The native bindings now always pass a valid buffer (e.g.Uint8List(0)) instead ofnull, so both sync and async (worker) paths work correctly for parameterless queries.
0.2.8 - 2026-01-29 #
Added #
scripts/copy_odbc_dll.ps1: copiesodbc_engine.dllfrom package (pub cache) to project root and Flutter runner folders (Debug/Release) for consumers who need the DLL manually
Changed #
- Publish
hook/andscripts/in the package (removed from.pubignore): Native Assets hook runs for consumers so the DLL can be downloaded/cached automatically; scriptcopy_odbc_dll.ps1is available in the package - Minimum SDK constraint raised to
>=3.6.0(required by pub.dev when publishing packages with build hooks)
Fixed #
- Async API (worker isolate): empty result (DDL/DML, SELECT with no rows) is now returned as
Result.ok(QueryResult(columns: [], rows: [], rowCount: 0))instead ofResult.err(QueryError("No error", ...))(fixes "No error" when executing CREATE TABLE, INSERT, ALTER, etc.)
0.2.7 - 2026-01-29 #
Fixed #
- Native DLL cache now keyed by package version (
~/.cache/odbc_fast/<version>/) to avoid loading an older DLL when upgrading the package (fixes symbol lookup error 127 for new symbols e.g.odbc_savepoint_create)
0.2.6 - 2026-01-29 #
0.2.5 - 2026-01-29 #
Added #
- Database type detection in tests:
detectDatabaseType(),skipIfDatabase(),skipUnlessDatabase() - Test helpers for conditional execution by database (SQL Server, PostgreSQL, MySQL, Oracle)
test/helpers/README.mdwith usage and examples
Changed #
- Dart tests run sequentially (
--concurrency=1) to avoid resource contention (ServiceLocator, worker isolates) - Savepoint release test skipped on SQL Server (RELEASE SAVEPOINT not supported)
Fixed #
- Rust FFI E2E:
ffi_test_dsn()loads.envand checksENABLE_E2E_TESTS; invalid stream ID race in tests - Dart integration test timeouts when running in parallel
0.2.4 - 2026-01-27 #
0.2.3 - 2026-01-27 #
Changed #
- CI: run only unit tests that do not require real ODBC connection (domain, protocol, errors)
- CI: exclude stress, integration/e2e, and native-dependent tests from publish pipeline
0.2.1 - 2026-01-27 #
Fixed #
- Fixed Native Assets hook to read package version from correct pubspec.yaml
- Fixed test helper to properly handle empty environment variables
- Fixed GitHub Actions cache paths and key format
Changed #
- Improved CI workflow: now builds Rust library before running tests
- Split unit and integration tests in CI for better organization
- Enhanced GitHub Actions workflows with proper dependency installation
0.2.0 - 2026-01-27 #
Added #
- Savepoints (nested transaction markers)
- Automatic retry with exponential backoff for transient errors
- Connection timeouts (login/connection timeout configuration)
- Connection String Builder (fluent API)
- Backpressure control in streaming queries
Changed #
- Async API with worker isolate for non-blocking operations
- Comprehensive E2E Rust tests with coverage reporting
- Improved documentation and troubleshooting guides
Fixed #
- Various lint issues (very_good_analysis compliance)
- Code formatting and cleanup