From 1aebef392dc84c89ddfa2bdc89d81c9910ec813c Mon Sep 17 00:00:00 2001 From: luo jiyin Date: Tue, 29 Sep 2026 01:20:17 +0800 Subject: [PATCH] perf(tauri): split schema command registry into crate --- Cargo.lock | 9 ++ Cargo.toml | 2 +- crates/dbx-tauri-schema/Cargo.toml | 9 ++ .../dbx-tauri-schema/src/commands.rs | 2 +- crates/dbx-tauri-schema/src/lib.rs | 93 +++++++++++++++++++ deploy/Dockerfile | 3 +- src-tauri/Cargo.toml | 1 + src-tauri/src/commands/mod.rs | 1 - src-tauri/src/lib.rs | 56 ++--------- 9 files changed, 123 insertions(+), 53 deletions(-) create mode 100644 crates/dbx-tauri-schema/Cargo.toml rename src-tauri/src/commands/schema.rs => crates/dbx-tauri-schema/src/commands.rs (99%) create mode 100644 crates/dbx-tauri-schema/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 120764aa1b..ef4ed28dbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2114,6 +2114,7 @@ dependencies = [ "dbx-core", "dbx-mcp", "dbx-tauri-consul", + "dbx-tauri-schema", "deadpool-postgres", "font-kit", "futures", @@ -2680,6 +2681,14 @@ dependencies = [ "tauri", ] +[[package]] +name = "dbx-tauri-schema" +version = "0.1.0" +dependencies = [ + "dbx-core", + "tauri", +] + [[package]] name = "dbx-types" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 4b25f4fd72..79fa510295 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] resolver = "2" -members = ["src-tauri", "crates/dbx-core", "crates/dbx-driver-agent", "crates/dbx-driver-support", "crates/dbx-driver-elasticsearch", "crates/dbx-driver-mongodb", "crates/dbx-driver-mysql", "crates/dbx-driver-postgres", "crates/dbx-driver-redis", "crates/dbx-driver-sqlserver", "crates/dbx-drivers", "crates/dbx-sql", "crates/dbx-sql-core", "crates/dbx-sql-data", "crates/dbx-sql-dialect", "crates/dbx-sql-schema", "crates/dbx-plugin-runtime", "crates/dbx-formats", "crates/dbx-types", "crates/dbx-platform", "crates/dbx-ai-provider", "crates/dbx-web", "crates/dbx-mcp", "crates/dbx-cli", "crates/dbx-sqlite-worker", "crates/dbx-tauri-consul"] +members = ["src-tauri", "crates/dbx-core", "crates/dbx-driver-agent", "crates/dbx-driver-support", "crates/dbx-driver-elasticsearch", "crates/dbx-driver-mongodb", "crates/dbx-driver-mysql", "crates/dbx-driver-postgres", "crates/dbx-driver-redis", "crates/dbx-driver-sqlserver", "crates/dbx-drivers", "crates/dbx-sql", "crates/dbx-sql-core", "crates/dbx-sql-data", "crates/dbx-sql-dialect", "crates/dbx-sql-schema", "crates/dbx-plugin-runtime", "crates/dbx-formats", "crates/dbx-types", "crates/dbx-platform", "crates/dbx-ai-provider", "crates/dbx-web", "crates/dbx-mcp", "crates/dbx-cli", "crates/dbx-sqlite-worker", "crates/dbx-tauri-consul", "crates/dbx-tauri-schema"] exclude = ["vendor/tauri-plugin-updater", "vendor/ctor", "vendor/dirs-sys", "vendor/pageant", "vendor/rumqttc", "vendor/tiberius", "vendor/webview2-com-sys", "vendor/wry"] [patch.crates-io] diff --git a/crates/dbx-tauri-schema/Cargo.toml b/crates/dbx-tauri-schema/Cargo.toml new file mode 100644 index 0000000000..4a4a58ef58 --- /dev/null +++ b/crates/dbx-tauri-schema/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "dbx-tauri-schema" +version = "0.1.0" +edition = "2021" +rust-version = "1.88.0" + +[dependencies] +dbx-core = { path = "../dbx-core", default-features = false } +tauri = "2.10.3" diff --git a/src-tauri/src/commands/schema.rs b/crates/dbx-tauri-schema/src/commands.rs similarity index 99% rename from src-tauri/src/commands/schema.rs rename to crates/dbx-tauri-schema/src/commands.rs index 259130579f..0328dacf21 100644 --- a/src-tauri/src/commands/schema.rs +++ b/crates/dbx-tauri-schema/src/commands.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use tauri::State; -use crate::commands::connection::AppState; +use dbx_core::connection::AppState; use dbx_core::db; /// Resolve a non-internal catalog for dispatch to the Doris multi-catalog path. diff --git a/crates/dbx-tauri-schema/src/lib.rs b/crates/dbx-tauri-schema/src/lib.rs new file mode 100644 index 0000000000..8f23d1c7c8 --- /dev/null +++ b/crates/dbx-tauri-schema/src/lib.rs @@ -0,0 +1,93 @@ +mod commands; + +macro_rules! define_registry { + ($($command:ident),+ $(,)?) => { + const COMMANDS: &[&str] = &[$(stringify!($command)),+]; + + pub fn invoke_handler() -> impl Fn(tauri::ipc::Invoke) -> bool + Send + Sync + 'static { + tauri::generate_handler![$(commands::$command),+] + } + }; +} + +define_registry![ + list_databases, + list_database_metadata, + list_database_storage, + list_xugu_tablespaces, + get_sqlserver_completion_context, + list_doris_catalogs, + list_doris_catalog_databases, + list_sqlserver_linked_servers, + list_sqlserver_linked_server_catalogs, + list_sqlserver_linked_server_schemas, + list_sqlserver_linked_server_tables, + list_tables, + get_table_comment, + get_mysql_table_auto_increment, + list_objects, + list_object_statistics, + list_completion_objects, + completion_assistant_search, + get_object_source, + get_event_info, + get_custom_type_details, + list_schemas, + list_schema_infos, + list_data_types, + get_columns, + get_plugin_table_metadata, + get_all_columns, + get_sqlserver_column_metadata, + list_indexes, + list_reference_key_columns, + list_reference_keys, + list_foreign_keys, + list_triggers, + list_constraints, + list_partitions, + get_table_partition_status, + get_table_partitioning, + list_invalid_indexes, + list_subpartitions, + get_table_ddl, + list_functions, + list_sequences, + list_rules, + list_owners, + get_table_owner, + list_extensions, + list_available_extensions, + list_event_triggers, +]; + +pub fn handles(command: &str) -> bool { + COMMANDS.contains(&command) +} + +pub fn route( + main_handler: impl Fn(tauri::ipc::Invoke) -> bool + Send + Sync + 'static, +) -> impl Fn(tauri::ipc::Invoke) -> bool + Send + Sync + 'static { + let schema_handler = invoke_handler(); + move |invoke| { + if handles(invoke.message.command()) { + schema_handler(invoke) + } else { + main_handler(invoke) + } + } +} + +#[cfg(test)] +mod tests { + use super::{handles, COMMANDS}; + + #[test] + fn handles_only_schema_commands() { + assert_eq!(COMMANDS.len(), 48); + assert!(handles("list_databases")); + assert!(handles("list_event_triggers")); + assert!(!handles("prepare_schema_diff")); + assert!(!handles("load_connections")); + } +} diff --git a/deploy/Dockerfile b/deploy/Dockerfile index 9e5ad59d67..5aa62c5578 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -59,6 +59,7 @@ COPY crates/dbx-web/Cargo.toml crates/dbx-web/ COPY crates/dbx-mcp/Cargo.toml crates/dbx-mcp/ COPY crates/dbx-cli/Cargo.toml crates/dbx-cli/ COPY crates/dbx-tauri-consul/Cargo.toml crates/dbx-tauri-consul/ +COPY crates/dbx-tauri-schema/Cargo.toml crates/dbx-tauri-schema/ COPY src-tauri/Cargo.toml src-tauri/ # Copy every vendored crate: root Cargo.toml [patch.crates-io] points at # vendor/{ctor,rumqttc,dirs-sys,pageant,wry}; omitting any breaks the offline build. @@ -66,7 +67,7 @@ COPY vendor/ vendor/ RUN for crate in dbx-platform dbx-types dbx-sql dbx-sql-core dbx-sql-data dbx-sql-dialect dbx-sql-schema \ dbx-formats dbx-ai-provider dbx-plugin-runtime dbx-driver-agent dbx-driver-support \ dbx-driver-elasticsearch dbx-driver-mongodb dbx-driver-mysql dbx-driver-postgres \ - dbx-driver-redis dbx-driver-sqlserver dbx-drivers dbx-sqlite-worker dbx-tauri-consul; do \ + dbx-driver-redis dbx-driver-sqlserver dbx-drivers dbx-sqlite-worker dbx-tauri-consul dbx-tauri-schema; do \ mkdir -p "crates/$crate/src" && printf "" > "crates/$crate/src/lib.rs"; \ done \ && echo 'fn main() {}' > crates/dbx-sqlite-worker/src/main.rs diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index b8a639b5e3..1f5660a091 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -73,6 +73,7 @@ zip = "4.6.1" dbx-core = { path = "../crates/dbx-core", default-features = false } dbx-mcp = { path = "../crates/dbx-mcp", default-features = false, features = ["duckdb-sidecar", "mq-admin"] } dbx-tauri-consul = { path = "../crates/dbx-tauri-consul" } +dbx-tauri-schema = { path = "../crates/dbx-tauri-schema" } wry = { path = "../vendor/wry" } axum = { version = "0.8", features = ["ws"] } font-kit = "0.14.3" diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index 122df7f923..14e2761141 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -51,7 +51,6 @@ pub mod redis_cmd; pub mod redis_pubsub_server; pub mod salesforce_oauth; pub mod saved_sql; -pub mod schema; pub mod schema_cache; pub mod schema_diff; pub mod sql_file; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f0008b6dee..3b8f1ed77e 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1454,6 +1454,12 @@ mod tests { } } +fn route_external_commands( + main_handler: impl Fn(tauri::ipc::Invoke) -> bool + Send + Sync + 'static, +) -> impl Fn(tauri::ipc::Invoke) -> bool + Send + Sync + 'static { + dbx_tauri_consul::route(dbx_tauri_schema::route(main_handler)) +} + #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { // Metadata/completion command chains nest very large async futures and can @@ -1804,7 +1810,7 @@ pub fn run() { request_app_close(app, "settings"); } }) - .invoke_handler(migration_gate::guard_handler(dbx_tauri_consul::route(tauri::generate_handler![ + .invoke_handler(migration_gate::guard_handler(route_external_commands(tauri::generate_handler![ commands::ai::ai_complete, commands::ai::ai_stream, commands::ai::ai_agent_stream, @@ -2000,54 +2006,6 @@ pub fn run() { commands::plugins::install_jdbc_plugin, commands::plugins::install_jdbc_plugin_local, commands::plugins::uninstall_jdbc_plugin, - commands::schema::list_databases, - commands::schema::list_database_metadata, - commands::schema::list_database_storage, - commands::schema::list_xugu_tablespaces, - commands::schema::get_sqlserver_completion_context, - commands::schema::list_doris_catalogs, - commands::schema::list_doris_catalog_databases, - commands::schema::list_sqlserver_linked_servers, - commands::schema::list_sqlserver_linked_server_catalogs, - commands::schema::list_sqlserver_linked_server_schemas, - commands::schema::list_sqlserver_linked_server_tables, - commands::schema::list_tables, - commands::schema::get_table_comment, - commands::schema::get_mysql_table_auto_increment, - commands::schema::list_objects, - commands::schema::list_object_statistics, - commands::schema::list_completion_objects, - commands::schema::completion_assistant_search, - commands::schema::get_object_source, - commands::schema::get_event_info, - commands::schema::get_custom_type_details, - commands::schema::list_schemas, - commands::schema::list_schema_infos, - commands::schema::list_data_types, - commands::schema::get_columns, - commands::schema::get_plugin_table_metadata, - commands::schema::get_all_columns, - commands::schema::get_sqlserver_column_metadata, - commands::schema::list_indexes, - commands::schema::list_reference_key_columns, - commands::schema::list_reference_keys, - commands::schema::list_foreign_keys, - commands::schema::list_triggers, - commands::schema::list_constraints, - commands::schema::list_partitions, - commands::schema::get_table_partition_status, - commands::schema::get_table_partitioning, - commands::schema::list_invalid_indexes, - commands::schema::list_subpartitions, - commands::schema::get_table_ddl, - commands::schema::list_functions, - commands::schema::list_sequences, - commands::schema::list_rules, - commands::schema::list_owners, - commands::schema::get_table_owner, - commands::schema::list_extensions, - commands::schema::list_available_extensions, - commands::schema::list_event_triggers, commands::schema_diff::prepare_schema_diff, commands::schema_diff::generate_schema_sync_sql, commands::schema_diff::generate_schema_sync_plan,