use sqlx::Connection;
use std::{
    fs::{DirBuilder, OpenOptions},
    io::Write,
};

#[async_std::main]
async fn main() {
    let mut conn = sqlx::MySqlConnection::connect(
        "mysql://medlemswiki:supersecretpassword@localhost/medlemswiki",
    )
    .await
    .expect("Failed to connect to wiki db");

    let pages: Vec<(Vec<u8>, u32)> = sqlx::query_as("SELECT page_title, page_latest FROM page;")
        .fetch_all(&mut conn)
        .await
        .expect("Failed to get pages");

    let mut text_ids: Vec<(String, u32)> = Vec::new();
    for (title, revision) in pages {
        let id: (u32,) = sqlx::query_as("SELECT rev_text_id FROM revision WHERE rev_id = ?;")
            .bind(revision)
            .fetch_one(&mut conn)
            .await
            .expect("Failed to get page revision");
        text_ids.push((String::from_utf8(title.clone()).unwrap(), id.0));
    }

    let mut contents: Vec<(String, String)> = Vec::new();
    for (title, id) in text_ids {
        let content: (Vec<u8>,) = sqlx::query_as("SELECT old_text FROM text WHERE old_id = ?;")
            .bind(id)
            .fetch_one(&mut conn)
            .await
            .expect("Failed to get page contents");
        contents.push((title.clone(), String::from_utf8(content.0).unwrap()));
    }

    DirBuilder::new().recursive(true).create("wiki").unwrap();
    for (title, content) in contents {
        let mut file = OpenOptions::new()
            .write(true)
            .truncate(true)
            .create(true)
            .open(format!("wiki/{}.txt", title.replace("/", " ")))
            .unwrap();
        let _ = file.write_all(content.as_bytes());
    }
}

Generated by Getz using scpaste at Sat Feb 1 22:15:21 2025. CET. (original)