focus-flow/archive/Archived plans/V1_BLOCK_20_SQLite_Persistence_Adapter_Package.md

4.2 KiB
Raw Blame History

V1 Block 20 — SQLite Persistence Adapter Package

Purpose: Implement Drift-based SQLite storage backend.

Note for Codex: Follow tasks exactly; avoid exploratory calls when tasks specify names/files/tests.

Chunk 20.1 — SQLite schema & Drift setup

Recommended level: XHIGH

Status: Complete on 2026-06-26.

Tasks

  1. Create new Dart package packages/scheduler_persistence_sqlite with Drift as dependency.
  2. Define Drift database SchedulerDb with tables: tasks, projects, locked_blocks, settings, snapshots.
  3. Fields: follow domain model; include revision INT, owner_id TEXT.
  4. Add drift migrations using drift_dev build runner; start at schemaVersion=1.
  5. Generate DAO classes via build_runner.

Acceptance criteria

  1. dart run build_runner build --delete-conflicting-outputs completes with zero errors.
  2. Generated drift files checked in.

Completed implementation

  1. Added package packages/scheduler_persistence_sqlite with Drift, drift_dev, and build_runner wiring.
  2. Added SchedulerDb in lib/src/scheduler_db.dart with schemaVersion = 1 and MigrationStrategy(onCreate: createAll).
  3. Added tables for tasks, projects, locked_blocks, locked_overrides, settings, and snapshots.
  4. Included owner scope and optimistic revision columns on mutable rows.
  5. Added generated Drift data classes/accessor mixins in lib/src/scheduler_db.g.dart.
  6. Added a schema smoke test that opens an in-memory Drift database and checks the expected table names.

Verification

  1. dart pub get: passed.
  2. cd packages/scheduler_persistence_sqlite && dart run build_runner build --delete-conflicting-outputs: passed, exit 0; current build_runner warned that the option is ignored.
  3. dart format packages/scheduler_persistence_sqlite: passed.
  4. cd packages/scheduler_persistence_sqlite && dart analyze: passed, no issues found.
  5. dart analyze: passed, no issues found.
  6. cd packages/scheduler_persistence_sqlite && dart test: passed, 1 test.
  7. dart test: passed, 308 tests.

Chunk 20.2 — SQLite adapter implementation & tests

Recommended level: HIGH

Status: Complete on 2026-06-26.

Tasks

  1. Implement SqliteTaskRepository etc mapping domain objects to Drift rows with explicit converters.
  2. Use transaction for multirecord save; ensure optimistic revision by WHERE revision = ? clause.
  3. Add repository conformance tests reused from block19 suite pointed at SQLite adapter (use sqflite_ffi in tests).

Acceptance criteria

  1. SQLite adapter passes full conformance suite with sqflite_ffi on Linux/Windows/mac.
  2. Average write latency in test ≤50ms.

Completed implementation

  1. Added SqliteTaskRepository, SqliteProjectRepository, SqliteLockedBlockRepository, SqliteSettingsRepository, and SqliteScheduleSnapshotRepository.
  2. Mapped Drift rows to domain objects through the existing core document mappers and explicit row/JSON converters.
  3. Implemented duplicate-id checks, owner isolation, deterministic paging, archive behavior, snapshot retention deletion, and typed repository failures.
  4. Implemented optimistic compare-and-set writes/deletes/archives with WHERE revision = expected clauses.
  5. Added SQLite conformance tests using the Block 19 shared suite and an in-memory Drift SQLite executor.
  6. Added a write-latency test for task inserts and wired SQLite tests into the root test wrapper.

Notes

  1. Tests use Drift NativeDatabase.memory() instead of sqflite_ffi. A sqflite-backed Drift executor would require drift_sqflite, which pulls Flutter SDK dependencies into this pure Dart adapter package.
  2. The current repository contracts expose single-record writes. No multi-record repository save method exists yet; future multi-record SQLite writes should use SchedulerDb.transaction.

Verification

  1. dart pub get: passed.
  2. dart format test/scheduler_core_test.dart packages/scheduler_persistence_sqlite: passed.
  3. cd packages/scheduler_persistence_sqlite && dart analyze: passed, no issues found.
  4. cd packages/scheduler_persistence_sqlite && dart test: passed, 9 tests.
  5. dart analyze: passed, no issues found.
  6. dart test: passed, 316 tests.
  7. scripts/test.sh: not present or not executable.