Skip to content

fix: 補正相容搬移與連線操作的四項驗收缺口 - #43

Merged
NickYCLin merged 5 commits into
masterfrom
fix/follow-up-migration-safety
Oct 14, 2026
Merged

NickYCLin merged 5 commits into
masterfrom
fix/follow-up-migration-safety

Conversation

@NickYCLin

@NickYCLin NickYCLin commented Oct 14, 2026 •

Copy link
Copy Markdown
Collaborator

PR #42 後續四項修正

首輪已合併至 master fa07e2e;這份 PR 僅補正獨立驗收指出的四項缺口,不沿用首輪 CI 當成本輪證據。

  • 降版搬移使用 runtime settings 與既有 OpenMssqlImportSession 工廠,不再重建已移除密碼的 ConnectionString;來源/目標保留 MssqlOwnedSession 的 provider/SSH 所有權。
  • Avalonia 編輯、刪除和連線準備全程共用 operation lease,在入口與每個準備/對話框 await 後檢查忙碌/取消,避免操作重入或取消後斷線。
  • TransferItem 共用 IsComplete/NeedsProcessing,UI 續傳數量與執行選擇不漏掉 Done+Verified=false/null 或 RetryBlocked;阻擋狀態不會被自動重試。
  • 正式 catalog reader 查詢 sys.triggers WHERE parent_class=0;來源與目標有 database DDL trigger(含停用)或查詢失敗皆停止。測試直接餵實際查詢 seam,無 trigger 的相同 fixture 必須能通過預覽。

本輪已執行

  • dotnet build mySQLPunk.CrossPlatform.sln -c Release:0 errors,12 nullable warnings(共用舊版 C# catalog 模型的 nullable 分析)。
  • 跨平台 smoke 31/31:包括 catalog 查詢、雙端 trigger、operation gate 與取消回歸。
  • Mono 編譯正式 migration session:settings factory、來源/目標所有權成功/失敗、target 失敗釋放 source 通過;僅使用注入工廠與 synthetic password。
  • 正式 DataTransferService 隔離 harness:legacy checkpoint、驗證失敗、不確定批次及不重複寫入通過。
  • Linux Xvfb:隔離 HOME/config 與 SQLite fixture,實際連線、SQL 執行、結果網格、開啟/取消編輯及刪除對話框。
  • 新增並實跑 Run-DesktopProfileOperationTests.sh:直接操作正式 Avalonia handlers,合成 pending SQL 驗證忙碌/取消時 edit/delete/connect 都不重入;實際編輯/刪除對話框持有 lease,取消後不存檔也不斷線,閒置時正常編輯/重新連線/刪除仍可用。此回歸已納入 Linux x64 CI。長 SQLite 查詢同步阻塞 UI 的人工截圖不當作 busy handler 證據;以上 handler 回歸才是本輪競態證據。
  • Windows WinForms 實際 DataTransferForm+SQLite 的六組 legacy checkpoint 回歸已由本 PR 最終 head 的 CI 執行,全套 Windows smoke 240/240 通過(run 38505639751)。
  • 最終 head 091d32b 的 Linux x64/ARM64、macOS Intel/Apple Silicon 與 Windows 五項檢查全數成功(跨平台 run 38505639903)。這是本輪 CI,不是 PR 修正批次傳輸與桌面操作安全,新增受限 SQL Server 降版搬移 #42 的結果。

限制

沒有連接使用者真 DB、讀取秘密、傳送 DB 資料、部署或變更權限。真 SQL Server 2016–2025 各版矩陣、實際 SQL authentication 與 SSH tunnel、Windows 搬移人工點擊流程均未測;mock/工廠生命週期驗證不等同真引擎證據。可選範圍與 fail-closed feature 白名單未擴大。

四個修正目的分開繁中 Conventional Commits,另有一筆實際 UI 回歸提交;每次 push 前均已 pull master 確認無新增變更。請依正常 CI/review 流程合併,不略過保護。

已依正常 merge 流程合併至 master d2c4a1a;本機 pull 後核對遠端 SHA 與五筆提交的 ancestor 關係皆一致,工作目錄乾淨。合併後主線的另一次 CI 正在執行,不與已通過的 PR CI 混稱。

原先從已開啟 SqlConnection 的 ConnectionString 重建連線,SQL authentication 預設會隱藏密碼,正常搬移因而無法登入。改從所選端點的記憶體設定呼叫既有匯入工廠,不讀秘密庫、不開啟 PersistSecurityInfo,也不輸出密碼。

來源與目標各自持有 provider/SSH owner;結束時僅釋放 owner,目標開啟失敗也會清理來源。離線 factory 回歸確認端點、SQL 驗證與 SSH 設定傳遞、兩端成功/失敗、重複 Dispose 與來源退場;Mono 執行實際 session 通過,Windows 整體 smoke 交由本輪 PR CI。
編輯、刪除及連線準備從入口到對話框、設定儲存都持有同一個 operation lease,忙碌時拒絕重入,等待完成後再次檢查取消,避免斷開正在使用的 session。補上忙碌、對話框等待、取消與鎖釋放的 mock 回歸;Linux 隔離 SQLite 另走過連線、SQL 結果與取消編輯刪除對話框。
用 IsComplete 與 NeedsProcessing 同時決定服務及 UI 的續傳範圍,避免舊 Done 狀態掩蓋未驗證或 RetryBlocked 項目。UI 會列出待處理項目,但驗證失敗與結果不確定時仍拒絕自動重試。補上 nullable 驗證值與 RetryBlocked 組合、隔離 SQLite 的實際表單續傳及不重複寫入回歸。
資料庫層級 trigger 不在 sys.objects,空目標也可能在建表時執行額外行為。把正式 catalog reader 抽成可注入查詢的 seam,來源與目標都讀 sys.triggers 的 database scope,啟用、停用或 metadata 讀取失敗皆停止。回歸直接驗證實際查詢與預覽阻擋,並確認無 trigger 的相同 fixture 仍可搬移。
原先 gate mock 無法發現 UI handler 漏接 lease,因此新增 Linux Xvfb 回歸,直接呼叫正式編輯、刪除與連線 handlers。等待 SQL 與對話框時驗證互斥,取消後驗證設定和 session 保留,閒置時也必須仍能儲存、重新連線及刪除設定。所有設定與 SQLite 都在新建隔離目錄,CI 會一起執行,失敗回傳非零退出碼。
@NickYCLin
NickYCLin merged commit d2c4a1a into master Oct 14, 2026
5 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