feat(database): support Doris and StarRocks catalogs

This commit is contained in:
如梦技术 authored and GitHub committed 2026-07-30 16:03:32 +08:00
1 parent b39a0f18a4
commit adb6d86b53
44 files changed
+1330 -242

No files matched your search

+63 -22
View File
@@ -29,27 +29,58 @@ pub async fn start_transfer(
let target_db_type = get_db_type(&state, &request.target_connection_id).await?;
dbx_core::transfer::validate_transfer_target_table_names(&request)?;
// Ensure pools
let source_pool_key =
state.get_or_create_pool(&request.source_connection_id, Some(&request.source_database)).await?;
let target_pool_key =
state.get_or_create_pool(&request.target_connection_id, Some(&request.target_database)).await?;
// External Doris/StarRocks catalogs: pool is created with `catalog=` URL
// setup (SET catalog) and without USE <external-db>. See ensure_transfer_pool.
let source_pool_key = dbx_core::transfer::ensure_transfer_pool(
&state,
&request.source_connection_id,
&request.source_database,
request.source_catalog.as_deref(),
)
.await?;
let target_pool_key = dbx_core::transfer::ensure_transfer_pool(
&state,
&request.target_connection_id,
&request.target_database,
request.target_catalog.as_deref(),
)
.await?;
tokio::spawn(async move {
// Sort tables by FK dependency so referenced tables are transferred first.
let sorted_tables = dbx_core::transfer::sort_tables_by_fk_dependency(
&state,
&request.source_connection_id,
&request.source_database,
&request.source_schema,
&request.tables,
true,
)
.await
.unwrap_or_else(|e| {
log::warn!("[transfer] failed to sort tables by FK dependency, using original order: {e}");
request.tables.clone()
});
// Skip for external Doris/StarRocks catalogs — the database name does not
// exist in the default catalog and sorting is unnecessary (no FK constraints).
let sorted_tables = {
let skip_fk_sort = {
let configs = state.configs.read().await;
configs
.get(&request.source_connection_id)
.and_then(|config| {
dbx_core::transfer::resolve_external_transfer_catalog_for_config(
request.source_catalog.as_deref(),
config,
)
})
.is_some()
};
if skip_fk_sort {
request.tables.clone()
} else {
dbx_core::transfer::sort_tables_by_fk_dependency(
&state,
&request.source_connection_id,
&request.source_database,
&request.source_schema,
&request.tables,
true,
)
.await
.unwrap_or_else(|e| {
log::warn!("[transfer] failed to sort tables by FK dependency, using original order: {e}");
request.tables.clone()
})
}
};
let total_tables = sorted_tables.len();
log::info!("[transfer] starting transfer_id={} tables={}", transfer_id, total_tables);
@@ -291,10 +322,20 @@ pub async fn preview_transfer_ownership(
let source_db_type = get_db_type(&state, &request.source_connection_id).await?;
let target_db_type = get_db_type(&state, &request.target_connection_id).await?;
dbx_core::transfer::validate_transfer_target_table_names(&request)?;
let source_pool_key =
state.get_or_create_pool(&request.source_connection_id, Some(&request.source_database)).await?;
let target_pool_key =
state.get_or_create_pool(&request.target_connection_id, Some(&request.target_database)).await?;
let source_pool_key = dbx_core::transfer::ensure_transfer_pool(
&state,
&request.source_connection_id,
&request.source_database,
request.source_catalog.as_deref(),
)
.await?;
let target_pool_key = dbx_core::transfer::ensure_transfer_pool(
&state,
&request.target_connection_id,
&request.target_database,
request.target_catalog.as_deref(),
)
.await?;
dbx_core::transfer::preview_transfer_ownership(
&state,