use serde::{Deserialize, Serialize};
pub type SchemaCatalog = Vec<(Schema, Vec<Table>)>;
use crate::value::Value;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Schema {
pub name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum TableKind {
Table,
View,
MaterializedView,
SystemTable,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Table {
pub schema: String,
pub name: String,
pub kind: TableKind,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Column {
pub name: String,
pub data_type: String,
pub nullable: bool,
pub primary_key: bool,
pub default: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TableSchema {
pub table: Table,
pub columns: Vec<Column>,
#[serde(default)]
pub indexes: Vec<Index>,
#[serde(default)]
pub foreign_keys: Vec<ForeignKey>,
#[serde(default)]
pub unique_constraints: Vec<UniqueConstraint>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Index {
pub name: String,
pub columns: Vec<String>,
pub unique: bool,
pub primary: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ForeignKey {
pub name: String,
pub columns: Vec<String>,
pub referenced_schema: Option<String>,
pub referenced_table: String,
pub referenced_columns: Vec<String>,
pub on_update: Option<ReferentialAction>,
pub on_delete: Option<ReferentialAction>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub enum ReferentialAction {
NoAction,
Restrict,
Cascade,
SetNull,
SetDefault,
}
impl ReferentialAction {
pub const fn as_sql(self) -> &'static str {
match self {
Self::NoAction => "NO ACTION",
Self::Restrict => "RESTRICT",
Self::Cascade => "CASCADE",
Self::SetNull => "SET NULL",
Self::SetDefault => "SET DEFAULT",
}
}
pub fn from_engine_token(token: &str) -> Option<Self> {
match token.trim().to_ascii_uppercase().as_str() {
"NO ACTION" => Some(Self::NoAction),
"RESTRICT" => Some(Self::Restrict),
"CASCADE" => Some(Self::Cascade),
"SET NULL" => Some(Self::SetNull),
"SET DEFAULT" => Some(Self::SetDefault),
_ => None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UniqueConstraint {
pub name: String,
pub columns: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Row(pub Vec<Value>);
impl Row {
pub fn get(&self, idx: usize) -> Option<&Value> {
self.0.get(idx)
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct QueryResult {
pub columns: Vec<ColumnHeader>,
pub rows: Vec<Row>,
pub rows_affected: Option<u64>,
pub elapsed_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColumnHeader {
pub name: String,
pub data_type: String,
}
impl QueryResult {
pub fn empty() -> Self {
Self::default()
}
}