use crate::ast::statements::{
ddl::{AlterStatement, CreateStatement, DropStatement},
dml::{DeleteStatement, InsertStatement, UpdateStatement},
query::SelectStatement,
};
use core::range::Range;
use oak_core::source::{SourceBuffer, ToSource};
use std::sync::Arc;
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SqlRoot {
pub statements: Vec<SqlStatement>,
#[serde(with = "oak_core::serde_range")]
pub span: Range<usize>,
}
impl ToSource for SqlRoot {
fn to_source(&self, buffer: &mut SourceBuffer) {
for (i, stmt) in self.statements.iter().enumerate() {
if i > 0 {
buffer.push(";");
}
stmt.to_source(buffer);
}
if !self.statements.is_empty() {
buffer.push(";");
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SqlStatement {
Select(SelectStatement),
Insert(InsertStatement),
Update(UpdateStatement),
Delete(DeleteStatement),
Create(CreateStatement),
Drop(DropStatement),
Alter(AlterStatement),
Error {
message: Arc<str>,
#[serde(with = "oak_core::serde_range")]
span: Range<usize>,
},
Unknown {
#[serde(with = "oak_core::serde_range")]
span: Range<usize>,
},
}
impl ToSource for SqlStatement {
fn to_source(&self, buffer: &mut SourceBuffer) {
match self {
SqlStatement::Select(s) => s.to_source(buffer),
SqlStatement::Insert(s) => s.to_source(buffer),
SqlStatement::Update(s) => s.to_source(buffer),
SqlStatement::Delete(s) => s.to_source(buffer),
SqlStatement::Create(s) => s.to_source(buffer),
SqlStatement::Drop(s) => s.to_source(buffer),
SqlStatement::Alter(s) => s.to_source(buffer),
SqlStatement::Error { message, .. } => {
buffer.push("/* ERROR: ");
buffer.push(message);
buffer.push(" */");
}
SqlStatement::Unknown { .. } => {}
}
}
}