alex_db_lib/
stat_record.rs

1use chrono::{DateTime, Duration, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4
5#[derive(Clone, Debug, Default, Deserialize, Serialize, ToSchema)]
6pub struct StatRecord {
7    pub reads: u128,
8    pub requests: u128,
9    pub saved_at: Option<DateTime<Utc>>,
10    pub saved_writes: u128,
11    pub writes: u128,
12}
13
14impl StatRecord {
15    pub fn can_save(&self, save_triggered_after_ms: i64, save_triggered_by_threshold: u16) -> bool {
16        let mut can_save = false;
17
18        match self.saved_at {
19            None => can_save = true,
20            Some(saved_at) => {
21                if saved_at + Duration::milliseconds(save_triggered_after_ms) < Utc::now() {
22                    can_save = true;
23                }
24            }
25        }
26
27        if self.writes >= self.saved_writes + u128::from(save_triggered_by_threshold) {
28            can_save = true;
29        }
30
31        can_save
32    }
33
34    pub fn inc_reads(&mut self) -> u128 {
35        self.reads += 1;
36
37        self.reads
38    }
39
40    pub fn inc_requests(&mut self) -> u128 {
41        self.requests += 1;
42
43        self.requests
44    }
45
46    pub fn inc_writes(&mut self) -> u128 {
47        self.writes += 1;
48
49        self.writes
50    }
51
52    pub fn update_saved_writes(&mut self) -> u128 {
53        self.saved_at = Some(Utc::now());
54        self.saved_writes = self.writes;
55
56        self.saved_writes
57    }
58}