alex_db_lib/
stat_record.rs1use 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}