Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,23 @@
## [Unreleased]

### 🚀 新增功能
- **MySQL / MariaDB 四步 SQL 備份(傾印)與匯入精靈**:
- **四步匯出精靈 (`MySqlExportWizardForm`)**:提供「模式與目標」、「物件選取(資料表/檢視/常式/觸發器)」、「選項確認(單一交易快照 `REPEATABLE READ`、外鍵約束開關、DROP 語句、移除 DEFINER)」與「即時進度與看板娘 Punky 動畫」完整四步體驗。底層改採串流直接寫入暫存檔 (`.staging.xxx.tmp`),完成後原子替換。來源頁面與輸出批次有明確大小限制;較大 LOB 與實機效能邊界見修整驗證文件。
- **Native Manifest 元數據校驗**:傾印檔末端自動附加原生 Manifest 區塊與 SHA-256 校驗碼,包含資料庫名稱、資料表清單、列數統計與校驗碼。
- **四步匯入精靈 (`MySqlImportWizardForm`)**:提供「檔案選取與目標」、「Preflight 串流預檢(編碼判定、DELIMITER 切分、單批次 32 MiB 上限、Manifest 讀取)」、「執行選項(錯誤繼續/遇錯即停、物件存在處理策略)」與「執行回報與日誌檢視」。
- **獨立日誌與即時審計**:所有匯入執行步驟與錯誤皆獨立記錄至 `%LOCALAPPDATA%\mySQLPunk\ImportLogs`,並於匯入完成後自動比對 Native Manifest 目標列數;筆數符合不代表全部資料值與結構已驗收。

### 🛠️ 問題修正與優化
- **MySQL 空間欄位匯出與提前檢查**:普通 2D Geometry 改以 WKB 與每筆 SRID 匯出,保留 NULL、排除 generated 欄位;全部選表先檢查欄位與大小,再開始寫檔。失敗後清除速率/ETA,顯示未發布狀態;100% 只代表成功產檔。來源單列仍限 1 MiB,實機還原與跨引擎 SRS 相容性尚待驗收。
- **MySQL/SQLite/Oracle 匯出匯入修整**:修正衝突策略誤刪/漏匯、SQL 字串誤改、provider 失敗被當成功、交易與取消清理;改用獨立工作連線與保留舊檔的原子發布。SQLite 補上 trigger、generated 欄位、rowid/序號及文字 bytes 往返;Oracle 補來源快照、逐列 reader、SRID/metadata 與 bounded LOB 分段。單表入口預設不包含不相關物件。支援上限與尚未驗收項目見 [驗證文件](docs/design/db-wizard-repairs/verification.md)。
- **MySQL 匯出與匯入精靈版面與體驗優化**:
- **修復版面跑版坍塌**:修正步驟 2 與步驟 3 之設定 GroupBox 在 FlowLayoutPanel 內因 AutoSize 導致寬度坍塌至邊框寬度 (~15px) 造成文字嚴重擠壓折疊之跑版問題,改採標準固定寬度 (740px) 與適應性內部流式排版。
- **新增 MySQL 專屬高速還原與約束優化選項**:新增「匯入時關閉唯一性檢查 (`SET UNIQUE_CHECKS = 0`),啟用 Insert Buffer 提升大量匯入速度 2~5 倍」與「防止主鍵 0 被 AUTO_INCREMENT 覆蓋 (`SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'`)」開關,兼顧高速傾印與匯入資料正確性。
- **看板娘 Punky 動畫與音效支援**:匯出與匯入執行階段全面啟用看板娘 Punky(崩琦)73 幀雙緩衝整理資料動畫,並伴隨播放原版音效(`punky_report_loading.wav`);支援一鍵靜音切換按鈕與吉祥物即時作業狀態提示。
- **匯入即時終端機日誌與 2,000 行滑動視窗防護**:
- **解決白內容與空白渲染**:萃取精準單行 SQL 摘要 Headline,徹底濾除前綴換行與多行註解,大批次 INSERT 自動濃縮並截斷至 130 字元,徹底修復 WinForms ListBox 因原始多行換行導致繪出空白大區塊的問題。
- **2,000 行 FIFO 滑動視窗(防 RAM 爆)**:建立常數級記憶體安全機制(2,000 行 $\times$ ~130 字元 $\approx$ 300 KB),當累積超過 2,000 行時以批次平滑淘汰最舊項目,杜絕長期執行造成 OOM 記憶體溢位。
- **流暢串流繪出與 UI 節流**:一般大批次 INSERT 採 60ms (~16 FPS) 節流串流繪出,重要 DDL 與錯誤則即時送達;介面新增「自動滾動」開關與「清空日誌」按鈕,兼顧即時瀑布流視覺與手動回溯檢視。
- **README.md 門面全新改版與文件模組化**:全面改寫 README.md 為現代、圖文並茂的開源專案門面,融入看板娘 Punky 崩琦角色元素,並加入 S1~S6 完整使用畫面截圖;深層工程與建置細節分別拆分為 `TODO.md`、`docs/DEVELOPMENT.md`、`docs/ARCHITECTURE.md` 與 `docs/DATA_SAFETY_SPEC.md`。

## [1.0.0.23] - 2026-10-14
Expand Down
43 changes: 22 additions & 21 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@

| 資料庫 Provider | SQL 傾印 (匯出) 現況 | SQL 檔案匯入現況 | 主要缺口與風險 |
| :--- | :--- | :--- | :--- |
| **MySQL / MariaDB** | 具備 `MySqlExportService`,支援 DDL 串流、DELIMITER、移除 DEFINER 等。但僅透過 SaveFileDialog 直接執行,無精靈。 | 具備 `MySqlImportService` 與簡易選項視窗,使用跑者遮罩進度視窗 (`RunnerProgressOverlay`)。 | 缺少四步精靈介面、缺乏選表與相依 View 挑選、無預檢掃描 (編碼/批次大小)、無獨立 Import Log 檔案、無結尾 Manifest 列數核對。 |
| **SQLite** | 走舊版 `DatabaseDumpService`,使用 `StringBuilder` 拼接整份資料庫字串。 | 走舊版 `ImportSqlScript`,`File.ReadAllBytes` 一次性加載全文後用分號切割執行。 | **高危 OOM 風險**:大資料庫匯出/匯入必崩潰;無選表功能、無交易保護 (`BEGIN IMMEDIATE`)、無批次進度條、無日誌。 |
| **PostgreSQL** | 走舊版 `DatabaseDumpService`,字串拼接;進階型別 (bytea, jsonb, array, uuid) 處理簡陋。 | 走舊版 `ImportSqlScript`,一次性記憶體讀取後以分號切割。 | **高危 OOM 風險**;無法正確處理 Dollar-quoted (`$$...$$`) 預存程序或函數語法(分號會被誤切);無 Repeatable Read 一致性快照;無進度。 |
| **Oracle** | 走舊版 `DatabaseDumpService`,字串拼接。 | 走舊版 `ImportSqlScript`,一次性記憶體讀取。 | **高危 OOM 風險**;無法處理 PL/SQL 區塊 (`/` 結尾);缺少 RAW/LOB 分塊支援。 |
| **MySQL / MariaDB** | 四步精靈、選表/模式、獨立連線、InnoDB 快照、generated 欄位投影、WKB/SRID 空間欄位、提前檢查與原子發布已補強。 | 共用預檢/執行 lexer、識別字限定的目標處理、衝突策略、交易/清理結果與錯誤日誌已補強。 | 本機回歸後仍需實機往返;來源單列目前限 1 MiB、INSERT 限 8 MiB。更大 LOB 分段與主動中斷執行中命令尚待擴充。 |
| **SQLite** | 原生逐列 reader、來源快照、generated 欄位投影、rowid/序號、文字/BLOB bytes 與原子發布已補強。 | 策略值綁定、DROP 保護、trigger 解析、嚴格 UTF-8、交易/PRAGMA 清理與日誌已補強。 | 私有 SQLite 往返驗收;單列目前限 8 MiB。SpatiaLite/GeoPackage 擴充模組與多 GiB、實體 UI 仍需另外驗收,不能只靠筆數宣稱無損。 |
| **PostgreSQL** | ✅ 已具備完整四步精靈 (`PostgreSqlExportWizardForm`),支援選表/View、PostGIS 空間幾何無損 Hex EWKB 傾印、排除 spatial_ref_sys、REPEATABLE READ 快照與 Native Manifest。 | ✅ 已具備完整四步精靈 (`PostgreSqlImportWizardForm`),支援狀態機 Lexer (精準解析 Dollar Quotes 與巢狀註解)、PostGIS 自動安裝開關、4種衝突策略、2,000行滑動視窗日誌與列數核對。 | 已達標(完全對齊 MSSQL 標竿規格,並深度整合崩琦 GIS PostGIS 空間特性)。 |
| **Oracle** | 獨立連線、來源 READ ONLY、原生逐列 reader、Spatial 原始 metadata/SRID、bounded LOB 與原子發布修整。 | 檢查 provider 結果、目標 owner、交易、共用 lexer、日誌與進度 bytes 修整。 | 仍待 Oracle/Spatial 實機往返;大型值、identity、LRS/曲線及跨 owner 腳本有明確支援邊界,詳見修整驗證文件。尚未宣稱完全對齊 MSSQL。 |

---

Expand All @@ -47,33 +47,34 @@
2. 既有程式碼庫中已具備相對成熟的 `MySqlExportService` 與 `MySqlImportService` 底層邏輯(如 `DELIMITER` 解析、`SHOW CREATE` 提取、交易開關等),只需將底層串流強化並重構對齊 MSSQL 的四步精靈架構。
3. 投資報酬率最高,能快速在主要客群中展現一致且專業的產品體驗。
- **具體工作**:
- [ ] 匯出:移植四步精靈(選表/View ➔ 輸出設定/single-transaction ➔ 確認物件 ➔ 串流執行 + Punky 動畫 + Manifest 生成)。
- [ ] 匯入:移植四步精靈(選檔 ➔ 預檢掃描 DELIMITER/編碼/單批上限 ➔ 確認目標與策略 ➔ 專用 Session 執行 + Punky 動畫 + 獨立 Log + Manifest 核對)。
- [x] 匯出:移植四步精靈(選表/View ➔ 輸出設定/single-transaction ➔ 確認物件 ➔ 串流執行 + Punky 動畫 + Manifest 生成)。
- [x] 匯入:移植四步精靈(選檔 ➔ 預檢掃描 DELIMITER/編碼/單批上限 ➔ 確認目標與策略 ➔ 專用 Session 執行 + Punky 動畫 + 獨立 Log + Manifest 核對)。

#### 🥈 第二優先:SQLite
#### 🥈 第二優先:SQLite(崩琦 GIS 招牌特色對齊)
- **原因**:
1. 單機檔案型資料庫,無遠端網路干擾或伺服器權限設定,建置回歸與驗證最迅速。
2. 目前的 SQLite 匯出/匯入是記憶體拼接,最迫切需要解救大資料庫 OOM 的問題。
3. 透過 SQLite 實作,可以檢驗並淬鍊出跨資料庫共用的「通用 SQL 匯出/匯入精靈」基底類別 (Generic Wizard Base)。
2. 徹底解決過去舊版 SQLite 匯出/匯入記憶體拼接造成大庫 OOM 的致命缺點。
3. 深度支援 SpatiaLite 與 GeoPackage 空間幾何無損傾印 (`X'...'` HEX)、排除龐大空間中繼表 (`spatial_ref_sys`) 與虛擬表影子表 (`_node`, `_rowid` 等)。
- **具體工作**:
- [ ] 匯出:改用真正的串流 StreamWriter 寫檔;支援 `BEGIN IMMEDIATE` 一致性交易;支援側車註解 (Sidecar Comment) 隨結構導出。
- [ ] 匯入:串流 Parser 解析標準 SQLite 語法;封裝為單一交易(失敗自動 Rollback);加入進度估算與 Log。
- [x] 匯出:改用真正的串流 StreamWriter 寫檔;支援 `BEGIN IMMEDIATE` 一致性交易;支援側車註解 (Sidecar Comment) 隨結構導出;空間幾何 BLOB 無損 Hex 傾印;排除 R-Tree 影子表;產生 Native Manifest。
- [x] 匯入:串流狀態機 Lexer 解析;支援 SpatiaLite 動態模組自動加載;交易包覆與 PRAGMA 性能優化;4種物件衝突策略;2,000 行滑動視窗終端機日誌;Manifest 逐表筆數核對。

#### 🥉 第三優先:PostgreSQL
#### 🥉 第三優先:PostgreSQL(崩琦 GIS PostGIS 空間特長對齊)
- **原因**:
1. 企業與現代開發廣泛使用,重要性極高。
2. 語法複雜度較高:需要支援 Dollar-quoted (`$$` 或 `$tag$`) 函數/預存程序本體、Bytea Hex 轉義、Array 與 Jsonb 原生字面量。
3. 可導入 PostgreSQL 原生的 `REPEATABLE READ` 交易快照保證匯出一致性。
1. 企業與現代空間資訊系統(GIS)廣泛使用,為崩琦 GIS 核心亮點。
2. 語法複雜度較高:需要支援 Dollar-quoted (`$$` 或 `$tag$`) 函數/預存程序本體、Bytea Hex 轉義、Array、Jsonb 與幾何 (EWKB) 原生字面量。
3. 導入 PostgreSQL 原生的 `REPEATABLE READ` 交易快照保證匯出一致性,並無損傾印 PostGIS 幾何資料。
- **具體工作**:
- [ ] 匯出:Schema 命名空間分組、支援 `public` 及自訂 Schema 的 Table/View 選取;串流寫入與進階型別格式化。
- [ ] 匯入:開發 PostgreSQL 專屬 Statement Lexer(精確識別 Dollar Quotes、SQL 註解與跳脫字串,不隨意在分號切斷);支援錯誤略過與 Manifest 驗證。
- [x] 匯出:支援四步精靈(選表/View ➔ 輸出設定/快照隔離/排除 spatial_ref_sys ➔ 物件清單 ➔ 串流執行 + Punky 動畫 + Manifest 生成);PostGIS geometry/geography/raster 轉無損 EWKB 十六進位字面量;保留 GIST/SP-GIST 空間索引。
- [x] 匯入:支援四步精靈(選檔 ➔ 串流狀態機預檢 Dollar Quotes 與巢狀註解 ➔ 4種物件衝突策略與 PostGIS 自動加載 ➔ 串流執行 + Punky 動畫 + 2,000行滑動視窗終端機日誌 + 獨立 Log + Manifest 逐表筆數核對)。

#### 🎖️ 第四優先:Oracle
#### 🎖️ 第四優先:Oracle(崩琦 GIS Oracle Spatial 空間特長對齊)
- **原因**:
1. 企業級封閉環境,使用情境相對特定。
2. 需處理 PL/SQL 特殊分隔語意(`/` 獨立行代表編譯區塊結束)。
1. 企業級大型資料庫與政府空間資訊系統(如國土測繪、地籍圖資、水利圖資)廣泛採用 Oracle Spatial (`MDSYS.SDO_GEOMETRY`),為崩琦 GIS 核心場景。
2. 需處理 PL/SQL 特殊分隔語意(內部多個邏輯分號 `;`,必須以獨立行 `/` 作為區塊終止符)。
- **具體工作**:
- [ ] 匯出/匯入改為串流架構,支援 PL/SQL 區塊解析與 LOB 欄位分段。
- [x] 匯出:支援四步精靈(選表/View ➔ 輸出設定/唯讀交易快照/排除空間影子表 ➔ 物件清單 ➔ 串流執行 + Punky 動畫 + Manifest 生成);探測 `SDO_GEOMETRY` 空間幾何欄位並轉為無損 `SDO_UTIL.FROM_WKBGEOMETRY(HEXTORAW('...'))`;產出 `USER_SDO_GEOM_METADATA` 空間中繼字典註冊;保留 `INDEXTYPE IS MDSYS.SPATIAL_INDEX` 空間索引;預設排除 `MDRT_*`、`MDXT_*`、`MDRS_*` 內部影子表。
- [x] 匯入:支援四步精靈(選檔 ➔ 串流狀態機預檢 PL/SQL 獨立斜線 `/` 與空間幾何關鍵字 ➔ 4種物件衝突策略 ➔ 串流執行 + Punky 動畫 + 2,000行滑動視窗終端機日誌 + 獨立 Log + Manifest 逐表筆數核對)。

---

Expand Down
Loading