diff --git a/Cargo.lock b/Cargo.lock index 9a5a012..462bf0b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -183,6 +183,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -210,6 +216,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.6.0" @@ -761,15 +773,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.26" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "fa82e28a107a8cc405f0839610bdc9b15f1e25ec7d696aa5cf173edbcb1486ab" dependencies = [ + "atomic-waker", "bytes", "fnv", "futures-core", "futures-sink", - "futures-util", "http", "indexmap", "slab", @@ -862,9 +874,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.12" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -873,12 +885,24 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.6" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", "pin-project-lite", ] @@ -888,47 +912,77 @@ version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - [[package]] name = "hyper" -version = "0.14.30" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", "http-body", "httparse", - "httpdate", "itoa", "pin-project-lite", - "socket2", + "smallvec", "tokio", - "tower-service", - "tracing", "want", ] [[package]] -name = "hyper-tls" -version = "0.5.0" +name = "hyper-rustls" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +checksum = "5ee4be2c948921a1a5320b629c4193916ed787a7f7f293fd3f7f5a6c9de74155" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls 0.23.11", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", + "http-body-util", "hyper", + "hyper-util", "native-tls", "tokio", "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower", + "tower-service", + "tracing", ] [[package]] @@ -1367,6 +1421,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1424,7 +1498,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" dependencies = [ - "toml_edit", + "toml_edit 0.21.1", ] [[package]] @@ -1598,11 +1672,11 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.27" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "encoding_rs", "futures-core", @@ -1610,8 +1684,11 @@ dependencies = [ "h2", "http", "http-body", + "http-body-util", "hyper", + "hyper-rustls", "hyper-tls", + "hyper-util", "ipnet", "js-sys", "log", @@ -1620,7 +1697,7 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls-pemfile", + "rustls-pemfile 2.1.2", "serde", "serde_json", "serde_urlencoded", @@ -1742,19 +1819,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "ring", - "rustls-webpki", + "rustls-webpki 0.101.7", "sct", ] +[[package]] +name = "rustls" +version = "0.23.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4828ea528154ae444e5a642dbb7d5623354030dc9822b83fd9bb79683c7399d0" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki 0.102.5", + "subtle", + "zeroize", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.7", ] +[[package]] +name = "rustls-pemfile" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29993a25686778eb88d4189742cd713c9bce943bc54251a33509dc63cbacf73d" +dependencies = [ + "base64 0.22.1", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "976295e77ce332211c0d24d92c0e83e50f5c5f046d11082cea19f3df13a3562d" + [[package]] name = "rustls-webpki" version = "0.101.7" @@ -1765,6 +1871,17 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustls-webpki" +version = "0.102.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a6fccd794a42c2c105b513a2f62bc3fd8f3ba57a4593677ceb0bd035164d78" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "ryu" version = "1.0.18" @@ -2015,6 +2132,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2180,8 +2306,8 @@ dependencies = [ "paste", "percent-encoding", "rust_decimal", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "sha2", @@ -2243,7 +2369,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", - "base64", + "base64 0.21.7", "bigdecimal", "bitflags 2.6.0", "byteorder", @@ -2290,7 +2416,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", - "base64", + "base64 0.21.7", "bigdecimal", "bitflags 2.6.0", "byteorder", @@ -2357,7 +2483,12 @@ dependencies = [ name = "sr_download" version = "0.1.0" dependencies = [ + "db_part", "reqwest", + "serde", + "tokio", + "toml", + "tracing", ] [[package]] @@ -2431,9 +2562,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "system-configuration" @@ -2474,6 +2605,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "tests" +version = "0.1.0" +dependencies = [ + "anyhow", + "reqwest", + "tokio", +] + [[package]] name = "thiserror" version = "1.0.63" @@ -2590,6 +2730,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls 0.23.11", + "rustls-pki-types", + "tokio", +] + [[package]] name = "tokio-stream" version = "0.1.15" @@ -2614,11 +2765,26 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.16", +] + [[package]] name = "toml_datetime" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -2628,9 +2794,43 @@ checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" dependencies = [ "indexmap", "toml_datetime", - "winnow", + "winnow 0.5.40", ] +[[package]] +name = "toml_edit" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.13", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -3056,10 +3256,19 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" dependencies = [ "cfg-if", "windows-sys 0.48.0", diff --git a/Cargo.toml b/Cargo.toml index 914454d..4e3ad1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,3 @@ [workspace] resolver = "2" -members = [ - "sr_download", - "migration", - "db_part" -] +members = ["sr_download", "migration", "db_part", "tests"] diff --git a/db_part/Cargo.toml b/db_part/Cargo.toml index 0ac532b..79972d5 100644 --- a/db_part/Cargo.toml +++ b/db_part/Cargo.toml @@ -4,10 +4,11 @@ version = "0.1.0" edition = "2021" [dependencies] -anyhow = { version = "1.0.86", features = ["backtrace"] } migration = { path = "../migration" } -sea-orm = {version = "0.12.15", features = [ + +anyhow = { version = "1.0.86", features = ["backtrace"] } +sea-orm = { version = "0.12.15", features = [ "sqlx-postgres", - "runtime-tokio-rustls" -]} + "runtime-tokio-rustls", +] } tokio = { version = "1.38.1", features = ["full"] } diff --git a/db_part/src/lib.rs b/db_part/src/lib.rs index cd115c6..0cc0ae6 100644 --- a/db_part/src/lib.rs +++ b/db_part/src/lib.rs @@ -1,12 +1,18 @@ use anyhow::Ok; -use sea_orm::{ConnectOptions, Database, DatabaseConnection}; +use sea_orm::{ConnectOptions, Database}; + +use migration::{Migrator, MigratorTrait}; pub async fn init_db() -> anyhow::Result<()> { let mut opt = ConnectOptions::new("postgres://srdown:srdown@localhost:5432/srdown?currentSchema=srdown"); - opt.max_connections(10).sqlx_logging(true); + opt.max_connections(10) + .sqlx_logging(true) + .set_schema_search_path("srdown"); let db = Database::connect(opt).await?; + Migrator::up(&db, None).await?; + Ok(()) } diff --git a/sr_download/Cargo.toml b/sr_download/Cargo.toml index 5df461b..11205d7 100644 --- a/sr_download/Cargo.toml +++ b/sr_download/Cargo.toml @@ -3,8 +3,11 @@ name = "sr_download" version = "0.1.0" edition = "2021" +[dependencies] +reqwest = "0.12.5" +tokio = { version = "1.38.1", features = ["full"] } +toml = "0.8.15" +tracing = "0.1.40" +db_part = { path = "../db_part" } +serde = { version = "1.0.204", features = ["serde_derive"] } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies.reqwest] -version = "0.11.18" -features = ["blocking", "json"] diff --git a/sr_download/src/config.rs b/sr_download/src/config.rs new file mode 100644 index 0000000..5027d96 --- /dev/null +++ b/sr_download/src/config.rs @@ -0,0 +1,9 @@ +use serde::Deserialize; + +#[derive(Deserialize)] +pub struct ConfigFile { + pub db_url: String, + pub max_connections: u32, + pub sqlx_logging: bool, + pub schema_search_path: String, +} diff --git a/sr_download/src/main.rs b/sr_download/src/main.rs index c51b901..79e501e 100644 --- a/sr_download/src/main.rs +++ b/sr_download/src/main.rs @@ -1,51 +1,5 @@ -fn list_file_in_dir(dir: &str, file_vec: &mut Vec) -> Result<(), Box> { - let save_paths = std::fs::read_dir(dir)?; - for save_path in save_paths { - if let Ok(save_path) = save_path { - let file_name = save_path.file_name(); - let file_name = file_name.to_str().unwrap(); - // 判断文件名是否以 .xml 结尾 - if file_name.ends_with(".xml") { - let file_id = file_name.trim_end_matches(".xml"); - let file_id = file_id.parse::()?; - file_vec.push(file_id); - } - } - } - file_vec.sort(); - Ok(()) -} +mod config; +mod net; -enum FileKind { - Ship, - Save, -} - -/// 飞船 API http://jundroo.com/service/SimpleRockets/DownloadRocket?id= -/// 存档 API http://jundroo.com/service/SimpleRockets/DownloadSandBox?id= -/// curl http://jundroo.com/service/SimpleRockets/DownloadRocket?id=144444 -fn get_file_from_jundroo(id: u64) -> Result> { - let ship_try = reqwest::blocking::get(format!( - "http://jundroo.com/service/SimpleRockets/DownloadRocket?id={}", - id - ))?; - println!("ship_try: {:?}", ship_try); - println!("body: {}", ship_try.text()?); - - Ok(FileKind::Ship) -} - -fn main() { - let mut ship_vec: Vec = Vec::with_capacity(82_0000); - let mut save_vec: Vec = Vec::with_capacity(29_0000); - - list_file_in_dir("./ship", &mut ship_vec).unwrap(); - list_file_in_dir("./save", &mut save_vec).unwrap(); - - let _ = get_file_from_jundroo(144444); - for i in 144444..144450 { - let _ = get_file_from_jundroo(i); - } - - println!("ship: {}, save: {}", ship_vec.len(), save_vec.len()); -} +#[tokio::main] +async fn main() {} diff --git a/sr_download/src/net.rs b/sr_download/src/net.rs index 60762fc..3312a61 100644 --- a/sr_download/src/net.rs +++ b/sr_download/src/net.rs @@ -1,13 +1,50 @@ use Request::blocking::Client; pub struct Downloader { - pub client: Client + pub client: Client, } impl Downloader { pub fn new() -> Self { Self { - client: Client::new() + client: Client::new(), } } } + +fn list_file_in_dir(dir: &str, file_vec: &mut Vec) -> Result<(), Box> { + let save_paths = std::fs::read_dir(dir)?; + for save_path in save_paths { + if let Ok(save_path) = save_path { + let file_name = save_path.file_name(); + let file_name = file_name.to_str().unwrap(); + // 判断文件名是否以 .xml 结尾 + if file_name.ends_with(".xml") { + let file_id = file_name.trim_end_matches(".xml"); + let file_id = file_id.parse::()?; + file_vec.push(file_id); + } + } + } + file_vec.sort(); + Ok(()) +} + +enum FileKind { + Ship, + Save, +} + +/// 飞船 API http://jundroo.com/service/SimpleRockets/DownloadRocket?id= +/// 存档 API http://jundroo.com/service/SimpleRockets/DownloadSandBox?id= +/// curl http://jundroo.com/service/SimpleRockets/DownloadRocket?id=144444 +fn get_file_from_jundroo(id: u64) -> Result> { + let ship_try = reqwest::blocking::get(format!( + "http://jundroo.com/service/SimpleRockets/DownloadRocket?id={}", + id + ))?; + println!("ship_try: {:?}", ship_try); + println!("body: {}", ship_try.text()?); + + Ok(FileKind::Ship) +}