use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TableInfo {
pub name: String,
pub columns: Vec<ColumnInfo>,
pub row_count: u64,
pub primary_key: Vec<String>,
pub create_sql: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ViewInfo {
pub name: String,
pub create_sql: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaObjectInfo {
pub name: String,
pub table_name: String,
pub create_sql: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ColumnInfo {
pub name: String,
pub col_type: String,
pub nullable: bool,
pub default_value: Option<String>,
pub is_primary_key: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum SqlValue {
Null,
Integer(i64),
Real(f64),
Text(String),
Blob(Vec<u8>),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct DatabaseSummary {
pub path: String,
pub tables: Vec<TableInfo>,
pub views: Vec<ViewInfo>,
pub indexes: Vec<SchemaObjectInfo>,
pub triggers: Vec<SchemaObjectInfo>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TablePage {
pub table_name: String,
pub columns: Vec<ColumnInfo>,
pub rows: Vec<Vec<SqlValue>>,
pub page: usize,
pub page_size: usize,
pub total_rows: u64,
pub sort: Option<TableSort>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TableSort {
pub column: String,
pub direction: SortDirection,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum SortDirection {
Asc,
Desc,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TableQuery {
pub page: usize,
pub page_size: usize,
pub sort: Option<TableSort>,
}
impl Default for TableQuery {
fn default() -> Self {
Self {
page: 0,
page_size: 100,
sort: None,
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SchemaDiff {
pub added_tables: Vec<TableInfo>,
pub removed_tables: Vec<TableInfo>,
pub modified_tables: Vec<TableSchemaDiff>,
pub unchanged_tables: Vec<String>,
pub added_indexes: Vec<SchemaObjectInfo>,
pub removed_indexes: Vec<SchemaObjectInfo>,
pub modified_indexes: Vec<(SchemaObjectInfo, SchemaObjectInfo)>,
pub added_triggers: Vec<SchemaObjectInfo>,
pub removed_triggers: Vec<SchemaObjectInfo>,
pub modified_triggers: Vec<(SchemaObjectInfo, SchemaObjectInfo)>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TableSchemaDiff {
pub table_name: String,
pub added_columns: Vec<ColumnInfo>,
pub removed_columns: Vec<ColumnInfo>,
pub modified_columns: Vec<(ColumnInfo, ColumnInfo)>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TableDataDiff {
pub table_name: String,
pub columns: Vec<String>,
pub added_rows: Vec<Vec<SqlValue>>,
pub removed_rows: Vec<Vec<SqlValue>>,
pub removed_row_keys: Vec<Vec<SqlValue>>,
pub modified_rows: Vec<RowModification>,
pub stats: DiffStats,
pub warnings: Vec<String>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RowModification {
pub primary_key: Vec<SqlValue>,
pub changes: Vec<CellChange>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct CellChange {
pub column: String,
pub old_value: SqlValue,
pub new_value: SqlValue,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct DiffStats {
pub total_rows_left: u64,
pub total_rows_right: u64,
pub added: u64,
pub removed: u64,
pub modified: u64,
pub unchanged: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Snapshot {
pub id: String,
pub name: String,
pub source_path: String,
pub created_at: String,
pub table_count: u32,
pub total_rows: u64,
}
impl SqlValue {
pub fn display(&self) -> String {
match self {
Self::Null => "NULL".to_owned(),
Self::Integer(value) => value.to_string(),
Self::Real(value) => value.to_string(),
Self::Text(value) => value.clone(),
Self::Blob(bytes) => format!("[BLOB: {} bytes]", bytes.len()),
}
}
}