Skip to content

feat(app): add the drift database with schema v1 - #179

Merged
1morr merged 3 commits into
mainfrom
feat/drift-schema
Sep 29, 2026
Merged

1morr merged 3 commits into
mainfrom
feat/drift-schema

Conversation

@1morr

@1morr 1morr commented Sep 29, 2026

Copy link
Copy Markdown
Owner

內容

M1 PR 5:drift 最小 schema 與 TrackKey(ADR 0010 §決定 1–3;.trellis/tasks/archive/2026-09/09-29-drift-schema/prd.md)。

  • 開庫方式:drift 2.35 加 sqlite3 3.6(build hooks),用 NativeDatabase.createInBackground。
    • 沒用已 EOL 的 sqlite3_flutter_libs,也沒用依賴它的 drift_flutter。
    • 資料庫檔是平台層資料目錄下的 fmp.db,每次開啟都執行 PRAGMA foreign_keys = ON。
  • Schema v1:
    • appearance_settings:單列,欄位為空表示沒設定過(ADR 0011)。
    • installed_plugins。
    • plugin_storage:外鍵 ON DELETE CASCADE,刪插件時一併刪除。
  • Repository:只提供 M1 用得到的操作,不對外露出 drift 的 row 型別。更新插件用 insertOnConflictUpdate,因為 REPLACE 會觸發 cascade,把 storage 一起刪掉。
  • 快照與產生碼:
    • 以 make-migrations 存 v1 快照。schema_test 比對程式碼的 schema 與最新快照,含「多一欄就失敗」的反例。
    • 產生的 *.g.dart 提交進 repo,CI 檢查它是最新的。舊專案把產生碼 gitignore,新 worktree 因此常出現像原始碼錯誤的「missing getter」。
  • TrackKey:照舊版原樣搬,寫死字面值測試。它是持久化格式,M5 匯入舊資料要靠它對上。
  • 開檔失敗:顯示錯誤頁,不在半開的資料庫上啟動(ADR 0010 §決定 3)。

isar/sqlite3 共存探針(phase2-plan §7,未合併程式碼)

  • isar_community 3.3.2 與 sqlite3 3.6.0 在兩個平台都能共存,各自讀寫成功:
    • Android:debug、release,在 16KB 頁的模擬器上跑;
    • Windows。
  • Android 所有 .so 的 LOAD 段 p_align ≥ 0x4000,zipalign -c -P 16 通過。
  • 結論寫在 ADR 0010 與 .trellis/tasks/09-28-m1-skeleton-tracer/research/isar-sqlite3-coexistence.md:不需要 ADR 0010 的退路。
  • 另一個發現:Isar generator 與 workspace 的 analyzer 版本衝突,M5 要在 workspace 外產生程式碼。

Review 指南

  • .trellis/spec/app/data/index.md 的 migration 步驟:
    • 關外鍵後,在同一個交易裡依序跑 runMigrationSteps、foreign_key_check、user_version,最後再開外鍵。
    • 原因:drift 不會自動把 onUpgrade 包進交易,而且在交易外才寫 user_version。檢查代理依 drift 原始碼修正了這段,才做得到「失敗整個回滾」。
  • 第一次建置或測試要能連 GitHub:sqlite3 hooks 會下載預編譯的 SQLite。

驗證

  • app/:
    • format 通過;
    • codegen 從零重跑後沒有變動;
    • dart analyze --fatal-infos、flutter analyze 乾淨;
    • flutter test:76 過、1 跳過(live);
    • 哨兵通過。
  • 手動變異:拿掉 foreign_keys = ON 會讓 4 個測試變紅;把 install 改成 insertOrReplace 會讓「更新保留 storage」變紅。
  • 實機:
    • Windows dev 版建立 userdata-dev\fmp.db,畫面正常;
    • Android 模擬器 dev 版建立 files/fmp.db。

Generated code is committed and CI checks it is current, so a fresh
checkout builds without a codegen step. TrackKey is ported unchanged
because legacy import keys on it.
@1morr
1morr merged commit 525667b into main Sep 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant