MySQL Datenbank und Benutzer anlegen mit Rust

Dieses Programm erstellt eine MySQL-Datenbank und einen Benutzer mit Zugriff ausschließlich auf diese Datenbank, ohne globale Rechte.

Falls Benutzer oder Datenbank bereits existieren, werden sie gelöscht und neu erstellt.

Cargo.toml

[dependencies]
mysql = "24.0"

main.rs

// Importiere notwendige Bibliotheken
use mysql::prelude::*;
use mysql::{Opts, OptsBuilder, Pool};

// Hauptfunktion
fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Sammle die Befehlszeilenargumente
    let args: Vec<String> = std::env::args().collect();
    
    // Überprüfe, ob die richtige Anzahl von Argumenten vorhanden ist
    if args.len() != 4 {
        // Zeige eine Nachricht zur korrekten Verwendung an
        eprintln!("Verwendung: {} <BENUTZERNAME> <DATENBANKNAME> <PASSWORT>\n\n\
        Dieses Programm erstellt eine MySQL-Datenbank und einen Benutzer mit\n\
        Zugriff ausschließlich auf diese Datenbank, ohne globale Rechte.\n\n\
        Falls Benutzer oder Datenbank bereits existieren, werden sie gelöscht und neu erstellt.", args[0]);

        // Beende das Programm mit einem Fehlercode
        std::process::exit(1);
    }

    // Extrahiere die Befehlszeilenargumente für Benutzername, Datenbankname und Passwort
    let benutzername = &args[1];
    let datenbankname = &args[2];
    let passwort = &args[3];

    // Setze das Root-Passwort für MySQL (Anpassen notwendig)
    let root_passwort = "mysql-root-passwort"; // Hier das Root-Passwort eintragen

    // Konstruiere die Optionen für die Verbindung zum MySQL-Server
    let builder = OptsBuilder::new()
        .user(Some("root"))
        .pass(Some(root_passwort))
        .ip_or_hostname(Some("localhost"))
        .tcp_port(3306) // MySQL-Port
        .db_name(Some("")); // Leerer Datenbankname

    // Erstelle eine Pool-Verbindung zum MySQL-Server
    let pool = Pool::new(Opts::from(builder))?;

    // Verbindung zur Datenbank herstellen, um Benutzer und Datenbank zu verwalten
    let mut conn = pool.get_conn()?;

    // Lösche den Benutzer, falls er bereits existiert
    conn.query_drop(format!("DROP USER IF EXISTS '{}'", benutzername))?;

    // Lösche die Datenbank, falls sie bereits existiert
    conn.query_drop(format!("DROP DATABASE IF EXISTS `{}`", datenbankname))?;

    // Erstelle die Datenbank mit der richtigen Zeichensatz-Codierung
    conn.query_drop(format!(
        "CREATE DATABASE {} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",
        datenbankname
    ))?;

    // Erstelle einen Benutzer mit Zugriffsrechten auf die Datenbank
    let grant_query = format!(
        "GRANT ALL PRIVILEGES ON `{}`.* TO '{}'@'localhost' IDENTIFIED BY '{}'",
        datenbankname, benutzername, passwort
    );
    conn.query_drop(grant_query)?;

    // Gebe eine Erfolgsmeldung aus
    println!("Aktion erfolgreich abgeschlossen.");
    
    // Rückgabewert für die Hauptfunktion
    Ok(())
}