Skip to content

feat: 分階段加入雙向跨版本與可驗證跨引擎邏輯搬移 - #45

Merged
NickYCLin merged 3 commits into
masterfrom
feat/verified-relational-migration
Oct 14, 2026
Merged

NickYCLin merged 3 commits into
masterfrom
feat/verified-relational-migration

Conversation

@NickYCLin

Copy link
Copy Markdown
Collaborator

這次範圍

延續已合併 PR #42、#43、#44,不重做四項補正。SQLite SQL 背景執行與真正取消已在 #44 合入;這次加入分階段搬移功能。

  • Windows SQL Server 專用工具開放 2016–2025 雙向及同版本,共 25 組預檢/交易 mock;既有型別、定序、catalog、空目標、交易和內容驗證仍保留,並非只調整版本條件後宣稱任意資料可搬。
  • Avalonia 新增 SQLite STRICT ↔ PostgreSQL 邏輯搬移(同引擎方向亦可),只忠實轉換 INTEGER/bigint、BLOB/bytea、NULL/NOT NULL。
  • 正式 catalog 與完整 SQLite CREATE grammar 預檢;鍵、索引、預設值、identity/sequence、trigger/procedure、文字定序、時間/decimal、schema 相依等無法忠實轉換即拒絕,不靜默漏物件。PostgreSQL 額外阻擋 event trigger、large object、publication/subscription 及自訂物件。
  • 實際版本/來源內容 fingerprint、SQL/data 預覽、完整目標名稱確認;只寫入事先另建的新空目標,單一交易分批、型別/NULL/內容 SHA-256 多重集合驗證。取消等待真實工作停止,commit ack 遺失/回滾不確定禁止盲重試,沒有逐表續寫。
  • 連線沿用設定工廠與獨立 SSH owner;不讀秘密庫,不從 redacted ConnectionString 重建。UI 持有工作台 gate,目標或認證變更使預覽失效。

已實際驗證

  • Linux Release 跨平台 build:0 errors;既有 nullable/本機 analyzer 版本警告保留。
  • 全部 smoke 33/33 通過,包含 25 組 SQL Server mock、真 SQLite 1005 列/極值/bytes/NULL/duplicates、部分寫入 rollback、途中取消、同列數來源變更、內容/schema fault、真正 commit 後注入 ack lost。
  • 隔離 Xvfb 正式 Avalonia handlers:20 項檢查+完成摘要,涵蓋真 SQLite 長計算時 UI tick、SQL 重複點擊、busy edit/delete/connect、Cancel gate、取消後查詢,以及搬移預覽/變更失效/錯誤確認/真正寫入/防重複。
  • Auto release policy 隔離測試通過;未觸發發布。
  • 新增既有 PostgreSQL 16 CI fixture 的 SQLite→PostgreSQL→SQLite 實際內容與正式 catalog 逐项 feature 回歸;此 PR CI 完成後再補精確結果,尚不預先宣稱通過。

明確限制

SQLite 本機實測 3.53.3;SQLite 3.37–3.52 歷史 minor、PostgreSQL 14/15/17、SQL Server 真跨版本與 SQL auth+SSH 真機皆未完成矩陣。MySQL/MariaDB 的 implicit-commit DDL 需不同 staging/恢復設計,未加入此 verified 路徑;SQL Server 與其他引擎、Oracle/Snowflake、MongoDB/Redis/Garnet 也未支援,服務連線前拒絕。不是任何資料庫任意版本無損 restore,也不是無限制 bacpac 降版。

詳見 docs/LOGICAL_MIGRATION_MATRIX.md。來源需隔離副本/維護時段;工具 advisory lock 不等於其他管理者會遵守它。沒有連使用者真 DB、沒有正式部署。

發布準備

建議下一版 1.0.0.23,但等待整輪獨立驗收、待發布精確 SHA CI 與最終發布指示。本 PR 不改版號、不打 tag、不加 Release-Now、不 dispatch force;九資產及既有簽章流程不變。

原先只接受新引擎搬到舊引擎,讓相同結構的升版與同版本搬移也被拒絕。保留型別白名單、同定序、空目標與交易內容驗證,開放 2016–2025 的雙向組合,並調整 Windows 入口名稱。

補上 25 組預檢和交易 mock;這不代表真實跨版本矩陣已通過,也不改變新版備份不能原生還原到舊引擎的限制。
一般資料傳輸與 SQL 對映無法保證跨引擎結構、內容和重試安全,所以另加受限搬移入口。第一階段只接受 STRICT INTEGER/BLOB 與 bigint/bytea、NULL/NOT NULL;正式 catalog 發現鍵、索引、預設值、觸發器等不支援語意就拒絕,不靜默漏掉物件。

預覽固定來源內容與實際版本,確認完整新空目標後重新預檢,分批寫入單一交易,再校驗型別、結構與內容多重集合。取消等待實際停止;提交結果不確定時禁止盲重試。獨立連線沿用設定工廠及 SSH owner,沒有從已隱去密碼的連線字串重建。

本機 33/33 smoke 與正式 Avalonia handlers 回歸通過,涵蓋真 SQLite 部分寫入回滾、取消、真正提交後 ack 遺失及 UI gate。另加入既有隔離 PostgreSQL 16 CI fixture 的雙向內容及 catalog 回歸;歷史版本與真 SQL Server 跨版本矩陣尚未驗證。
整理 1.0.0.23 候選版號、受限搬移說明與建置證據,避免把 mock 當完整真機矩陣。發布仍須這輪獨立驗收和精確 SHA CI;沿用既有原子版更、九資產與簽章流程,本次不改版號、不打 tag,也不觸發發布。
@NickYCLin

Copy link
Copy Markdown
Collaborator Author

精確 head 31e9bc3a233e763752c8a7afd7023e77cebe283c 驗證完成:Windows Desktop run 38510120643 全部成功;Cross-platform Desktop run 38510120594 的 Linux x64/ARM64、macOS Intel/Apple Silicon 全部成功。四架構基本 smoke 33/33;Linux x64 既有隔離 live fixture smoke 56/56,包含新增 SQLite→PostgreSQL 16→SQLite 的真實內容校驗與 catalog feature 增加/移除回歸。正式 Avalonia handler 回歸與打包/安裝/更新/rollback 的既有 CI 也通過。

另外以審查者提供的 Review.csproj 與隔離 fixture 複製品,搭配本次 Core DLL 重跑暖機後 5,000,000 次 recursive 查詢:ExecuteAsync 呼叫 0ms 返回且 task 未完成,53ms 觀察取消。沒有改動原始審查 fixture。

仍未測 SQL Server 25 組真跨版本矩陣、Windows MSSQL 搬移器 SQL auth+SSH 真機、PostgreSQL 14/15/17 與 SQLite 歷史 minor。既有 provider 的 SQL Server TLS/SSH live 通過不代替 MSSQL 搬移矩陣。本輪獨立驗收與發布最終指示仍待外部核對;現在不發布、不版更。

@NickYCLin
NickYCLin merged commit a5c5718 into master Oct 14, 2026
5 checks passed
@NickYCLin

Copy link
Copy Markdown
Collaborator Author

合併後主線精確 SHA a5c5718a1c7036dfdaf99705559e1a8ab7431855 的再次驗證全部成功:Windows Desktop 38510752403、四架構 Cross-platform Desktop 38510752478。Auto Release Gate 38510752425 明確回報是否發布=false,版本仍 v1.0.0.22,沒有觸發 release。遠端 master 已含 #44 的 SQLite 修復與本 PR 三個目的分開的提交,本機 master 已 fast-forward 同步且乾淨。發布候選 1.0.0.23 只完成準備,仍等待整輪獨立驗收與同一工作階段的最終發布指示。

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