about summary refs log tree commit diff
path: root/src/db.rs
blob: d4038cb8329f94c4e844e216a758866ef00a43a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use std::sync::Mutex;

use camino::Utf8PathBuf;
use rusqlite::{params, Connection, OptionalExtension};
use time::OffsetDateTime;

use crate::Meminfo;


pub struct Database{ 
    db_path: Utf8PathBuf,
    conn: Mutex<Connection>
}

impl Database {
    pub fn new(db_path: Utf8PathBuf) -> Self {
        Self {
            conn:Mutex::new(Connection::open(&db_path).unwrap()),
            db_path,
        }
    }

    pub fn create_tables(&self) {
        let conn = self.conn.lock().unwrap();
        conn.execute(CREATE_TABLE_HOSTMEM, params![]).unwrap();
    }

    pub fn insert_host_meminfo(&self, meminfo: Meminfo) {
        let conn = self.conn.lock().unwrap();

        conn.execute("INSERT INTO stats_hostmem(total_kb, available_kb) VALUES (?1, ?2)", params![meminfo.total, meminfo.avaialable]).unwrap();
    }

    pub fn get_last_host_meminfo(&self) -> DbMeminfo {
        let conn = self.conn.lock().unwrap();

        conn.query_row("SELECT * FROM stats_hostmem ORDER BY stamp DESC LIMIT 1", [], |row| {
            let (stamp, total_kb, available_kb) = row.try_into().unwrap();

            Ok(DbMeminfo {
                stamp, total_kb, available_kb
            })
        }).optional().unwrap().unwrap()
    }
}

pub const CREATE_TABLE_HOSTMEM: &'static str = "\
    CREATE TABLE IF NOT EXISTS stats_hostmem (
        stamp TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
        total_kb INTEGER NOT NULL,
        available_kb INTEGER NOT NULL
    );";

pub struct DbMeminfo {
    pub stamp: OffsetDateTime,
    pub total_kb: usize,
    pub available_kb: usize
}

impl DbMeminfo {
    pub fn usage(&self) -> usize {
        self.total_kb - self.available_kb
    }
}