diff --git a/server/Cargo.lock b/server/Cargo.lock index 2fcdfa4..59a30bb 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1333,9 +1333,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.26.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a82b0b91fad72160c56bf8da7a549b25d7c31109f52cc1437eac4c0ad2550a7" +checksum = "4ba4d3462c8b2e4d7f4fcfcf2b296dc6b65404fbbc7b63daa37fd485c149daf7" dependencies = [ "bitflags", "fallible-iterator", diff --git a/server/Cargo.toml b/server/Cargo.toml index b9af5d9..b885433 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -17,7 +17,7 @@ fastrand = "1.5.0" subbeat = "0.0.15" config = "0.11.0" openssl = { version = "=0.10.33", features = ["vendored"] } -rusqlite = "0.26.1" +rusqlite = "0.26.2" # https://github.com/rusqlite/rusqlite/issues/914 libsqlite3-sys = { version = "*", features = ["bundled"] } futures = "0.3.17" diff --git a/server/src/services/analytic_service/analytic_service.rs b/server/src/services/analytic_service/analytic_service.rs index 20d220f..8c79628 100644 --- a/server/src/services/analytic_service/analytic_service.rs +++ b/server/src/services/analytic_service/analytic_service.rs @@ -330,7 +330,10 @@ impl AnalyticService { ms: MetricService, ss: SegmentsService, ) { - let mut au = aus.resolve(aucfg); + let mut au = match aus.resolve(aucfg) { + Ok(a) => a, + Err(e) => { panic!("{}", e); } + }; match tx .send(AnalyticServiceMessage::Response(Ok( diff --git a/server/src/services/analytic_service/detection_runner.rs b/server/src/services/analytic_service/detection_runner.rs index 1f01717..6135b9f 100644 --- a/server/src/services/analytic_service/detection_runner.rs +++ b/server/src/services/analytic_service/detection_runner.rs @@ -56,6 +56,7 @@ impl DetectionRunner { loop { // TODO: run detection periodically sleep(Duration::from_secs(cfg.interval)).await; + // TODO: use tx senf detection update } } })); diff --git a/server/src/services/analytic_unit_service.rs b/server/src/services/analytic_unit_service.rs index 9d0ffa2..1a164c6 100644 --- a/server/src/services/analytic_unit_service.rs +++ b/server/src/services/analytic_unit_service.rs @@ -3,6 +3,7 @@ use std::sync::{Arc, Mutex}; use crate::utils::get_random_str; use rusqlite::{params, Connection, Row}; +use warp::hyper::rt::Executor; use super::analytic_service::analytic_unit::{types::{AnalyticUnitConfig, self}, threshold_analytic_unit::ThresholdAnalyticUnit, pattern_analytic_unit::PatternAnalyticUnit, anomaly_analytic_unit::AnomalyAnalyticUnit}; @@ -24,7 +25,7 @@ impl AnalyticUnitService { conn.execute( "CREATE TABLE IF NOT EXISTS analytic_unit ( id TEXT PRIMARY KEY, - last_detection INTEGER NOT NULL + last_detection INTEGER )", [], )?; @@ -34,11 +35,37 @@ impl AnalyticUnitService { }) } - pub fn resolve(&self, cfg: AnalyticUnitConfig) -> Box { + // TODO: optional id + pub fn resolve_au(&self, cfg: AnalyticUnitConfig) -> Box { match cfg { AnalyticUnitConfig::Threshold(c) => Box::new(ThresholdAnalyticUnit::new("1".to_string(), c.clone())), AnalyticUnitConfig::Pattern(c) => Box::new(PatternAnalyticUnit::new("2".to_string(), c.clone())), AnalyticUnitConfig::Anomaly(c) => Box::new(AnomalyAnalyticUnit::new("3".to_string(), c.clone())), } } + + pub fn resolve(&self, cfg: AnalyticUnitConfig) -> anyhow::Result> { + let au = self.resolve_au(cfg); + let id = au.as_ref().get_id(); + + let conn = self.connection.lock().unwrap(); + let mut stmt = conn.prepare( + "SELECT id from analytic_unit WHERE id = ?1", + )?; + let res = stmt.exists(params![id])?; + + if res == false { + conn.execute( + "INSERT INTO analytic_unit (id) VALUES (?1)", + params![id] + )?; + } + + return Ok(au); + } + + // TODO: resolve with saving by id + pub fn set_last_detection(id: String, last_detection: u64) -> anyhow::Result<()> { + Ok(()) + } } \ No newline at end of file