blob: 1e4fdd76a2a05db8a1e3eb4b97c960ead26def4f [file] [log] [blame]
#[cfg(feature = "uses_information_schema")]
use diesel::backend::Backend;
use diesel::deserialize::{FromSqlRow, Queryable};
#[cfg(feature = "sqlite")]
use diesel::sqlite::Sqlite;
#[cfg(feature = "uses_information_schema")]
use super::information_schema::UsesInformationSchema;
use super::table_data::TableName;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ColumnInformation {
pub column_name: String,
pub type_name: String,
pub nullable: bool,
}
#[derive(Debug)]
pub struct ColumnType {
pub rust_name: String,
pub is_array: bool,
pub is_nullable: bool,
pub is_unsigned: bool,
}
use std::fmt;
impl fmt::Display for ColumnType {
fn fmt(&self, out: &mut fmt::Formatter) -> Result<(), fmt::Error> {
if self.is_nullable {
write!(out, "Nullable<")?;
}
if self.is_array {
write!(out, "Array<")?;
}
if self.is_unsigned {
write!(out, "Unsigned<")?;
}
write!(out, "{}", self.rust_name)?;
if self.is_unsigned {
write!(out, ">")?;
}
if self.is_array {
write!(out, ">")?;
}
if self.is_nullable {
write!(out, ">")?;
}
Ok(())
}
}
#[derive(Debug)]
pub struct ColumnDefinition {
pub sql_name: String,
pub rust_name: String,
pub ty: ColumnType,
pub docs: String,
}
impl ColumnInformation {
pub fn new<T, U>(column_name: T, type_name: U, nullable: bool) -> Self
where
T: Into<String>,
U: Into<String>,
{
ColumnInformation {
column_name: column_name.into(),
type_name: type_name.into(),
nullable,
}
}
}
#[cfg(feature = "uses_information_schema")]
impl<ST, DB> Queryable<ST, DB> for ColumnInformation
where
DB: Backend + UsesInformationSchema,
(String, String, String): FromSqlRow<ST, DB>,
{
type Row = (String, String, String);
fn build(row: Self::Row) -> Self {
ColumnInformation::new(row.0, row.1, row.2 == "YES")
}
}
#[cfg(feature = "sqlite")]
impl<ST> Queryable<ST, Sqlite> for ColumnInformation
where
(i32, String, String, bool, Option<String>, bool): FromSqlRow<ST, Sqlite>,
{
type Row = (i32, String, String, bool, Option<String>, bool);
fn build(row: Self::Row) -> Self {
ColumnInformation::new(row.1, row.2, !row.3)
}
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct ForeignKeyConstraint {
pub child_table: TableName,
pub parent_table: TableName,
pub foreign_key: String,
pub foreign_key_rust_name: String,
pub primary_key: String,
}
impl ForeignKeyConstraint {
pub fn ordered_tables(&self) -> (&TableName, &TableName) {
use std::cmp::{max, min};
(
min(&self.parent_table, &self.child_table),
max(&self.parent_table, &self.child_table),
)
}
}