Commit Graph
90 Commits
Author SHA1 Message Date
miracle 30b9460442 fix(dbx-core): improve duckdb query cancellation 2026-07-04 02:31:32 +08:00
t8y2 69f880fdf1 fix(transfer): preserve target table name case 2026-07-04 00:12:42 +08:00
t8y2 a435c76250 fix(transfer): skip create DDL for existing targets 2026-07-02 00:49:32 +08:00
onenewcode e09ec3cd7a fix(mongo): preserve BSON types in MongoDB-to-MongoDB transfer 2026-07-01 16:31:39 +08:00
onenewcode 7941f30484 fix(postgres): preserve owned sequences during transfer 2026-06-30 17:49:18 +08:00
zipg 4c9a265bdb fix: skip sqlserver rowversion columns during transfer (#2146) 2026-06-29 21:00:54 +08:00
zipg 3c7c1924ba Fix:修复 SQL Server datetime 查询和导出精度 2026-06-29 11:28:33 +08:00
Guoyu Su 7a5984a1fd fix(mongodb): support shell projection and db.version 2026-06-29 00:27:27 +08:00
t8y2 796b0ce5b7 fix(dameng): restore exports with identity columns 2026-06-26 21:25:39 +08:00
dalew d815a16b86 feat(redis): move scan page size to connections 2026-06-26 11:13:34 +08:00
t8y2 54e0393ab3 fix(transfer): preserve PostgreSQL bytea migration 2026-06-26 02:05:49 +08:00
t8y2 2f8672cdef fix(transfer): split postgres table ddl 2026-06-25 21:32:12 +08:00
t8y2 0c0e90ab1a feat(export): add table read cursor sessions 2026-06-25 18:37:04 +08:00
大峰 40c93b9dad feat(connection): add visible schema filtering 2026-06-25 01:36:06 +08:00
t8y2 b5bbdfa5e9 fix(dameng): use fetch pagination for transfer 2026-06-25 01:09:48 +08:00
t8y2 a87e4be029 fix(transfer): format SQL Server bit booleans 2026-06-24 19:54:19 +08:00
t8y2 222584280e fix(schema): support materialized view object source retrieval 2026-06-24 11:25:11 +08:00
t8y2 10019e4cc1 fix(clickhouse): create transfer tables in target database 2026-06-22 18:22:20 +08:00
t8y2 f52064bd0e fix(agent): extend metadata RPC timeout 2026-06-22 18:17:11 +08:00
t8y2 4d55dd0795 fix(transfer): preserve postgres backslash literals 2026-06-20 00:25:53 +08:00
t8y2 ef25653aca feat(transfer): add target table name case option 2026-06-19 12:16:38 +08:00
t8y2 24f67f0498 fix(sqlserver): preserve unicode import literals 2026-06-18 22:56:29 +08:00
t8y2 17f186db26 fix(sqlserver): rebuild pool after driver panic 2026-06-18 13:43:03 +08:00
t8y2 fc8ae4b69f chore(transfer): remove dead query_mysql_create_table_ddl 2026-06-18 13:14:01 +08:00
ptma 7ef6c1022e pref(transfer): prefer native table DDL from source for same-family transfers 2026-06-18 12:40:33 +08:00
t8y2 8de8a85d66 fix(transfer): ClickHouse ORDER BY must cover PRIMARY KEY columns 2026-06-18 10:50:53 +08:00
t8y2 c4c427fb67 fix: sort tables by FK dependency in transfer and export 2026-06-18 00:00:37 +08:00
t8y2 71db24813e fix(informix): add informix_server field to test helpers 2026-06-17 22:59:22 +08:00
t8y2 22b8ba17bb fix(schema): handle view DDL object types 2026-06-17 19:29:24 +08:00
John Jin 6aca7c052f fix(transfer): solve automatic table creation statement
* fix(transfer): solve automatic table creation statement

* fix(transfer):  fix the case issue of tests
2026-06-16 18:03:37 +08:00
t8y2 000c236619 feat(connection): add keepalive interval 2026-06-16 10:23:49 +08:00
t8y2 c57e18bf3e fix: resolve clippy warnings and missing struct fields in tests 2026-06-16 00:55:32 +08:00
John Jin 1afc271c18 feat: add QuestDB support
Thanks @ptma!
2026-06-14 22:58:05 +08:00
t8y2 cbc7f9b0db fix(gbase): support 8a and 8s profiles 2026-06-14 10:16:24 +08:00
t8y2 30afcb8e69 fix(sidebar): page large table groups 2026-06-13 13:40:36 +08:00
t8y2 ef5b6eb654 fix(transfer): preserve MySQL AUTO_INCREMENT and column defaults in cross-instance copy 2026-06-13 08:24:47 +08:00
t8y2 a858a6bd18 feat(mysql): edit foreign keys and triggers 2026-06-12 12:29:46 +08:00
t8y2 8f92eeb638 fix(core): guard BIT literal formatting behind MySQL-compatible db_type 2026-06-10 21:54:10 +08:00
echocde 4389de386d fix(core): properly format MySQL BIT type values as binary literals in export/transfer
Thanks for the fix!
2026-06-10 21:53:02 +08:00
t8y2 a5e1a64247 refactor(sql): split dialect helpers 2026-06-10 19:53:36 +08:00
t8y2 33ab7aeae6 refactor(schema): split metadata providers 2026-06-10 19:10:53 +08:00
t8y2 b6d92f8c38 feat: make duckdb optional behind duckdb-bundled feature 2026-06-10 18:30:14 +08:00
t8y2 d353d4673f feat(redis): add configurable key namespace separator 2026-06-10 17:46:48 +08:00
John Jin 0bd07ccf46 feat: add InfluxDB support (#980) 2026-06-10 14:37:53 +08:00
t8y2 bfec556e9b feat(readonly): add read-only mode for all database connections
- Add read_only field to ConnectionConfig with backward-compatible serde defaults
- SQL classifier with first-keyword + embedded keyword defense layers
- PRAGMA white-listing for safe read-only operations
- Guard all write entry points: SQL, Mongo, Redis, etcd, MCP Bridge
- 16 unit tests covering edge cases (CTE, case insensitivity, string masking)
- 7-language i18n support
- Fast-fail at command/route level before pool creation

Closes #889
2026-06-10 11:58:18 +08:00
runstone a440415e86 feat(readonly): add read-only mode for all database connections
## Background
Add a read-only toggle for database connections that blocks all write
operations (INSERT, UPDATE, DELETE, DROP, etc.) when enabled, allowing
only read queries (SELECT, SHOW, EXPLAIN, etc.). Closes #889.

## Changes

### Data Model
- Added `read_only: bool` field to ConnectionConfig (Rust struct, TS
  interfaces, and ConnectionConfigData deserialization layer)
- Used `#[serde(default, skip_serializing_if = "is_false")]` for
  backward/forward compatibility with existing configs

### Frontend UI
- Added "Read Only" checkbox in connection dialog
- 7-language i18n support (en/es/it/pt-BR/zh-CN/zh-TW)

### SQL Classification (query_execution_sql.rs)
- Added `is_write_sql()` with two-layer defense:
  - Layer 1: First-keyword check (must start with known read keyword)
  - Layer 2: Embedded dangerous keyword detection (catches CTE-wrapped
    writes like `WITH ... AS (DELETE FROM ...)`)
  - `FROM` keyword supported as DuckDB SELECT-less syntax indicator
- Added `check_read_only()` returning descriptive error with connection name
- Added 16 unit tests covering: pure reads/writes, CTE, case insensitivity,
  string literal masking, comment stripping, stored procedure calls, edge cases

### SQL Execution Guards (query.rs / transfer.rs)
- Added `check_read_only_for_connection()` and `_multi()` helper functions
  with lazy name clone (only allocates when read_only is true)
- 6 interception points: `do_execute`, MySQL batch, SQL Server batch,
  DuckDB batch, transaction execution, transfer execution

### Non-SQL Write Guards — Tauri Commands
- Added `ensure_connection_writable()` helper (connection.rs)
- Mongo: 6 write entry points (insert/update/delete, single + batch)
- Redis: 15 write entry points (SET, DEL, HSET, HDEL, LPUSH, LSET, LREM,
  SADD, SREM, ZADD, ZREM, EXPIRE, FLUSHDB, delete_keys, execute_command)
  - execute_command uses RedisCommandSafety classification to allow
    safe read commands through raw command interface
- etcd: 2 write entry points (put, delete)
- sql_file: SQL file execution guarded
- MCP Bridge: 4 write entry points (Insert/Update/Delete/SQL query)

### Non-SQL Write Guards — Web API
- Local `ensure_writable()` helper in each route module
- Redis: 12 write endpoints including classified execute_command
- Mongo: 6 write endpoints
- etcd: 2 write endpoints
- sql_file, table_import, transfer: early rejection

### Test Updates
- Updated ConnectionConfig construction in 7 test files with
  `read_only: false` initialization

## Defense-in-Depth
- Layer 1: Command/Route-level early rejection (saves resources)
- Layer 2: Core SQL classifier (`is_write_sql` — first keyword + embedded scan)
- Layer 3: Core execution-time interception (do_execute/transfer/transaction)
2026-06-10 10:58:52 +08:00
John Jin 354d21d086 feat(grid): 列是否可排序 (#935) 2026-06-09 16:43:53 +08:00
t8y2 2a7b26baad fix: add missing idle_timeout_secs in ConnectionConfig constructors and fix clippy warnings 2026-06-09 11:56:39 +08:00
t8y2 befee2fd4c feat(postgres): support sequence objects 2026-06-08 22:54:14 +08:00
t8y2 e6062b2b07 feat(etcd): add agent-backed etcd support 2026-06-08 00:58:42 +08:00