# HG changeset patch # User unc0rr # Date 1544915360 -3600 # Node ID a077aac9df01fe449fd34a2d2fc0aaff82312f3d # Parent df366c5b8440f2c5b1cfdc43162dd6c2ddec6c43 Start database interaction implementation diff -r df366c5b8440 -r a077aac9df01 rust/hedgewars-server/Cargo.toml --- a/rust/hedgewars-server/Cargo.toml Sat Dec 15 03:07:20 2018 +0100 +++ b/rust/hedgewars-server/Cargo.toml Sun Dec 16 00:09:20 2018 +0100 @@ -5,7 +5,7 @@ authors = [ "Andrey Korotaev " ] [features] -official-server = ["openssl"] +official-server = ["openssl", "mysql"] tls-connections = ["openssl"] default = [] @@ -23,6 +23,7 @@ serde_yaml = "0.8" serde_derive = "1.0" openssl = { version = "0.10", optional = true } +mysql = { version = "14.2", optional = true } [dev-dependencies] -proptest = "0.8" \ No newline at end of file +proptest = "0.8" diff -r df366c5b8440 -r a077aac9df01 rust/hedgewars-server/src/server.rs --- a/rust/hedgewars-server/src/server.rs Sat Dec 15 03:07:20 2018 +0100 +++ b/rust/hedgewars-server/src/server.rs Sun Dec 16 00:09:20 2018 +0100 @@ -6,3 +6,5 @@ pub mod coretypes; mod actions; mod handlers; +#[cfg(feature = "official-server")] +mod database; diff -r df366c5b8440 -r a077aac9df01 rust/hedgewars-server/src/server/actions.rs --- a/rust/hedgewars-server/src/server/actions.rs Sat Dec 15 03:07:20 2018 +0100 +++ b/rust/hedgewars-server/src/server/actions.rs Sun Dec 16 00:09:20 2018 +0100 @@ -22,6 +22,9 @@ }; use rand::{thread_rng, Rng, distributions::Uniform}; +#[cfg(feature = "official-server")] +use super::database; + pub enum Destination { ToId(ClientId), ToSelf, diff -r df366c5b8440 -r a077aac9df01 rust/hedgewars-server/src/server/database.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/hedgewars-server/src/server/database.rs Sun Dec 16 00:09:20 2018 +0100 @@ -0,0 +1,69 @@ +use mysql; +use mysql::{params, error::Error, error::DriverError}; + +struct AccountInfo { + is_registered: bool, + is_admin: bool, + is_contributor: bool, +} + +struct ServerStatistics { + rooms: u32, + players: u32, +} + +struct Achievements {} + +trait DatabaseInterface { + fn check_account(username: &str, password: &str) -> AccountInfo; + fn store_stats(stats: &ServerStatistics) -> Result<(), ()>; + fn store_achievements(achievements: &Achievements) -> Result<(), ()>; + fn get_replay_name(replay_id: u32) -> Result; +} + +struct Database { + pool: Option, +} + +impl Database { + fn new() -> Self { + Self { pool: None } + } + + fn connect(&mut self, url: &str) -> Result<(), Error> { + self.pool = Some(mysql::Pool::new(url)?); + + Ok(()) + } + + fn check_account(&mut self, username: &str, password: &str) -> AccountInfo { + AccountInfo { + is_registered: false, + is_admin: false, + is_contributor: false, + } + } + + fn store_stats(&mut self, stats: &ServerStatistics) -> Result<(), Error> { + if let Some(pool) = &self.pool { + for mut stmt in pool.prepare(r"INSERT INTO gameserver_stats (players, rooms, last_update) VALUES (:players, :rooms, UNIX_TIMESTAMP())").into_iter() { + stmt.execute(params!{ + "players" => stats.players, + "rooms" => stats.rooms, + })?; + } + Ok(()) + } else { + Err(DriverError::SetupError.into()) + } + + } + + fn store_achievements(&mut self, achievements: &Achievements) -> Result<(), ()> { + Ok(()) + } + + fn get_replay_name(&mut self, replay_id: u32) -> Result { + Err(()) + } +} diff -r df366c5b8440 -r a077aac9df01 rust/hedgewars-server/src/utils.rs --- a/rust/hedgewars-server/src/utils.rs Sat Dec 15 03:07:20 2018 +0100 +++ b/rust/hedgewars-server/src/utils.rs Sun Dec 16 00:09:20 2018 +0100 @@ -62,6 +62,8 @@ 54 => "0.9.24-dev", 55 => "0.9.24", 56 => "0.9.25-dev", + 57 => "0.9.25", + 58 => "1.0.0-dev", _ => "Unknown" } -} \ No newline at end of file +}