rust/hedgewars-server/src/server/database.rs
author unc0rr
Sun, 16 Dec 2018 00:09:20 +0100
changeset 14456 a077aac9df01
child 14457 98ef2913ec73
permissions -rw-r--r--
Start database interaction implementation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14456
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     1
use mysql;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     2
use mysql::{params, error::Error, error::DriverError};
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     3
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     4
struct AccountInfo {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     5
    is_registered: bool,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     6
    is_admin: bool,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     7
    is_contributor: bool,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     8
}
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
     9
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    10
struct ServerStatistics {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    11
    rooms: u32,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    12
    players: u32,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    13
}
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    14
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    15
struct Achievements {}
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    16
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    17
trait DatabaseInterface {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    18
    fn check_account(username: &str, password: &str) -> AccountInfo;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    19
    fn store_stats(stats: &ServerStatistics) -> Result<(), ()>;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    20
    fn store_achievements(achievements: &Achievements) -> Result<(), ()>;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    21
    fn get_replay_name(replay_id: u32) -> Result<String, ()>;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    22
}
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    23
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    24
struct Database {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    25
    pool: Option<mysql::Pool>,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    26
}
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    27
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    28
impl Database {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    29
    fn new() -> Self {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    30
        Self { pool: None }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    31
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    32
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    33
    fn connect(&mut self, url: &str) -> Result<(), Error> {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    34
        self.pool = Some(mysql::Pool::new(url)?);
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    35
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    36
        Ok(())
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    37
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    38
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    39
    fn check_account(&mut self, username: &str, password: &str) -> AccountInfo {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    40
        AccountInfo {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    41
            is_registered: false,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    42
            is_admin: false,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    43
            is_contributor: false,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    44
        }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    45
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    46
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    47
    fn store_stats(&mut self, stats: &ServerStatistics) -> Result<(), Error> {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    48
        if let Some(pool) = &self.pool {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    49
        for mut stmt in pool.prepare(r"INSERT INTO gameserver_stats (players, rooms, last_update) VALUES (:players, :rooms, UNIX_TIMESTAMP())").into_iter() {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    50
                stmt.execute(params!{
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    51
                "players" => stats.players,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    52
                "rooms" => stats.rooms,
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    53
            })?;
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    54
        }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    55
            Ok(())
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    56
        } else {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    57
            Err(DriverError::SetupError.into())
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    58
        }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    59
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    60
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    61
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    62
    fn store_achievements(&mut self, achievements: &Achievements) -> Result<(), ()> {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    63
        Ok(())
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    64
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    65
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    66
    fn get_replay_name(&mut self, replay_id: u32) -> Result<String, ()> {
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    67
        Err(())
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    68
    }
a077aac9df01 Start database interaction implementation
unc0rr
parents:
diff changeset
    69
}