From aed94d7eac155edbd402ba6196f296fdd3472d89 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Sun, 9 Feb 2025 15:48:13 -0500 Subject: [PATCH] Adding data retrival. --- src/data/cache.rs | 120 ++++++++++++++++++++++++++++++++++++++++++++++ src/data/mod.rs | 58 +++++++++++----------- src/lib.rs | 48 +++++++++++++++++++ 3 files changed, 197 insertions(+), 29 deletions(-) create mode 100644 src/data/cache.rs diff --git a/src/data/cache.rs b/src/data/cache.rs new file mode 100644 index 0000000..6baa51c --- /dev/null +++ b/src/data/cache.rs @@ -0,0 +1,120 @@ +pub mod database; +pub mod global; +pub mod id; +mod record; +pub mod table; + +/* +use std::collections::BTreeMap; +use uuid::Uuid; + +#[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Clone, Debug)] +struct IDPath { + path: Vec, +} + +impl IDPath { + fn new() -> Self { + let mut path = Vec::new(); + path.push(Uuid::nil()); + Self { path: path } + } + + fn next() -> Uuid { + Uuid::new_v4() + } + + fn extend(&self, addition: Uuid) -> Self { + let mut result = self.clone(); + result.path.pop(); + result.path.push(addition); + result.path.push(Uuid::nil()); + result + } +} + +#[cfg(test)] +mod ids { + use super::*; + + #[test] + fn create_idpath() { + let expected = [Uuid::nil()]; + let id = IDPath::new(); + assert_eq!(id.path, expected); + } + + #[test] + fn next_is_random() { + let mut ids: Vec = Vec::new(); + for _ in 0..10 { + let id = IDPath::next(); + assert!(!ids.contains(&id), "{} is a duplicate", id); + ids.push(id); + } + } + + #[test] + fn extend_idpath() { + let mut path: Vec = Vec::new(); + path.push(Uuid::nil()); + let mut id = IDPath::new(); + for count in 1..5 { + assert_eq!(id.path.len(), count); + let extended = IDPath::next(); + id = id.extend(extended.clone()); + path.pop(); + path.push(extended); + path.push(Uuid::nil()); + assert_eq!(id.path, path); + } + } +} +*/ + +struct Cache { + data: BTreeMap, +} + +impl Cache { + fn new() -> Self { + Self { + data: BTreeMap::new(), + } + } + + fn add_database(&mut self, name: S) + where + S: Into, + { + self.data.insert(name.into(), IDPath::new()); + } + + fn get_databases(&self) -> Vec { + self.data.keys().cloned().collect() + } +} + +#[cfg(test)] +mod caches { + use super::*; + + #[test] + fn create_cache() { + let cache = Cache::new(); + let dbs = cache.get_databases(); + assert!(dbs.is_empty()); + } + + /* + #[test] + fn add_databases() { + let mut cache = Cache::new(); + cache.add_database("zed"); + cache.add_database("alpha".to_string()); + cache.add_database("beta"); + cache.add_database("gamma".to_string()); + assert_eq!(cache.get_databases(), ["alpha", "beta", "gamma", "zed"]); + } + */ +} diff --git a/src/data/mod.rs b/src/data/mod.rs index ab4bff9..c62797e 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -4,7 +4,12 @@ pub mod id; mod record; pub mod table; -use std::collections::BTreeMap; +use std::{ + collections::BTreeMap, + sync::mpsc::{Receiver, Sender, channel}, + thread::spawn, +}; +use super::Message; use uuid::Uuid; #[derive(PartialEq, Eq, Hash, PartialOrd, Ord, Clone, Debug)] @@ -33,7 +38,7 @@ impl IDPath { } #[cfg(test)] -mod ids { +mod idpaths { use super::*; #[test] @@ -70,47 +75,42 @@ mod ids { } } -struct Cache { - data: BTreeMap, +struct Data { + router_tx: Sender, + data_rx: Receiver, } -impl Cache { - fn new() -> Self { +impl Data { + fn new(router_tx: Sender, data_rx: Receiver) -> Self { Self { - data: BTreeMap::new(), + router_tx: router_tx, + data_rx: data_rx, } } - fn add_database(&mut self, name: S) - where - S: Into, - { - self.data.insert(name.into(), IDPath::new()); + pub fn start(router_tx: Sender) -> Sender { + let (data_tx, data_rx) = channel(); + spawn(move || { + let mut req = Data::new(router_tx, data_rx); + req.listen(); + }); + data_tx } - fn get_databases(&self) -> Vec { - self.data.keys().cloned().collect() + fn listen(&mut self) { + loop { + let msg = self.data_rx.recv().unwrap(); + } } } #[cfg(test)] -mod caches { +mod requests { use super::*; #[test] - fn create_cache() { - let cache = Cache::new(); - let dbs = cache.get_databases(); - assert!(dbs.is_empty()); - } - - #[test] - fn add_databases() { - let mut cache = Cache::new(); - cache.add_database("zed"); - cache.add_database("alpha".to_string()); - cache.add_database("beta"); - cache.add_database("gamma".to_string()); - assert_eq!(cache.get_databases(), ["alpha", "beta", "gamma", "zed"]); + fn add_database() { + let (tx, rx) = channel(); + let data_tx = Data::start(tx); } } diff --git a/src/lib.rs b/src/lib.rs index 69b0131..0c8c0e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,6 +11,54 @@ use router::Router; use session::{Session, SessionData, SessionMsg}; use std::sync::mpsc::{channel, Sender}; +struct Request; + +struct Record; + +struct Response { + headers: Vec, + records: Vec, +} + +impl Response { + fn new() -> Self { + Self { + headers: Vec::new(), + records: Vec::new(), + } + } + + fn count(&self) -> usize { + 0 + } + + fn add_header(&mut self, name: S) where S: Into { + self.headers.push(name.into()); + } +} + +#[cfg(test)] +mod responses { + use super::*; + + #[test] + fn create_response() { + let res = Response::new(); + assert!(res.headers.is_empty()); + assert!(res.records.is_empty()); + assert_eq!(res.count(), 0); + } + + #[test] + fn addA_header() { + let mut res = Response::new(); + res.add_header("one"); + assert_eq!(res.headers, ["one"]); + res.add_header("two".to_string()); + assert_eq!(res.headers, ["one", "two"]); + } +} + /// Support functions for Messages. pub trait Msg { fn to_msgdata(&self) -> MsgData;