Skip to content

Commit 23fe322

Browse files
chore: fully switch to time, update deps
Signed-off-by: Henry Gressmann <[email protected]>
1 parent ee765fd commit 23fe322

File tree

14 files changed

+81
-85
lines changed

14 files changed

+81
-85
lines changed

Cargo.lock

Lines changed: 24 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,33 @@ serde_json={version="1.0"}
2727
md-5="0.10"
2828

2929
# utils
30+
cached="0.53"
3031
argh={version="0.1"}
3132
eyre={version="0.6"}
3233
rand={version="0.8"}
33-
chrono={version="0.4", features=["serde"]}
34-
time={version="0.3"} # need both chrono and time for compatibility with dependencies
34+
time={version="0.3"}
3535
itertools={version="0.13"}
3636
colored={version="2.1"}
3737
figment={version="0.10", features=["toml", "env"]}
3838
sha3={version="0.10"}
3939
argon2={version="0.5"}
4040
crossbeam="0.8"
41-
cached="0.53"
4241
tracing="0.1"
4342
tracing-subscriber={version="0.3", features=["env-filter"]}
4443
async-compression="0.4.12"
4544
tokio-tar={package="krata-tokio-tar", version="0.4.0"}
4645

4746
# web
48-
poem={version="3.0", features=["embed", "session", "cookie", "compression", "tower-compat"]}
49-
poem-openapi={version="5.0", features=["chrono"]}
47+
poem={version="3.1", default-features=false, features=[
48+
"time",
49+
"embed",
50+
"session",
51+
"cookie",
52+
"compression",
53+
"tower-compat",
54+
]}
55+
56+
poem-openapi={version="5.0", default-features=false, features=["time"]}
5057
tower={version="0.5", default-features=false, features=["limit"]}
5158
uaparser="0.6"
5259
mime_guess={version="2.0"}
@@ -59,8 +66,12 @@ reqwest={version="0.12", default-features=false, features=[
5966
]}
6067

6168
# database
62-
duckdb={version="1.0", features=["bundled", "chrono", "r2d2"]}
63-
rusqlite={version="0.32", features=["bundled", "chrono"]}
69+
duckdb={version="1.0", git="https://github.com/explodingcamera/duckdb-rs", features=[
70+
"bundled",
71+
"time",
72+
"r2d2",
73+
]}
74+
rusqlite={version="0.32", features=["bundled", "time"]}
6475
r2d2={version="0.8"}
6576
r2d2_sqlite="0.25.0"
6677
refinery={version="0.8"}

src/app/core/events.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::sync::Arc;
22

33
use crossbeam::{channel::Receiver, sync::ShardedLock};
44
use eyre::{bail, Result};
5+
use time::OffsetDateTime;
56

67
use crate::{
78
app::{
@@ -15,12 +16,12 @@ use crate::{
1516
pub struct LiwanEvents {
1617
duckdb: DuckDBPool,
1718
sqlite: SqlitePool,
18-
daily_salt: Arc<ShardedLock<(String, chrono::DateTime<chrono::Utc>)>>,
19+
daily_salt: Arc<ShardedLock<(String, OffsetDateTime)>>,
1920
}
2021

2122
impl LiwanEvents {
2223
pub fn try_new(duckdb: DuckDBPool, sqlite: SqlitePool) -> Result<Self> {
23-
let daily_salt: (String, chrono::DateTime<chrono::Utc>) = {
24+
let daily_salt: (String, OffsetDateTime) = {
2425
tracing::debug!("Loading daily salt");
2526
sqlite.get()?.query_row("select salt, updated_at from salts where id = 1", [], |row| {
2627
Ok((row.get(0)?, row.get(1)?))
@@ -37,10 +38,10 @@ impl LiwanEvents {
3738
};
3839

3940
// if the salt is older than 24 hours, replace it with a new one (utils::generate_salt)
40-
if chrono::Utc::now() - updated_at > chrono::Duration::hours(24) {
41+
if (OffsetDateTime::now_utc() - updated_at) > time::Duration::hours(24) {
4142
tracing::debug!("Daily salt expired, generating a new one");
4243
let new_salt = generate_salt();
43-
let now = chrono::Utc::now();
44+
let now = OffsetDateTime::now_utc();
4445
let conn = self.sqlite.get()?;
4546
conn.execute("update salts set salt = ?, updated_at = ? where id = 1", rusqlite::params![&new_salt, now])?;
4647

src/app/core/reports.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use std::collections::BTreeMap;
22
use std::fmt::{Debug, Display};
33

4-
use crate::utils::{validate, TimeExt};
5-
use crate::{app::DuckDBConn, utils::Timestamp};
4+
use crate::app::DuckDBConn;
5+
use crate::utils::validate;
66
use duckdb::params;
77
use eyre::Result;
88
use itertools::Itertools;
99
use poem_openapi::{Enum, Object};
10+
use time::OffsetDateTime;
1011

1112
// TODO: more fine-grained caching (e.g. don't cache for short durations/ending in now)
1213
// use cached::proc_macro::cached;
@@ -17,8 +18,8 @@ use poem_openapi::{Enum, Object};
1718

1819
#[derive(Object)]
1920
pub struct DateRange {
20-
pub start: Timestamp,
21-
pub end: Timestamp,
21+
pub start: OffsetDateTime,
22+
pub end: OffsetDateTime,
2223
}
2324

2425
impl Display for DateRange {
@@ -204,8 +205,7 @@ pub fn overall_report(
204205
");
205206

206207
let mut stmt = conn.prepare_cached(&query)?;
207-
let params =
208-
params![range.start.to_time(), range.end.to_time(), data_points, data_points, event, range.end.to_time()];
208+
let params = params![range.start, range.end, data_points, data_points, event, range.end];
209209

210210
match metric {
211211
Metric::Views | Metric::UniqueVisitors | Metric::Sessions => {
@@ -280,7 +280,7 @@ pub fn overall_stats(
280280
");
281281

282282
let mut stmt = conn.prepare_cached(&query)?;
283-
let params = params![range.start.to_time(), range.end.to_time(), event];
283+
let params = params![range.start, range.end, event];
284284

285285
let result = stmt.query_row(duckdb::params_from_iter(params), |row| {
286286
Ok(ReportStats {
@@ -365,7 +365,7 @@ pub fn dimension_report(
365365
);
366366

367367
let mut stmt = conn.prepare_cached(&query)?;
368-
let params = params![range.start.to_time(), range.end.to_time(), event];
368+
let params = params![range.start, range.end, event];
369369

370370
match metric {
371371
Metric::Views | Metric::UniqueVisitors | Metric::Sessions => {

src/app/core/sessions.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::app::SqlitePool;
22
use eyre::Result;
3+
use time::OffsetDateTime;
34

45
#[derive(Clone)]
56
pub struct LiwanSessions {
@@ -12,7 +13,7 @@ impl LiwanSessions {
1213
}
1314

1415
/// Create a new session
15-
pub fn create(&self, session_id: &str, username: &str, expires_at: chrono::DateTime<chrono::Utc>) -> Result<()> {
16+
pub fn create(&self, session_id: &str, username: &str, expires_at: OffsetDateTime) -> Result<()> {
1617
let conn = self.pool.get()?;
1718
let mut stmt = conn.prepare_cached("insert into sessions (id, username, expires_at) values (?, ?, ?)")?;
1819
stmt.execute(rusqlite::params![session_id, username, expires_at])?;
@@ -24,9 +25,9 @@ impl LiwanSessions {
2425
pub fn get(&self, session_id: &str) -> Result<Option<String>> {
2526
let conn = self.pool.get()?;
2627
let mut stmt = conn.prepare_cached("select username, expires_at from sessions where id = ?")?;
27-
let (username, expires_at): (String, chrono::DateTime<chrono::Utc>) =
28+
let (username, expires_at): (String, OffsetDateTime) =
2829
stmt.query_row([session_id], |row| Ok((row.get("username")?, row.get("expires_at")?)))?;
29-
if expires_at < chrono::Utc::now() {
30+
if expires_at < OffsetDateTime::now_utc() {
3031
return Ok(None);
3132
}
3233
Ok(Some(username))
@@ -36,7 +37,7 @@ impl LiwanSessions {
3637
pub fn delete(&self, session_id: &str) -> Result<()> {
3738
let conn = self.pool.get()?;
3839
let mut stmt = conn.prepare_cached("update sessions set expires_at = ? where id = ?")?;
39-
stmt.execute(rusqlite::params![chrono::Utc::now(), session_id])?;
40+
stmt.execute(rusqlite::params![OffsetDateTime::now_utc(), session_id])?;
4041
Ok(())
4142
}
4243
}

src/app/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use duckdb::DuckdbConnectionManager;
1111
use eyre::Result;
1212
use r2d2_sqlite::SqliteConnectionManager;
1313
use std::sync::Arc;
14+
use time::OffsetDateTime;
1415

1516
pub type DuckDBConn = r2d2::PooledConnection<DuckdbConnectionManager>;
1617
pub type DuckDBPool = r2d2::Pool<DuckdbConnectionManager>;
@@ -132,8 +133,8 @@ impl Liwan {
132133
)?;
133134
}
134135

135-
let start = chrono::Utc::now().checked_sub_signed(chrono::Duration::days(365)).unwrap();
136-
let end = chrono::Utc::now();
136+
let start = OffsetDateTime::now_utc().checked_sub(time::Duration::days(365)).unwrap();
137+
let end = OffsetDateTime::now_utc();
137138
for (entity_id, display_name, fqdn, project_ids) in entities.iter() {
138139
self.entities.create(
139140
&models::Entity { id: entity_id.to_string(), display_name: display_name.to_string() },

src/app/models.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pub struct Event {
33
pub entity_id: String,
44
pub visitor_id: String,
55
pub event: String,
6-
pub created_at: chrono::DateTime<chrono::Utc>,
6+
pub created_at: OffsetDateTime,
77
pub fqdn: Option<String>,
88
pub path: Option<String>,
99
pub referrer: Option<String>,
@@ -90,3 +90,4 @@ macro_rules! event_params {
9090
pub use event_params;
9191
use poem_openapi::Enum;
9292
use serde::{Deserialize, Serialize};
93+
use time::OffsetDateTime;

0 commit comments

Comments
 (0)