tea_orm/queries/
list_databases.rs

1use anyhow::Context;
2use anyhow::Result;
3use sea_orm::query::ConnectionTrait;
4use sea_orm::query::Statement;
5use sea_orm::DatabaseConnection;
6use sea_orm::DbBackend;
7
8pub async fn query_list_databases(db_connection: &DatabaseConnection) -> Result<Vec<String>> {
9    let db_backend = db_connection.get_database_backend();
10    let list_databases_statement = create_list_databases_statement(db_backend);
11
12    let results = db_connection
13        .query_all(list_databases_statement)
14        .await
15        .with_context(|| format!("Trying to list all databases"))?;
16
17    let database_names: Vec<String> = results
18        .into_iter()
19        .map(|row_result| {
20            let database_name = row_result
21                .try_get::<String>("", "database_name")
22                .expect("expect `database_name` to be present in SQL Query results");
23
24            database_name
25        })
26        .collect();
27
28    Ok(database_names)
29}
30
31fn create_list_databases_statement(db_backend: DbBackend) -> Statement {
32    match db_backend {
33        DbBackend::Postgres => Statement::from_string(
34            db_backend,
35            "SELECT datname AS database_name FROM pg_database
36          WHERE datistemplate = false"
37                .to_string(),
38        ),
39        _ => {
40            unimplemented!("Unsupported db backend used")
41        }
42    }
43}
44
45#[cfg(test)]
46mod query_list_databases {
47    use crate::new_database_connection;
48    use crate::queries::query_create_random_database;
49    use crate::queries::query_list_databases;
50
51    const POSTGRES_LOCAL_DB_URL: &'static str = &"postgres://user:password@localhost:5432/tea-orm";
52
53    #[tokio::test]
54    async fn is_should_list_the_current_number_of_dbs_after_creation() {
55        let db_connection = new_database_connection(POSTGRES_LOCAL_DB_URL.to_string())
56            .await
57            .unwrap();
58        let dbs = query_list_databases(&db_connection).await.unwrap();
59        let new_database_name = query_create_random_database(&db_connection).await.unwrap();
60        let new_dbs = query_list_databases(&db_connection).await.unwrap();
61
62        // We expect the number of databases to have increased,
63        // since I just made one above.
64        //
65        // However it's possible another test also created a DB at the same time.
66        // Resulting in it going up at more than 1.
67        assert_eq!(dbs.contains(&new_database_name), false);
68        assert!(dbs.len() < new_dbs.len());
69        assert_eq!(new_dbs.contains(&new_database_name), true);
70    }
71}