use surrealdb_types::{SqlFormat, ToSql, write_sql};
use super::DefineKind;
use crate::fmt::CoverStmts;
use crate::sql::{Expr, Literal};
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(feature = "arbitrary", derive(arbitrary::Arbitrary))]
pub(crate) struct DefineSequenceStatement {
pub kind: DefineKind,
pub name: Expr,
pub batch: Expr,
pub start: Expr,
pub timeout: Expr,
}
impl Default for DefineSequenceStatement {
fn default() -> Self {
Self {
kind: DefineKind::Default,
name: Expr::Literal(Literal::None),
batch: Expr::Literal(Literal::Integer(0)),
start: Expr::Literal(Literal::Integer(0)),
timeout: Expr::Literal(Literal::None),
}
}
}
impl ToSql for DefineSequenceStatement {
fn fmt_sql(&self, f: &mut String, sql_fmt: SqlFormat) {
write_sql!(f, sql_fmt, "DEFINE SEQUENCE");
match self.kind {
DefineKind::Default => {}
DefineKind::Overwrite => write_sql!(f, sql_fmt, " OVERWRITE"),
DefineKind::IfNotExists => write_sql!(f, sql_fmt, " IF NOT EXISTS"),
}
write_sql!(
f,
sql_fmt,
" {} BATCH {} START {}",
CoverStmts(&self.name),
CoverStmts(&self.batch),
CoverStmts(&self.start)
);
if !matches!(self.timeout, Expr::Literal(Literal::None)) {
write_sql!(f, sql_fmt, " TIMEOUT {}", CoverStmts(&self.timeout));
}
}
}
impl From<DefineSequenceStatement> for crate::expr::statements::define::DefineSequenceStatement {
fn from(v: DefineSequenceStatement) -> Self {
Self {
kind: v.kind.into(),
name: v.name.into(),
batch: v.batch.into(),
start: v.start.into(),
timeout: v.timeout.into(),
}
}
}
impl From<crate::expr::statements::define::DefineSequenceStatement> for DefineSequenceStatement {
fn from(v: crate::expr::statements::define::DefineSequenceStatement) -> Self {
DefineSequenceStatement {
kind: v.kind.into(),
name: v.name.into(),
batch: v.batch.into(),
start: v.start.into(),
timeout: v.timeout.into(),
}
}
}