use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use uuid::Uuid;
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SqlValue {
Null,
Bool(bool),
Integer(i64),
Float(f64),
Text(String),
Blob(Vec<u8>),
Json(Value),
Uuid(Uuid),
Timestamp(DateTime<Utc>),
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SqlStatement {
pub sql: String,
pub params: Vec<SqlValue>,
pub label: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SqlColumn {
pub name: String,
pub value: SqlValue,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SqlRow {
pub columns: Vec<SqlColumn>,
}
impl SqlRow {
pub fn get(&self, name: &str) -> Option<&SqlValue> {
self.columns
.iter()
.find(|c| c.name == name)
.map(|c| &c.value)
}
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SqlIsolation {
Default,
ReadCommitted,
RepeatableRead,
Serializable,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SqlTxOptions {
pub read_only: bool,
pub isolation: SqlIsolation,
pub label: Option<String>,
}
impl Default for SqlTxOptions {
fn default() -> Self {
Self {
read_only: false,
isolation: SqlIsolation::Default,
label: None,
}
}
}