feat(desktop): add connection-level database browser

This commit is contained in:
二丫讲梵 authored and GitHub committed 2026-08-12 02:20:05 +08:00
1 parent 44dbd0e0e7
commit fee3ed1d5a
46 files changed
+781 -29

No files matched your search

+42 -2
View File
@@ -1722,7 +1722,47 @@ pub async fn list_databases(client: &mut SqlServerClient) -> Result<Vec<Database
.await
.map_err(|e| e.to_string())?;
let rows = stream.into_first_result().await.map_err(|e| e.to_string())?;
Ok(rows.iter().map(|row| DatabaseInfo { name: row.get::<&str, _>(0).unwrap_or("").to_string() }).collect())
Ok(rows
.iter()
.map(|row| DatabaseInfo { name: row.get::<&str, _>(0).unwrap_or("").to_string(), ..Default::default() })
.collect())
}
pub async fn list_database_metadata(client: &mut SqlServerClient) -> Result<Vec<DatabaseInfo>, String> {
let rows = match list_database_metadata_rows(client).await {
Ok(rows) => rows,
Err(error) => {
log::debug!("Falling back to database names after metadata query failed: {error}");
return list_databases(client).await;
}
};
Ok(rows
.iter()
.map(|row| DatabaseInfo {
name: row.get::<&str, _>(0).unwrap_or("").to_string(),
created_at: row.get::<chrono::NaiveDateTime, _>(1).map(|value| value.to_string()),
default_collation: row.get::<&str, _>(2).map(str::to_string).filter(|value| !value.trim().is_empty()),
size_bytes: row.get::<i64, _>(3),
..Default::default()
})
.collect())
}
async fn list_database_metadata_rows(client: &mut SqlServerClient) -> Result<Vec<Row>, String> {
let stream = client
.query(
"SELECT d.name, d.create_date, d.collation_name, \
SUM(COALESCE(CONVERT(bigint, f.size), 0)) * 8192 AS size_bytes \
FROM sys.databases d \
LEFT JOIN sys.master_files f ON f.database_id = d.database_id \
WHERE d.state = 0 \
GROUP BY d.name, d.create_date, d.collation_name \
ORDER BY d.name",
&[],
)
.await;
let stream = stream.map_err(|error| error.to_string())?;
stream.into_first_result().await.map_err(|error| error.to_string())
}
pub async fn get_completion_context(client: &mut SqlServerClient) -> Result<SqlServerCompletionContext, String> {
@@ -1776,7 +1816,7 @@ pub async fn list_linked_server_catalogs(
Ok(rows
.iter()
.filter_map(|row| row.get::<&str, _>(0).map(str::trim).filter(|name| !name.is_empty()))
.map(|name| DatabaseInfo { name: name.to_string() })
.map(|name| DatabaseInfo { name: name.to_string(), ..Default::default() })
.collect())
}