From 046d71e606f34ce301c8ac639fd8ddd414ef33e6 Mon Sep 17 00:00:00 2001 From: Jeff Baskin Date: Sat, 21 Mar 2026 11:44:49 -0400 Subject: [PATCH] Made regular tables request session info. --- src/document/create.rs | 59 +++++++++++++++++++++++++++++++++++++- src/document/definition.rs | 7 +++++ src/document/session.rs | 2 +- 3 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/document/create.rs b/src/document/create.rs index dab666f..68361bc 100644 --- a/src/document/create.rs +++ b/src/document/create.rs @@ -1,4 +1,5 @@ -use super::{InternalRecord, InternalRecords, Oid}; +use super::Session; +use super::{DocFeature, InternalRecord, InternalRecords, Oid}; use crate::{ action::{Action, CalcValue, Calculation, MsgAction, Query, Records, Reply, Update}, document::{ @@ -452,8 +453,12 @@ impl DocumentFile { } fn listen(&mut self) { + let sess_name = Session::doc_names()[0].clone(); loop { let msg = self.rx.recv().unwrap(); + if !self.docdef.has_feature(&DocFeature::System) { + self.queue.send(Message::new(Query::new(sess_name.clone()))); + } let route = msg.get_route(); for (route_id, doc_func) in self.routes.clone().iter() { if route == route_id.into() { @@ -782,3 +787,55 @@ impl DocumentFile { .send(msg.forward(self.name_id.clone(), action.clone())); } } + +#[cfg(test)] +mod internal_features { + use super::*; + use crate::{Name, TestMoreThanText}; + use std::sync::mpsc::RecvTimeoutError; + + #[test] + fn do_system_documents_ignores_session() { + let sess_name = Session::doc_names()[0].clone(); + let mut test_env = TestMoreThanText::new(); + let mut mtt = test_env.get_morethantext(); + let name = Name::english("something"); + let docdef = DocDef::system(name.clone()); + mtt.create_document(docdef); + let path = Path::new( + Include::All, + Include::Just(sess_name.clone().into()), + Include::Just(Action::Query), + ); + test_env.register_channel(vec![path]); + mtt.records(Query::new(name)).unwrap(); + match test_env.recv() { + Ok(msg) => unreachable!("got {:?} should have timed out", msg), + Err(err) => match err { + RecvTimeoutError::Timeout => {} + _ => unreachable!("got {:?}, should have timed out", err), + }, + } + } + + #[test] + fn do_normal_definitions_request_session() { + let sess_name = Session::doc_names()[0].clone(); + let mut test_env = TestMoreThanText::new(); + let mut mtt = test_env.get_morethantext(); + let name = Name::english("something"); + let docdef = DocDef::new(name.clone()); + mtt.create_document(docdef); + let path = Path::new( + Include::All, + Include::Just(sess_name.clone().into()), + Include::Just(Action::Query), + ); + test_env.register_channel(vec![path]); + mtt.records(Query::new(name)).unwrap(); + match test_env.recv() { + Ok(msg) => {} + Err(err) => unreachable!("got {:?}, should have requested session", err), + } + } +} diff --git a/src/document/definition.rs b/src/document/definition.rs index 42cc5fb..0137add 100644 --- a/src/document/definition.rs +++ b/src/document/definition.rs @@ -313,6 +313,13 @@ impl DocDef { &mut self.field_names } + pub fn has_feature(&self, feature: &DocFeature) -> bool { + match self.features.get(feature) { + Some(_) => true, + None => false, + } + } + pub fn add_field(&mut self, names: Vec, ftype: FieldType) { let id = self.field_names.add_names(names).unwrap(); self.fields.insert(id, FieldSetting::new(ftype)); diff --git a/src/document/session.rs b/src/document/session.rs index ce26a03..ef6acfa 100644 --- a/src/document/session.rs +++ b/src/document/session.rs @@ -50,7 +50,7 @@ impl Session { let name_expire = Self::expire_field_names()[0].clone(); let name_lang = Self::language_field_names()[0].clone(); - let mut docdef = DocDef::with_names(Self::doc_names()); + let mut docdef = DocDef::system_with_names(Self::doc_names()); let mut calc = Calculation::new(Operand::Add); calc.add_value(FieldType::DateTime).unwrap();