dbas_sqlite 2.4.4
dbas_sqlite: ^2.4.4 copied to clipboard
Flutter plugin that access SQLite for Android, iOS, macOS, Linux, Windows and Web.
Changelog #
All notable changes to this project will be documented in this file.
2.4.4 - 2026-05-05 #
Re-publish of 2.4.1. Earlier release-pipeline runs (2.4.1 – 2.4.3) were blocked by GitHub App configuration, pub.dev OIDC wiring, and a tag-pattern mismatch on pub.dev's automated-publishing config. Package contents are identical to what 2.4.1 was meant to ship.
2.4.1 - 2026-05-05 #
First public pub.dev release under the verified publisher dailysoftwaresystems.com. Functionally identical to 2.4.0 — this release exists to ship the build / packaging / governance fixes needed to publish.
Changed #
- License: relicensed from proprietary to Apache 2.0, matching
the sibling
DBAS.SQLitenative lib. The Apache license includes an explicit patent grant, which is appropriate for a plugin that ships prebuilt native binaries via FFI. - README install snippet updated to the pub.dev syntax
(
dbas_sqlite: ^2.4.1) instead of the git URL.
Fixed #
- macOS desktop link failure: the macOS podspec did not declare
s.libraries = 'c++', so consumer apps failed to link withUndefined symbols: std::__1::*, ___cxa_throw, ___gxx_personality_v0. Added the libc++ link declaration; iOS was already correct. - Windows desktop DLL bundling: the
<package_name>_bundled_librariesCMake variable still used the pre-rename name, so Flutter no longer saw the bundle declaration and the runner kept loading a stale DLL that didn't exportGetSqliteVersion. Renamed to match the new package name. - Android Gradle compile: replaced the
org.yaml.snakeyaml.Yamlpubspec parse inandroid/build.gradlewith a regex match — newer Gradle versions no longer ship snakeyaml on the default classpath. - AGP 9 forward-compat: added
android.newDsl=falsetoexample/android/gradle.properties. Flutter apps that depend on plugins are not yet supported on AGP 9 (flutter/flutter#181383) — this flag preserves the old DSL parsing so the build keeps working when AGP 9 lands. Remove it once Flutter completes its AGP 9 migration.
Added #
PipelineGitHub Actions workflow (.github/workflows/ci.yml): PR runsflutter analyze+ native tests + web integration tests; push-to-main with a bumpedversion:creates a GitHub release; tag push triggers OIDC publish to pub.dev.SECURITY.md— disclosure policy pointing security reports tosecurity@dailysoftwaresystems.com.CODEOWNERS— every PR requires review from the DBAS dev team.
Internal #
- Plugin renamed across native folders:
dbas_sqlite_flutter_pluginC++ classes →dbas_sqlite_plugin, KotlinDbasSqliteFlutterPlugin→DbasSqlitePlugin, SwiftDbasSqliteFlutterPlugin→DbasSqlitePlugin, podspec files renamed, Android namespacecom.dailysoftwaresystems.dbas.sqlite.flutter→com.dailysoftwaresystems.dbas.sqlite. No public Dart API change — the package name was alreadydbas_sqlitein 2.4.0.
2.4.0 - 2026-05-05 #
Breaking Changes #
- Package renamed from
dbas_sqlite_fluttertodbas_sqlite: update your imports and pubspec dependency. The library export path stays the same —package:dbas_sqlite/dbas_sqlite.dart. db.executeSql(...),db.executeReader(...)anddb.getLastInsertedId()removed. Replaced by an explicitDbasSqliteStatementreturned fromdb.prepareQuery(sql). The statement owns parameter binding and execution;getAffectedRows/getLastInsertedId/getLastErrormove from the database to the statement (per-statement, race-free under concurrent inserts).DbasSqliteReadercolumn accessors are unchanged from v2.3.x — only the path that produces a reader is new.
Added #
DbasSqliteStatement: prepared statement object with fluent positional and named bind methods,executeSql/executeReaderexecution modes, per-statementgetAffectedRows/getLastInsertedId/getLastError, andclose. The bind buffer survives a failed execute so the caller can fix one slot and retry.- Multiple statements + readers per database: the upgraded native lib lets multiple prepared statements live on a single connection; on Dart, two statements with overlapping
executeReadercalls each get their own pool slot and run in parallel. - Multi-isolate FFI worker pool: replaces the single worker isolate. Worker count auto-floors to
max(workerPoolSize, readerPoolSize + 2)so blocking pool acquires can never starve concurrent releases. Dead workers are removed from the dispatch rotation; dispatch is prefer-free over round-robin. PoolAcquireReaderBlockingintegration:executeReaderblocks up toDbasSqlite.kPoolAcquireTimeoutMs(default 30 s) for a free pool slot instead of silently falling back to the writer. On timeout, throwsTimeoutExceptionwith a clear message.- New utility methods on
DbasSqlite:getSqliteVersion,getTotalChanges,getDbFileName,setBusyTimeout,enableWal. - Web in-transaction reads route through
pool.exec(writer worker, EXCLUSIVE MRSW fence) so reads observe in-flight transactional state. - Web pool dead-state surfacing: when the JS pool can't return rows for an in-transaction SELECT (current bundled worker), the Dart side throws a clear
UnsupportedErrorinstead of silently returning empty. - Opaque FFI structs:
DbasSqliteDbStructandDbasSqlitePoolStructare nowOpaque {}. The native C lib has changed layout across versions; treating the structs as opaque eliminates the silent-misread risk and aligns with the C header's stated ABI policy. - 15 new tests covering: counter cache after reader auto-close, column metadata before first row, bind error rc surfacing, bind buffer preservation on failure,
setBusyTimeouttermination + busy-reader contract, multi-statement concurrency, statement reuse, per-statement state isolation, and forgotten-statement cleanup oncloseDb.
Changed #
prepareQueryat the platform layer now returns({int handle, int columnCount, List<String> columnNames})so column metadata is available to the reader BEFORE the firstreadRowcall.- Per-stmt counters are read BEFORE finalize in the reader's onClose closure. Reading them after finalize would always return -1 (stale-handle sentinel).
- Bind methods at the platform layer return
Future<int>; the FFI variant awaits the worker dispatch so bind errors (SQLITE_RANGE / SQLITE_TOOBIG / SQLITE_NOMEM / stale handle) propagate to the caller instead of being silently swallowed. closeDbcleanup discipline: tracked statements are closed first, then the pool is force-drained viaClosePool(defensive), then on the single-connection pathCloseDbis called and any returnedSQLITE_BUSYraises a loudStateErrorinstead of silent leak.rollbacknow wraps a failedROLLBACKin aStateErrorand rethrows so callers know the C-side autocommit state may be inconsistent — instead of silently clearing_isInTransaction.dropDbnow attempts every deletion (.db,-wal,-shm,-journal) and aggregates failures into a singleFileSystemExceptionso partial cleanup is impossible.DbasSqliteReader.close()caches its close future so concurrent close calls (auto-close onDONE+ explicit close) all observe the same completion instead of one returning early while cleanup is still mid-flight.DbasSqliteReader.readRow()error-path readsgetLastStmtError(handle)(per-stmt) instead ofgetLastDbError(conn)(connection-scoped) — fixes a v2.3.x latent bug where errors from one statement's step could be masked by another's.- Web
enableWalnow actively verifies viaPRAGMA journal_modeinstead of a silent no-op.
Removed #
setWriteMode/beginTransactionLease/endTransactionLeaseindirection onDbasSqliteNativeInterfaceand its forwarders. Direct routing throughpool.exec/pool.querymakes them obsolete.DbasSqliteNativeAppIO/AOT variant (dbas_sqlite_native_app_io.dart): the conditional export selector always picked the FFI variant on every platform that hasdart.library.ffi, which is every Flutter target except web. The IO/AOT variant was dead code; removed.- Old
lib/src/native/dbas_sqlite_row_cache.dart: relocated tolib/src/dbas_sqlite_row_cache.dart. The cache is now an owned-by-reader concern, not a native-internal concern. Per-stmt counter / lastError fields removed fromRowDatasince they live onDbasSqliteStatement.
Migration Guide #
// Before (2.3.x)
import 'package:dbas_sqlite_flutter/dbas_sqlite.dart';
final affected = await db.executeSql(
'INSERT INTO users (name) VALUES (?)',
params: ['Alice'],
);
final id = db.getLastInsertedId();
final reader = await db.executeReader(
'SELECT * FROM users WHERE id > ?', params: [0],
);
while (await reader.readRow()) { ... }
await reader.close();
// After (2.4.0)
import 'package:dbas_sqlite/dbas_sqlite.dart';
final insertStmt = await db.prepareQuery('INSERT INTO users (name) VALUES (?)');
try {
final affected = await insertStmt.executeSql(params: ['Alice']);
final id = insertStmt.getLastInsertedId();
} finally {
await insertStmt.close();
}
final selectStmt = await db.prepareQuery('SELECT * FROM users WHERE id > ?');
try {
final reader = await selectStmt.executeReader(params: [0]);
try {
while (await reader.readRow()) { ... }
} finally {
await reader.close();
}
} finally {
await selectStmt.close();
}
A statement can be reused with different params per execute — the bind buffer is replayed against a fresh native handle on each call:
final stmt = await db.prepareQuery('INSERT INTO users (name) VALUES (?)');
try {
for (final name in ['Alice', 'Bob', 'Carol']) {
await stmt.executeSql(params: [name]);
}
} finally {
await stmt.close();
}
2.3.0 - 2026-04-13 #
Breaking Changes #
executeReadernow returnsDbasSqliteReader: Instead of storing reader state on theDbasSqliteinstance,executeReaderreturns an independentDbasSqliteReaderobject. All column access methods (getColumnText,getColumnInt,readRow,isColumnNull, etc.) are now on the reader, not onDbasSqlite.closeReader()removed fromDbasSqlite: Usereader.close()on the returnedDbasSqliteReaderinstead.readRow()removed fromDbasSqlite: Usereader.readRow()on the returnedDbasSqliteReaderinstead.- All
getColumn*methods removed fromDbasSqlite: Use the corresponding methods onDbasSqliteReaderinstead. - Readers must be explicitly closed: The old auto-cleanup (
_closePendingReader) no longer exists. Readers that don't exhaust all rows must be closed withreader.close()before the connection can be reused.readRow()still auto-closes when it returnsfalse.
Added #
DbasSqliteReaderclass: Independent reader object returned byexecuteReader. Each reader owns its own database connection (from the pool or writer fallback) and prepared statement. Multiple readers can coexist simultaneously, enabling parallel reads.getColumnValue(index)onDbasSqliteReader: Returns the typed value of a column based on its SQLite type (int, double, text, blob, or null).- Active reader tracking:
DbasSqlitenow tracks all open readers.closeDb()automatically closes every active reader before shutting down the pool/connection, preventing use-after-free on lingering readers. - Exported
DbasSqliteReaderfrom the package barrel file.
Changed #
- Pool reader acquisition is non-blocking:
executeReadernow tries to acquire a pool reader without waiting. If all readers are busy, it falls back to the writer connection immediately instead of blocking. - Reader lock removed: The serializing reader lock (
_acquireReaderLock/_releaseReaderLock) is no longer used byexecuteReader, since each reader independently manages its own pool connection lifecycle. closeDb()closes active readers: All openDbasSqliteReaderinstances are closed before the database connection is shut down, ensuring pool connections and writer locks are properly released.
Migration Guide #
// Before (2.2.x)
await db.executeReader('SELECT * FROM users');
while (await db.readRow()) {
print(db.getColumnText(0));
}
await db.closeReader();
// After (2.3.0)
final reader = await db.executeReader('SELECT * FROM users');
while (await reader.readRow()) {
print(reader.getColumnText(0));
}
await reader.close();
Multiple parallel readers are now possible:
final r1 = await db.executeReader('SELECT * FROM orders');
final r2 = await db.executeReader('SELECT * FROM products');
// Both active simultaneously, each on their own pool connection
while (await r1.readRow()) { /* ... */ }
while (await r2.readRow()) { /* ... */ }
await r1.close();
await r2.close();
2.2.0 - 2026-04-11 #
Breaking Changes #
- Unified writer lock: The async writer lock now applies on both web and native (previously web used a separate lease mechanism). Concurrent
executeSqlcalls on web are now properly serialized instead of interleaving atawaitpoints. This fixes data corruption from concurrent writes but means web writes are now queued, matching native behavior. - Web
executeSqlerrors propagate:DbasSqliteNativeWeb.executeSqlno longer catches exceptions and returns-1. Errors fromBEGIN TRANSACTION,COMMIT, andROLLBACKnow propagate to callers instead of being silently swallowed. - Web
databaseExistspropagates infrastructure errors: Previously returnedfalsefor any error (including OPFS unavailable, worker crash). Now uses the worker'sexistsaction and lets infrastructure failures propagate.
Added #
- Background isolate FFI worker: All heavy native FFI operations (
executeSql,prepareQuery,readRow,openDb,closeDb,createPool,closePool) now run on a dedicated background isolate viaDbasSqliteIsolateWorker. Bind operations remain on the main isolate for synchronous access. This prevents FFI calls from blocking the UI thread. - Row data cache (
RowData/ColumnData): Shared between native and web paths. AfterreadRow, all column values are cached in Dart memory for synchronous access — no FFI round-trips forgetColumn*calls. - True streaming web attach (
attachStreamBegin/attachStreamChunk/attachStreamEnd): Database imports on web now stream chunk-by-chunk to the worker with ACK-based backpressure. The complete database is never buffered in Dart memory — critical for 500 MB+ databases. - Streaming web export:
getContent()on web now uses theexportStreamprotocol, handling both Transferable Streams (Chrome/Firefox) and chunked postMessage fallback (Safari) with ACK-based backpressure. - BigInt handling for
lastInsertId: Emscriptenlong longreturns (JS BigInt) are now correctly converted to Dartintvia JSNumber()interop. List<int>blob binding:executeSqlandexecuteReadernow accept plainList<int>in addition toUint8Listfor blob parameters.- C-level connection pool with mutex: The native C library pool (
CreatePool/PoolAcquireReader/PoolReleaseReader) now haspthread_mutex_t(POSIX) /CRITICAL_SECTION(Windows) protection for thread-safe reader acquire/release. transaction()rollback error reporting: If both the action and rollback fail, aStateErroris thrown containing both error messages instead of silently discarding the rollback failure.- 88 native unit tests, 25 web integration tests.
Changed #
- Web pool architecture: Replaced the old multi-slot web pool with a per-database
DbasSqliteWebPoolbacked by a single Web Worker. Each database gets its own worker with OPFS persistence. - Web worker protocol: Updated to match DBAS.SQLite 3.1.x worker —
exec,query,batch,drop,streamCopy,attachStreamBegin/Chunk/End,exportStream,exists,close. close()ordering:DbasSqliteWebPool.close()now sends theclosecommand to the worker before setting_closed = true, ensuring the worker gets a chance to flush WAL data and release OPFS locks.- Platform delegate re-creation:
DbasSqlitePlatform.createPoolandopenDbnow lazily re-create the delegate afterdropDbremoves it, fixing null pointer crashes on the drop → open cycle. importScriptsURL: ThelibUrlsent to the web worker is now relative to the worker script location (dbas_sqlite.js) instead of the page root, fixing doubled-path errors.
Fixed #
- Concurrent writes on web: Three or more concurrent
executeSqlcalls no longer corrupt shared buffered state (_pendingSql,_isWriteQuery). The unified writer lock serializes them. getLastInsertedIdreturning 0 on web: The Emscriptenlong longreturn value (JS BigInt) is now correctly converted to Dartint.- Blob binding for
List<int>:List<int>.generate(...)and other non-Uint8Listinteger lists are now accepted as blob parameters. close()not sending worker shutdown: The worker now receives thecloseaction before termination.postMessageerrors leaking completers: IfpostMessagethrows (e.g.DataCloneError), the registered handler/completer is cleaned up and completed with an error instead of hanging forever.attachStreamAbortwrong ID: The abort message now uses the original session ID for correct worker-side correlation._readStreamToBytesreader lock leak: TheReadableStreamreader lock is now released in afinallyblock on both success and error paths.- Unknown ReadableStream chunk types:
_readStreamToBytesnow throwsStateErroron unrecognized chunk types instead of silently dropping bytes. exportContentStreamhang: Added 120-second timeout to prevent indefinite hangs if the worker stops responding.- Isolate
ReceivePortstream errors: AddedonErrorhandler that fails all pending requests instead of leaving them hanging.
Removed #
DbasSqliteConnectionPool: Replaced by the C-level pool managed throughDbasSqliteNativeInterface.- Web transaction lease methods:
beginTransactionLease/endTransactionLeaseare now no-ops — transactions use the unified writer lock.
2.1.2 - 2026-04-09 #
- Web streamed attach:
attachStreamDbnow sends chunks individually to the Web Worker via a begin/chunk/end protocol instead of buffering the entire file in Dart memory - Renamed database directory from
datatodbas_dataacross all platforms - Improved error handling: cleanup failures during stream attach are now logged instead of silently swallowed
- Updated
attachStreamDbdoc comment to reflect the new OPFS-backed streaming implementation
2.1.1 - 2026-04-07 #
- Adjust pipes
2.1.0 - 2026-04-07 #
- Adjust pipes
2.0.10 - 2026-04-06 #
- Adjust pipes
2.0.9 - 2026-04-06 #
- Fixed
executeSqlandexecuteReaderonly catching SQLite error codes -1 and 1 fromprepareQuery— all non-zero codes (e.g. SQLITE_BUSY, SQLITE_NOMEM) are now properly detected, preventingreadRowfrom operating on a NULL statement - Fixed
_bindParametersonly catching error codes -1 and 1 — all non-zero bind results (e.g. SQLITE_RANGE for out-of-bounds index) are now caught - Fixed writer-lock deadlock when
executeReaderorexecuteSqlis called while a previous reader session is still open (e.g. caller read partial rows without callingcloseReader); pending readers are now automatically closed before acquiring locks - Fixed
executeSqlnot finalizing the prepared statement whengetAffectedRowsthrows —closeReaderis now guaranteed via try-finally - Error messages from
prepareQueryand_bindParametersfailures now include the SQLite error code for easier debugging getLastDbErroris now captured beforecloseReaderon prepare failures to prevent potential loss of error context
2.0.7 - 2026-04-06 #
- Unified
readRowresponse handling betweenexecuteSqlandreadRowinto a shared_readRowAndValidatemethod - Replaced magic number
20with_sqliteMisuseconstant
2.0.6 - 2026-04-06 #
- Named parameter binding now silently skips parameters not found in the prepared statement, matching C#/SQLite behavior
- Extra named parameters no longer throw — only actual bind errors are raised
- Added
throwOnMissingNamedParamsoption to throw on unknown named parameters (defaults tofalse)
2.0.3 - 2026-04-04 #
- Updated minimum platform versions: Android API 35, iOS 16.0, macOS 13.0 (Ventura)
- Updated Android compileSdk to 35, NDK r29
- Fixed CocoaPods base configuration warnings on macOS
- Fixed
--project-rootflag in run scripts causing Flutter crash - Fixed glob patterns in
sync_sqlite_lib.sh
2.0.1 - 2026-04-03 #
- Connection Pool (WAL mode):
openDb()now creates a pool with 1 writer + N readers (default 4), configurable viareaderPoolSizeparameter - Pool is fully automatic and transparent -- reads use pool readers, writes use the writer, no API changes needed
- Falls back to single connection if pool creation fails or
readerPoolSize = 0 - Thread safety: Writer mutex serializes all write operations (executeSql, transactions). Reader mutex serializes read sessions. Writer and reader locks are independent, allowing concurrent reads and writes via WAL mode
- Transactions hold the writer lock for their full duration; reads within a transaction use the writer connection to see uncommitted data
- Web Worker architecture: WASM module now runs inside a dedicated Web Worker (required for OPFS
createSyncAccessHandle). Bind calls are buffered and flushed to the worker onreadRow. Column data is pre-fetched and cached for sync access - New:
streamCopyDb(destDbName)- Stream-copy the current database to a new name with automatic cleanup of destination WAL/SHM files - New:
attachStreamDb(stream)- Attach a database from a byte stream - New: Connection pool support wired through the full native stack (C FFI, IO/AOT, Web, stubs)
- New:
DbasSqlitePoolStructFFI struct mapping the CSQLitePoolstruct - Updated native C library with pool functions:
CreatePool,PoolGetWriter,PoolAcquireReader,PoolReleaseReader,ClosePool - Updated JS wrapper with pool support and OPFS persistence
closeDb()properly cleans up pool, releases all locks, and unblocks any waiterscloseReader()releases the correct lock (reader lock for pool readers, writer lock for fallback)- Added
isOpened()guards after lock acquisition to handlecloseDbduring pending operations - 55 unit tests covering pool, thread safety, concurrent operations, transactions, and all data types
1.6.2 - 2026-03-12 #
C SQLite lib ReadRowcapture error messages inside last error
1.6.1 - 2026-03-11 #
commit()now performs automatic rollback if the COMMIT fails- Added
syncWebDb: truetobeginTransaction(),commit()androllback()for web persistence
1.6.0 - 2026-03-11 #
- Added Transaction API:
beginTransaction(),commit(),rollback() - Added
transaction()helper with automatic commit and rollback on error - Added
isInTransactiongetter to check active transaction state closeDb()now automatically rolls back any pending transaction before closing- Fixed typo in
_bindParameterserror message (extra})
1.5.1 - 2026-03-11 #
- Podspec versions now automatically read from
pubspec.yaml - Updated README installation version reference
1.5.0 - 2026-03-11 #
- Refactored native layer with Template Method pattern (
DbasSqliteNativeAppBase) - Added FFI implementation (
dbas_sqlite_native_app_ffi.dart) withDynamicLibraryloading - Added IO/AOT implementation (
dbas_sqlite_native_app_io.dart) with@Nativeannotations - Introduced platform selector (
dbas_sqlite_native_app_selector.dart) with conditional exports - Simplified
closeDbimplementation - Adjusted pipes and build configuration
1.4.8 - 2026-03-11 #
- Simplified
closeDbflow
1.4.7 - 2026-03-11 #
- Fixed memory leaks in
dbas_sqlite_native_app_io.dart
1.4.6 - 2026-03-11 #
- Internal adjustments and fixes
1.4.5 - 2026-03-11 #
- Fixed reader resource leaks
1.4.4 - 2026-03-10 #
- Internal improvements
1.4.3 - 2026-03-10 #
- Removed unused imports
1.4.2 - 2026-03-10 #
- Adjusted
dropDbbehavior - Removed unused imports
1.4.1 - 2026-03-10 #
- Enhanced web platform support
- Updated versions and dependencies
- Updated example project iOS version
- Updated Flutter plugins
1.4.0 - 2026-03-10 #
- Upgraded SQLite to version 3.52.0
- Updated all native binaries for all platforms
1.3.1 - 2026-02-28 #
- Added
getColumnTime()to readDurationvalues from columns - Added
getColumnNullableTime()nullable variant
1.3.0 - 2025-11-07 #
- Upgraded SQLite to version 3.51.0
- Updated all native binaries for all platforms
1.2.12 - 2025-11-06 #
- Enhanced
boolbinding support —true/falsemapped to1/0
1.2.11 - 2025-11-05 #
- Enhanced error messages for better debugging
1.2.10 - 2025-11-05 #
- Enhanced
isOpened()reliability
1.2.9 - 2025-11-05 #
- Added existence check before
dropDbto prevent errors on non-existent databases
1.2.8 - 2025-11-05 #
- Automatically close database before dropping it
1.2.7 - 2025-11-05 #
- Added
closeReader()as a public method
1.2.6 - 2025-11-05 #
- Reader now auto-closes when all rows have been read (
readRowreturnsfalse)
1.2.5 - 2025-11-05 #
- Fixed
closeReaderbehavior - Fixed
getContentto properly read database file bytes
1.2.4 - 2025-11-05 #
- Fixed error handling order in SQL execution
1.2.3 - 2025-11-05 #
- Enhanced error reporting for failed
readRowoperations - Added misuse detection (error code 20) with descriptive message
1.2.2 - 2025-11-05 #
- Enhanced
getLastDbErrorhandling
1.2.1 - 2025-11-05 #
- Fixed
getLastDbErrornull pointer handling
1.2.0 - 2025-11-05 #
- Fixed parameter binding — both positional and named parameters
- Added
executeSqloverload withparamsandnameParamssupport - Added
executeReaderoverload withparamsandnameParamssupport
1.1.7 - 2025-10-25 #
- Added
getContent()to read raw database file bytes
1.1.6 - 2025-10-24 #
- Fixed
getColumnNamereturn value handling
1.1.5 - 2025-10-24 #
- Added
getColumnName(index)to retrieve column names from query results
1.1.4 - 2025-10-20 #
- Synced native libraries across all platforms
1.1.3 - 2025-10-20 #
- Added
dropDb()to delete database files (including WAL and SHM)
1.1.2 - 2025-09-03 #
- Added
getLastInsertedId()to retrieve the last auto-increment row ID
1.1.1 - 2025-09-01 #
- Fixed naming conventions
1.1.0 - 2025-09-01 #
- Added
attachDb(bytes)to create/replace a database from raw bytes - Added
databaseExists()to check if the database file exists - Added support for multiple database instances via
getInstance(dbName:)
1.0.6 - 2025-08-13 #
- Added
attachDboption for importing databases from byte arrays
1.0.5 - 2025-08-08 #
- Fixed public exports
1.0.4 - 2025-08-08 #
- Added
getColumnDateTime()andgetColumnNullableDateTime()for DateTime columns - Added
getColumnEnum()andgetColumnNullableEnum()for enum columns - Added
getColumnBool()andgetColumnNullableBool()for boolean columns - Added
getColumnDecimal()andgetColumnNullableDecimal()for Decimal columns - Added nullable variants for all column getters
1.0.3 - 2025-08-08 #
- Added
GetColumnNamefeature at native level
1.0.2 - 2025-08-07 #
- Enhanced native library bundling for all platforms
1.0.1 - 2025-08-07 #
- Enhanced CMakeLists for Windows and Linux builds
- Improved automatic DLL/SO copy in post-build steps
1.0.0 - 2025-08-06 #
- 🎉 First stable release
- Cross-platform support: Android, iOS, macOS, Linux, Windows, Web
- Core SQLite operations:
openDb,closeDb,executeSql,prepareQuery,readRow - Parameter binding by index (1-based) and by name (
:param,@param,$param) - Column data retrieval: text, int, float, double, blob, null check, column type, column count
getAffectedRows()andgetLastDbError()- Web support via JavaScript SQLite with IndexedDB persistence
- Native FFI integration for mobile and desktop platforms
- xcframework for iOS and macOS
- Automatic native library bundling via CMake (Windows, Linux) and podspec (iOS, macOS)
- CI/CD pipeline
- Example app with basic usage
- Unit tests for core operations
0.x.x - 2025-07-26 to 2025-08-06 #
- Initial development and platform bring-up
- WIP implementations for all platforms
- SQLite FFI layer development
- Test infrastructure setup