rust/hedgewars-server/src/server/database.rs
changeset 15103 823052e66611
parent 15075 e935b1ad23f3
child 15109 acd50a72af59
equal deleted inserted replaced
15102:80ff12edf5e6 15103:823052e66611
     1 use mysql;
     1 use mysql;
     2 use mysql::{error::DriverError, error::Error, from_row_opt, params};
     2 use mysql::{error::DriverError, error::Error, from_row_opt, params};
     3 use openssl::sha::sha1;
     3 use openssl::sha::sha1;
     4 
     4 
     5 use crate::handlers::{AccountInfo, Sha1Digest};
     5 use crate::handlers::{AccountInfo, Sha1Digest};
       
     6 
       
     7 const CHECK_ACCOUNT_EXISTS_QUERY: &str =
       
     8     r"SELECT 1 FROM users WHERE users.name = :username LIMIT 1";
     6 
     9 
     7 const GET_ACCOUNT_QUERY: &str =
    10 const GET_ACCOUNT_QUERY: &str =
     8     r"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END,
    11     r"SELECT CASE WHEN users.status = 1 THEN users.pass ELSE '' END,
     9      (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 3),
    12      (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 3),
    10      (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 13)
    13      (SELECT COUNT(users_roles.rid) FROM users_roles WHERE users.uid = users_roles.uid AND users_roles.rid = 13)
    11      FROM users WHERE users.name = :username";
    14      FROM users WHERE users.name = :username";
    12 
    15 
    13 const STORE_STATS_QUERY: &str = r"INSERT INTO gameserver_stats
    16 const STORE_STATS_QUERY: &str = r"INSERT INTO gameserver_stats
    14             (players, rooms, last_update)
    17       (players, rooms, last_update)
    15             VALUES
    18       VALUES
    16             (:players, :rooms, UNIX_TIMESTAMP())";
    19       (:players, :rooms, UNIX_TIMESTAMP())";
    17 
    20 
    18 const GET_REPLAY_NAME_QUERY: &str = r"SELECT filename FROM achievements WHERE id = :id";
    21 const GET_REPLAY_NAME_QUERY: &str = r"SELECT filename FROM achievements WHERE id = :id";
    19 
    22 
    20 struct ServerStatistics {
    23 struct ServerStatistics {
    21     rooms: u32,
    24     rooms: u32,
    35 
    38 
    36     pub fn connect(&mut self, url: &str) -> Result<(), Error> {
    39     pub fn connect(&mut self, url: &str) -> Result<(), Error> {
    37         self.pool = Some(mysql::Pool::new(url)?);
    40         self.pool = Some(mysql::Pool::new(url)?);
    38 
    41 
    39         Ok(())
    42         Ok(())
       
    43     }
       
    44 
       
    45     pub fn is_registered(&mut self, nick: &str) -> Result<bool, Error> {
       
    46         if let Some(pool) = &self.pool {
       
    47             let is_registered = pool
       
    48                 .first_exec(CHECK_ACCOUNT_EXISTS_QUERY, params! { "username" => nick })?
       
    49                 .is_some();
       
    50             Ok(is_registered)
       
    51         } else {
       
    52             Err(DriverError::SetupError.into())
       
    53         }
    40     }
    54     }
    41 
    55 
    42     pub fn get_account(
    56     pub fn get_account(
    43         &mut self,
    57         &mut self,
    44         nick: &str,
    58         nick: &str,
    99     pub fn get_replay_name(&mut self, replay_id: u32) -> Result<Option<String>, Error> {
   113     pub fn get_replay_name(&mut self, replay_id: u32) -> Result<Option<String>, Error> {
   100         if let Some(pool) = &self.pool {
   114         if let Some(pool) = &self.pool {
   101             if let Some(row) =
   115             if let Some(row) =
   102                 pool.first_exec(GET_REPLAY_NAME_QUERY, params! { "id" => replay_id })?
   116                 pool.first_exec(GET_REPLAY_NAME_QUERY, params! { "id" => replay_id })?
   103             {
   117             {
   104                 let (filename) = from_row_opt::<(String)>(row)?;
   118                 let filename = from_row_opt::<(String)>(row)?;
   105                 Ok(Some(filename))
   119                 Ok(Some(filename))
   106             } else {
   120             } else {
   107                 Ok(None)
   121                 Ok(None)
   108             }
   122             }
   109         } else {
   123         } else {