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()); } }