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

+62 -25
View File
@@ -116,7 +116,15 @@ pub async fn start_transfer(
}
};
let source_pool_key = match app.get_or_create_pool(&req.source_connection_id, Some(&req.source_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 = match transfer::ensure_transfer_pool(
&app,
&req.source_connection_id,
&req.source_database,
req.source_catalog.as_deref(),
)
.await
{
Ok(k) => k,
Err(e) => {
@@ -125,7 +133,13 @@ pub async fn start_transfer(
return;
}
};
let target_pool_key = match app.get_or_create_pool(&req.target_connection_id, Some(&req.target_database)).await
let target_pool_key = match transfer::ensure_transfer_pool(
&app,
&req.target_connection_id,
&req.target_database,
req.target_catalog.as_deref(),
)
.await
{
Ok(k) => k,
Err(e) => {
@@ -137,19 +151,36 @@ pub async fn start_transfer(
let tables = req.tables.clone();
// Sort by FK dependency so referenced tables are transferred first.
let tables = transfer::sort_tables_by_fk_dependency(
&app,
&req.source_connection_id,
&req.source_database,
&req.source_schema,
&tables,
true,
)
.await
.unwrap_or_else(|e| {
log::warn!("[transfer] failed to sort tables by FK dependency, using original order: {e}");
tables
});
// Skip for external Doris/StarRocks catalogs — the database name does
// not exist in the default catalog and sorting is unnecessary.
let tables = {
let skip_fk_sort = {
let configs = app.configs.read().await;
configs
.get(&req.source_connection_id)
.and_then(|config| {
transfer::resolve_external_transfer_catalog_for_config(req.source_catalog.as_deref(), config)
})
.is_some()
};
if skip_fk_sort {
tables
} else {
transfer::sort_tables_by_fk_dependency(
&app,
&req.source_connection_id,
&req.source_database,
&req.source_schema,
&tables,
true,
)
.await
.unwrap_or_else(|e| {
log::warn!("[transfer] failed to sort tables by FK dependency, using original order: {e}");
tables
})
}
};
let mut failed_tables: Vec<String> = Vec::new();
if matches!(source_db_type, dbx_core::models::connection::DatabaseType::Postgres)
@@ -375,16 +406,22 @@ pub async fn preview_transfer_ownership(
transfer::validate_transfer_target_table_names(&req).map_err(AppError::from)?;
let source_db_type = transfer::get_db_type(&state.app, &req.source_connection_id).await.map_err(AppError::from)?;
let target_db_type = transfer::get_db_type(&state.app, &req.target_connection_id).await.map_err(AppError::from)?;
let source_pool_key = state
.app
.get_or_create_pool(&req.source_connection_id, Some(&req.source_database))
.await
.map_err(AppError::from)?;
let target_pool_key = state
.app
.get_or_create_pool(&req.target_connection_id, Some(&req.target_database))
.await
.map_err(AppError::from)?;
let source_pool_key = transfer::ensure_transfer_pool(
&state.app,
&req.source_connection_id,
&req.source_database,
req.source_catalog.as_deref(),
)
.await
.map_err(AppError::from)?;
let target_pool_key = transfer::ensure_transfer_pool(
&state.app,
&req.target_connection_id,
&req.target_database,
req.target_catalog.as_deref(),
)
.await
.map_err(AppError::from)?;
let preview = transfer::preview_transfer_ownership(
&state.app,
&req,