use crate::ctx::{Context, MutableContext};
use crate::dbs::Options;
use crate::dbs::Statement;
use crate::doc::Document;
use crate::err::Error;
use crate::sql::value::Value;
use reblessive::tree::Stk;
impl Document {
pub(super) async fn process_table_events(
&mut self,
stk: &mut Stk,
ctx: &Context,
opt: &Options,
stm: &Statement<'_>,
) -> Result<(), Error> {
if opt.import {
return Ok(());
}
if !self.changed() {
return Ok(());
}
let opt = &opt.new_with_perms(false);
for ev in self.ev(ctx, opt).await?.iter() {
let evt = if stm.is_delete() {
Value::from("DELETE")
} else if self.is_new() {
Value::from("CREATE")
} else {
Value::from("UPDATE")
};
let after = self.current.doc.as_arc();
let before = self.initial.doc.as_arc();
let doc = match stm.is_delete() {
true => &mut self.initial,
false => &mut self.current,
};
let mut ctx = MutableContext::new(ctx);
ctx.add_value("event", evt.into());
ctx.add_value("value", doc.doc.as_arc());
ctx.add_value("after", after);
ctx.add_value("before", before);
let ctx = ctx.freeze();
let val = ev.when.compute(stk, &ctx, opt, Some(doc)).await?;
if val.is_truthy() {
for v in ev.then.iter() {
v.compute(stk, &ctx, opt, Some(doc)).await?;
}
}
}
Ok(())
}
}