Skip to content

Kiến trúc cho lập trình viên ​

Mã nguồn viết bằng Zig 0.17, không dùng C (@cImport, file .c). Mỗi file tối đa 600 dòng. Xem thêm CLAUDE.md ở thư mục gốc.

Luồng chính ​

text
main.zig           những gì các cửa sổ dùng chung: store, máy chủ MCP
 └─ app_window.Win  một cửa sổ, chứa nhiều Session
     ├─ Welcome     danh sách kết nối
     └─ Session     không gian làm việc của một kết nối
         ├─ session_sidebar.zig   thanh bên
         ├─ session_tabs.zig      thanh tab
         └─ Tab: TableTab, QueryTab, KeyTab, Dashboard, ...

Mỗi khung hình là một chuỗi lời gọi view(c: *ui.Context) đi xuống cây. Giao diện dạng immediate mode: view trả về điều người dùng đã làm, thay vì gọi ngược lên trên.

Lớp driver ​

driver.zig định nghĩa giao diện chung: Conn với VTable, ResultSet với ô dạng văn bản, Kind, Dialect.

Để thêm một engine, viết một file driver cài đặt Conn.VTable, rồi thêm vào Kind và connect.open.

masking.zig bọc một Conn để áp luật che lên mọi kết quả. Nó phải chuyển tiếp mọi mục tùy chọn của VTable.

Các driver mạng đọc và ghi qua transport.zig, gồm TCP và TLS của std.crypto. Tunnel không cần driver biết đến: ssh_tunnel.zig và socks_tunnel.zig mở một cổng cục bộ, và driver kết nối tới cổng đó.

Trạng thái dùng chung ​

Env trong env.zig là những gì mọi tab của một session dùng chung: connection, store, toast, cửa sổ. Hãy dùng Env.run hoặc Env.exec để câu lệnh được ghi vào lịch sử.

Chạy nền ​

worker.zig chạy câu lệnh của tab query trên một luồng và gửi kết quả về luồng chính qua plugin mainthread. Một tab query dùng kết nối riêng khi connect.canOpenTwice cho phép.

Các module theo tính năng ​

Tính năngFile
Lướigrid.zig, grid_menu.zig, grid_frozen.zig, grid_marks.zig, grid_find.zig, grid_summary.zig
Bảngtable_tab.zig, table_actions.zig, filter_bar.zig, changes.zig, fk_picker.zig, highlight_view.zig
Queryquery_tab.zig, query_results.zig, query_params.zig, explain_plan.zig, result_compare.zig
Trình soạncompletion.zig, sqlformat.zig, editor_tools.zig, vim.zig, editor_keys.zig, keymap.zig
Dữ liệuformats.zig, xlsx.zig, parquet.zig, data_file.zig, data_open.zig, export_view.zig, import_view.zig, transfer.zig, transfer_ddl.zig, backup.zig, test_rows.zig
Kết nốiconnect.zig, connect_job.zig, ssh_tunnel.zig, socks_tunnel.zig, conn_url.zig, conn_import.zig, welcome.zig, welcome_tunnel.zig
An toànsafety.zig, masking.zig
Công cụobject_sql.zig, db_search.zig, er_view.zig, dashboard_sql.zig, data_dictionary.zig, join_builder.zig
AI, MCPai_client.zig, ai_view.zig, ai_commands.zig, mcp_server.zig
Dòng lệnhcli.zig

Kiểm thử ​

sh
zig build test    # toàn bộ test
zig build         # luôn chạy cả lệnh này, test build không biên dịch code chỉ có trong app

Test được tìm qua khối test { _ = @import(...) } ở cuối src/main.zig. File mới có test phải được thêm vào đó.

Test cần database dùng SQLite :memory:, và trả về error.SkipZigTest nếu thiếu thư viện. Driver mạng được kiểm tra với máy chủ giả lập trong tiến trình (pg_test.zig, mysql_test.zig...).

Kiểm tra giao diện không mở cửa sổ:

sh
zig-out/bin/mydatabase --myzig-snapshot=shot.png --myzig-script="click:Open Sample Database;click:customers"

Luôn dùng cờ snapshot khi kiểm tra

Chạy exe mà không có --myzig-snapshot sẽ mở app thật, và app có thể tự kết nối lại kết nối cuối cùng của bạn.

Tài liệu này ​

Nằm trong docs/, dùng VitePress:

sh
cd docs
npm install
npm run dev      # xem trực tiếp
npm run build    # kết quả ở docs/.vitepress/dist