use serde::ser::SerializeStruct;
use serde::{Deserialize, Serialize, Serializer};
use crate::results::MinimalFallback;
use super::{BlobStats, BooleanStats, DateStats, NumericStats, TextStats};
#[derive(Debug, Clone, Deserialize, Default)]
pub struct ColumnInfo {
pub name: String,
pub type_name: Option<String>,
pub not_null: Option<bool>,
pub default_value: Option<String>,
pub is_primary_key: Option<bool>,
pub is_foreign_key: Option<bool>,
pub null_percentage: Option<f64>,
pub unique_count: Option<usize>,
pub numeric_stats: Option<NumericStats>,
pub date_stats: Option<DateStats>,
pub boolean_stats: Option<BooleanStats>,
pub text_stats: Option<TextStats>,
pub blob_stats: Option<BlobStats>,
}
impl Serialize for ColumnInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("ColumnInfo", 12)?;
state.serialize_field("name", &self.name)?;
crate::serialize_optional!(state, self.type_name, "type_name");
crate::serialize_optional!(state, self.not_null, "not_null");
crate::serialize_optional!(state, self.default_value, "default_value");
crate::serialize_optional!(state, self.is_primary_key, "is_primary_key");
crate::serialize_optional!(state, self.is_foreign_key, "is_foreign_key");
crate::serialize_optional!(state, self.null_percentage, "null_percentage");
crate::serialize_optional!(state, self.unique_count, "unique_count");
crate::serialize_optional!(state, self.numeric_stats, "numeric_stats");
crate::serialize_optional!(state, self.date_stats, "date_stats");
crate::serialize_optional!(state, self.boolean_stats, "boolean_stats");
crate::serialize_optional!(state, self.text_stats, "text_stats");
crate::serialize_optional!(state, self.blob_stats, "blob_stats");
state.end()
}
}
#[derive(Debug, Clone, Deserialize, Default, Serialize)]
pub struct ForeignKeyInfo {
pub column: String,
pub references_table: String,
pub references_column: String,
}
#[derive(Debug, Clone, Deserialize, Default, Serialize)]
pub struct IndexInfo {
pub name: String,
pub table: String,
pub columns: Vec<String>,
pub unique: Option<bool>,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct TableInfo {
pub name: String,
pub row_count: Option<usize>,
pub column_count: Option<usize>,
pub columns: Option<Vec<ColumnInfo>>,
pub primary_keys: Option<Vec<String>>,
pub foreign_keys: Option<Vec<ForeignKeyInfo>>,
pub indexes: Option<Vec<IndexInfo>>,
pub table_size: Option<usize>,
}
impl Serialize for TableInfo {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("TableInfo", 8)?;
state.serialize_field("name", &self.name)?;
crate::serialize_optional!(state, self.row_count, "row_count");
crate::serialize_optional!(state, self.column_count, "column_count");
crate::serialize_optional!(state, self.columns, "columns");
crate::serialize_optional!(state, self.primary_keys, "primary_keys");
crate::serialize_optional!(state, self.foreign_keys, "foreign_keys");
crate::serialize_optional!(state, self.indexes, "indexes");
crate::serialize_optional!(state, self.table_size, "table_size");
state.end()
}
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct SqliteMetadata {
pub file_size: Option<usize>,
pub page_size: Option<usize>,
pub sqlite_version: Option<String>,
pub encoding: Option<String>,
pub table_count: Option<usize>,
pub total_rows: Option<usize>,
pub tables: Option<Vec<TableInfo>>,
pub error: Option<String>,
}
impl Serialize for SqliteMetadata {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("SqliteMetadata", 8)?;
crate::serialize_optional!(state, self.file_size, "file_size");
crate::serialize_optional!(state, self.page_size, "page_size");
crate::serialize_optional!(state, self.sqlite_version, "sqlite_version");
crate::serialize_optional!(state, self.encoding, "encoding");
crate::serialize_optional!(state, self.table_count, "table_count");
crate::serialize_optional!(state, self.total_rows, "total_rows");
crate::serialize_optional!(state, self.tables, "tables");
crate::serialize_optional!(state, self.error, "error");
state.end()
}
}
crate::impl_minimal_fallback!(SqliteMetadata, file_size);