fix(connection): hide system database objects

This commit is contained in:
t8y2
2026-05-09 19:50:28 +08:00
parent 9c71442f43
commit afb177db85
9 changed files with 195 additions and 29 deletions
+8 -1
View File
@@ -80,7 +80,14 @@ pub async fn test_connection(client: &ChClient) -> Result<(), String> {
}
pub async fn list_databases(client: &ChClient) -> Result<Vec<DatabaseInfo>, String> {
let result = ch_query(client, "SELECT name FROM system.databases ORDER BY name", None).await?;
let result = ch_query(
client,
"SELECT name FROM system.databases \
WHERE name NOT IN ('system', 'INFORMATION_SCHEMA', 'information_schema') \
ORDER BY name",
None,
)
.await?;
Ok(result.data.iter().map(|row| DatabaseInfo { name: row[0].as_str().unwrap_or("").to_string() }).collect())
}
+5 -1
View File
@@ -53,7 +53,11 @@ fn normalize_database(database: &str) -> &str {
pub async fn list_databases(client: &mut GaussdbClient) -> Result<Vec<DatabaseInfo>, String> {
let rows = client
.query_single_column("SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname")
.query_single_column(
"SELECT datname FROM pg_database \
WHERE datistemplate = false AND datallowconn = true \
ORDER BY datname",
)
.await?;
Ok(rows.into_iter().map(|name| DatabaseInfo { name }).collect())
}
+8 -4
View File
@@ -183,10 +183,14 @@ pub async fn connect_bare(url: &str) -> Result<MySqlPool, String> {
}
pub async fn list_databases(pool: &MySqlPool) -> Result<Vec<DatabaseInfo>, String> {
let rows: Vec<MySqlRow> = sqlx::raw_sql("SELECT SCHEMA_NAME FROM information_schema.SCHEMATA ORDER BY SCHEMA_NAME")
.fetch_all(pool)
.await
.map_err(|e| e.to_string())?;
let rows: Vec<MySqlRow> = sqlx::raw_sql(
"SELECT SCHEMA_NAME FROM information_schema.SCHEMATA \
WHERE SCHEMA_NAME NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys') \
ORDER BY SCHEMA_NAME",
)
.fetch_all(pool)
.await
.map_err(|e| e.to_string())?;
Ok(rows.iter().map(|row| DatabaseInfo { name: get_str(row, 0) }).collect())
}
+8 -4
View File
@@ -153,10 +153,14 @@ fn validate_postgres_ssl_paths(url: &str) -> Result<(), String> {
}
pub async fn list_databases(pool: &PgPool) -> Result<Vec<DatabaseInfo>, String> {
let rows: Vec<PgRow> = sqlx::query("SELECT datname FROM pg_database WHERE datistemplate = false ORDER BY datname")
.fetch_all(pool)
.await
.map_err(|e| e.to_string())?;
let rows: Vec<PgRow> = sqlx::query(
"SELECT datname FROM pg_database \
WHERE datistemplate = false AND datallowconn = true \
ORDER BY datname",
)
.fetch_all(pool)
.await
.map_err(|e| e.to_string())?;
Ok(rows.iter().map(|row| DatabaseInfo { name: row.get::<String, _>("datname") }).collect())
}
+28 -5
View File
@@ -75,7 +75,17 @@ fn row_to_json(row: &tiberius::Row) -> Vec<serde_json::Value> {
}
pub async fn list_databases(client: &mut SqlServerClient) -> Result<Vec<DatabaseInfo>, String> {
let stream = client.query("SELECT name FROM sys.databases ORDER BY name", &[]).await.map_err(|e| e.to_string())?;
let stream = client
.query(
"SELECT name \
FROM sys.databases \
WHERE database_id > 4 \
AND state = 0 \
ORDER BY name",
&[],
)
.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())
}
@@ -83,9 +93,16 @@ pub async fn list_databases(client: &mut SqlServerClient) -> Result<Vec<Database
pub async fn list_schemas(client: &mut SqlServerClient) -> Result<Vec<String>, String> {
let stream = client
.query(
"SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA \
WHERE SCHEMA_NAME NOT IN ('guest','INFORMATION_SCHEMA','sys') \
ORDER BY SCHEMA_NAME",
"SELECT s.name \
FROM sys.schemas s \
WHERE s.name NOT IN ('guest','INFORMATION_SCHEMA','sys') \
AND EXISTS ( \
SELECT 1 FROM sys.objects o \
WHERE o.schema_id = s.schema_id \
AND o.type IN ('U','V') \
AND o.is_ms_shipped = 0 \
) \
ORDER BY CASE WHEN s.name = 'dbo' THEN 0 ELSE 1 END, s.name",
&[],
)
.await
@@ -96,7 +113,13 @@ pub async fn list_schemas(client: &mut SqlServerClient) -> Result<Vec<String>, S
pub async fn list_tables(client: &mut SqlServerClient, schema: &str) -> Result<Vec<TableInfo>, String> {
let sql = format!(
"SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{}' ORDER BY TABLE_NAME",
"SELECT o.name, CASE WHEN o.type = 'V' THEN 'VIEW' ELSE 'BASE TABLE' END \
FROM sys.objects o \
JOIN sys.schemas s ON s.schema_id = o.schema_id \
WHERE s.name = '{}' \
AND o.type IN ('U','V') \
AND o.is_ms_shipped = 0 \
ORDER BY o.name",
schema.replace('\'', "''")
);
let stream = client.query(&*sql, &[]).await.map_err(|e| e.to_string())?;