Changelog

Source: CHANGELOG.md — auto-mirrored on each deploy.

3.0.1 (2026-07-01)

Bug Fixes

  • paging: honor initialLoadSize on keyset refresh to stop placeholder blink (#129) (a2132f8)

3.0.0 (2026-07-01)

⚠ BREAKING CHANGES

  • strip unused sqldelight plugin + runtime deps (3.0.0 cleanup) (#61)
  • Sqkon factories on JVM and Android no longer accept com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDatabaseType; use com.mercury.sqkon.db.SqkonDatabaseType (Memory / FileBacked) instead. EntityQueries and MetadataQueries constructors are now internal — instances are created exclusively via the Sqkon(…) factories.
  • KeyValueStorage no longer implements app.cash.sqldelight.Transacter, and the transaction lambda receiver is SqkonTransactionScope instead of SQLDelight’s TransactionCallbacks. transaction { } / transactionWithResult { } calls are source-compatible. Update code only if you: (1) held a store as a Transacter (val t: Transacter = store) — call store.transaction { } directly; (2) imported app.cash.sqldelight.TransactionCallbacks as the block receiver type — drop the import, SqkonTransactionScope is inferred; (3) used Transacter members beyond afterCommit/afterRollback/rollback/nested transaction — rework against SqkonTransactionScope; (4) relied on transactionWithResult { rollback() } returning a value — it now throws SqkonRollbackException. See docs/guides/transactions.md#upgrading-from-1x.

Features

  • arch: internal SqkonDriver abstraction (MOB-3289) (#55) (eca9a34)
  • direct androidx.sqlite driver, drop SQLDelight SqlDriver (MOB-3293) (#60) (fe88ce8)
  • hand-roll entity and metadata data classes (MOB-3290) (#57) (2c9afeb)
  • hide sqldelight transacter behind SqkonTransactionScope (MOB-3292) (#59) (0255188)

Bug Fixes

  • alias SqlException to androidx.sqlite.SQLiteException so catches fire (#82) (#109) (10e2a80)
  • bind Float query values as reals instead of truncating to Long (#72) (#98) (96cba5d)
  • consistent paging load() error handling — return Error, rethrow Cancellation (#81) (#108) (e2fa920)
  • count(where=…) over-counts list/multi-match predicates (#68) (#91) (4b295b1)
  • escape LIKE wildcards + match json_tree key quoting in fullkey predicates (#69) (#93) (e6715ba)
  • expose public-API deps as api so consumers get them transitively (#78) (#104) (b9a55b7)
  • guard ListenerIdentityMap with a Mutex for concurrent Flow collectors (#76) (#102) (ac6b0b7)
  • make schema migration stepwise/exhaustive + reject downgrades (#77) (#103) (30e51b0)
  • paging: defer read-tracking past Invalid check (#119) + apply expiresAfter to offset count (#122) (8b50d91)
  • parenthesize expiry predicate so it can’t leak rows across stores (#67) (#90) (700c696)
  • report keyset paging item counts for stable scroll position (#117) (28dd31f)
  • set PRAGMA busy_timeout on every connection (WAL contention hardening) (#75) (#101) (30fbd65)
  • verify SQL on statement-cache hit to guard against identifier collisions (#74) (#100) (686276f)

Performance

  • paging: halve paged-query volume; cache offset count per source (#120) (97e6ac5)

Dependencies

  • migrate to kotlin.time.Instant, drop kotlinx-datetime (MOB-3549) (#63) (c1e2be5)

Documentation

  • clarify offset count-cache invalidation comment (#121) (939b1cd)
  • correct keyset paging cost — O(n) ordered scan per page, not O(log n) (#80) (#106) (8dc3c5e)
  • correct write-threading claim — writes block the caller thread (#70) (#96) (e60e018)
  • document the enum @SerialName query gap accurately + drop dead code (#73) (#99) (8e6a7a8)
  • fix non-compiling README/KDoc snippets + stale install version (#79) (#105) (3a1867c)
  • keyset first-page cost is O(n) too, not O(pageSize) (#80 follow-up) (#107) (7ba6761)

Miscellaneous

  • strip unused sqldelight plugin + runtime deps (3.0.0 cleanup) (#61) (f4e975b)

2.1.0 (2026-05-13)

Features

  • ios scaffold + SqkonDispatchers refactor (MOB-3288) (#50) (5f7ce58)

Bug Fixes

  • keyset paging survives mediator writes mid-load (#53) (b2dae78)

2.0.0 (2026-05-12)

⚠ BREAKING CHANGES

  • OrderBy changed from a data class to a sealed class. Code that read OrderBy.path or used data-class operations (copy, componentN) must migrate to the new JsonPathOrderBy / CaseOrderBy subclasses.

Features

  • CASE/WHEN value-selection + predicate-dispatch (MOB-1627) (#44) (6b16367)

Bug Fixes

  • docs: repair feature cards, swap in real logo, add CI smoke check (#46) (546bb29)
  • enable pretty permalinks so child pages resolve on GitHub Pages (#43) (8f9b312)
  • keyset paging refresh key returns null on fresh source (#51) (d29e325)
  • Not predicate inverts per-entity (was broken by json_tree row explosion) (#48) (79b6e66)

Dependencies

  • bump kotlin, serialization, paging; refresh tooling and CI actions (#40) (f6148af)

Documentation

  • GitHub Pages site (Jekyll + Just the Docs + Dokka v2) (#42) (0ecfdf5)
  • polish home page, restructure Querying, fix mermaid, link Why Sqkon cards (#45) (ff6b043)

1.3.2 (2026-04-28)

Bug Fixes

  • keyset paging invalidation on empty start + paging docs (#38) (170d437)

1.3.1 (2026-04-15)

Bug Fixes

  • trigger Maven Central deploy from release-please workflow (945bb8b)

1.3.0 (2026-04-15)

Features

  • automate releases with release-please (#34) (077d7d1)

Bug Fixes

  • pin release-please-action to correct SHA for v4.4.1 (#35) (77294aa)