use anyhow::Result;
use crate::ctx::FrozenContext;
use crate::dbs::Options;
use crate::doc::CursorDoc;
use crate::expr::{Base, Value};
use crate::iam::{Action, ResourceKind};
use crate::val::{Datetime, TableName};
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub enum ShowSince {
Timestamp(Datetime),
Versionstamp(u64),
}
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub(crate) struct ShowStatement {
pub table: Option<TableName>,
pub since: ShowSince,
pub limit: Option<u32>,
}
impl ShowStatement {
#[instrument(level = "trace", name = "ShowStatement::compute", skip_all)]
pub(crate) async fn compute(
&self,
ctx: &FrozenContext,
opt: &Options,
_doc: Option<&CursorDoc>,
) -> Result<Value> {
ctx.is_allowed(opt, Action::View, ResourceKind::Table, Base::Db)?;
let txn = ctx.tx();
let (ns, db) = ctx.expect_ns_db_ids(opt).await?;
let r = crate::cf::read(&txn, ns, db, self.table.as_ref(), self.since.clone(), self.limit)
.await?;
let a = r.iter().cloned().map(|x| x.into_value()).collect::<Result<Vec<Value>>>()?;
Ok(a.into())
}
}