use std::fmt::{self, Display};
use datafusion_common::DFSchemaRef;
#[derive(Clone, PartialEq, Eq, Hash)]
pub enum Statement {
TransactionStart(TransactionStart),
TransactionEnd(TransactionEnd),
SetVariable(SetVariable),
}
impl Statement {
pub fn schema(&self) -> &DFSchemaRef {
match self {
Statement::TransactionStart(TransactionStart { schema, .. }) => schema,
Statement::TransactionEnd(TransactionEnd { schema, .. }) => schema,
Statement::SetVariable(SetVariable { schema, .. }) => schema,
}
}
pub fn name(&self) -> &str {
match self {
Statement::TransactionStart(_) => "TransactionStart",
Statement::TransactionEnd(_) => "TransactionEnd",
Statement::SetVariable(_) => "SetVariable",
}
}
pub fn display(&self) -> impl fmt::Display + '_ {
struct Wrapper<'a>(&'a Statement);
impl<'a> Display for Wrapper<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self.0 {
Statement::TransactionStart(TransactionStart {
access_mode,
isolation_level,
..
}) => {
write!(f, "TransactionStart: {access_mode:?} {isolation_level:?}")
}
Statement::TransactionEnd(TransactionEnd {
conclusion,
chain,
..
}) => {
write!(f, "TransactionEnd: {conclusion:?} chain:={chain}")
}
Statement::SetVariable(SetVariable {
variable, value, ..
}) => {
write!(f, "SetVariable: set {variable:?} to {value:?}")
}
}
}
}
Wrapper(self)
}
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum TransactionConclusion {
Commit,
Rollback,
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum TransactionAccessMode {
ReadOnly,
ReadWrite,
}
#[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub enum TransactionIsolationLevel {
ReadUncommitted,
ReadCommitted,
RepeatableRead,
Serializable,
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct TransactionStart {
pub access_mode: TransactionAccessMode,
pub isolation_level: TransactionIsolationLevel,
pub schema: DFSchemaRef,
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct TransactionEnd {
pub conclusion: TransactionConclusion,
pub chain: bool,
pub schema: DFSchemaRef,
}
#[derive(Clone, PartialEq, Eq, Hash)]
pub struct SetVariable {
pub variable: String,
pub value: String,
pub schema: DFSchemaRef,
}