mysqladm/core/protocol/commands/
create_databases.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::json;
5
6use crate::core::{
7    protocol::request_validation::{DbOrUser, NameValidationError, OwnerValidationError},
8    types::MySQLDatabase,
9};
10
11pub type CreateDatabasesRequest = Vec<MySQLDatabase>;
12
13pub type CreateDatabasesResponse = BTreeMap<MySQLDatabase, Result<(), CreateDatabaseError>>;
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16pub enum CreateDatabaseError {
17    SanitizationError(NameValidationError),
18    OwnershipError(OwnerValidationError),
19    DatabaseAlreadyExists,
20    MySqlError(String),
21}
22
23pub fn print_create_databases_output_status(output: &CreateDatabasesResponse) {
24    for (database_name, result) in output {
25        match result {
26            Ok(()) => {
27                println!("Database '{}' created successfully.", database_name);
28            }
29            Err(err) => {
30                println!("{}", err.to_error_message(database_name));
31                println!("Skipping...");
32            }
33        }
34        println!();
35    }
36}
37
38pub fn print_create_databases_output_status_json(output: &CreateDatabasesResponse) {
39    let value = output
40        .iter()
41        .map(|(name, result)| match result {
42            Ok(()) => (name.to_string(), json!({ "status": "success" })),
43            Err(err) => (
44                name.to_string(),
45                json!({
46                  "status": "error",
47                  "error": err.to_error_message(name),
48                }),
49            ),
50        })
51        .collect::<serde_json::Map<_, _>>();
52    println!(
53        "{}",
54        serde_json::to_string_pretty(&value)
55            .unwrap_or("Failed to serialize result to JSON".to_string())
56    );
57}
58
59impl CreateDatabaseError {
60    pub fn to_error_message(&self, database_name: &MySQLDatabase) -> String {
61        match self {
62            CreateDatabaseError::SanitizationError(err) => {
63                err.to_error_message(database_name, DbOrUser::Database)
64            }
65            CreateDatabaseError::OwnershipError(err) => {
66                err.to_error_message(database_name, DbOrUser::Database)
67            }
68            CreateDatabaseError::DatabaseAlreadyExists => {
69                format!("Database {} already exists.", database_name)
70            }
71            CreateDatabaseError::MySqlError(err) => {
72                format!("MySQL error: {}", err)
73            }
74        }
75    }
76}