datasources-sqlite 0.1.14

SQLite datasource provider
Documentation
use crate::driver::column_sql;
use datasources::{Column, CreateTableStatement, CreateTableStatementTextRenderer, TableConstraint};
use std::collections::HashSet;

pub struct SqliteCreateTableStatementRenderer;

impl CreateTableStatementTextRenderer for SqliteCreateTableStatementRenderer {
    fn type_name(&self, column: &Column) -> String {
        column_sql(&column.type_name)
            .map(str::to_string)
            .unwrap_or_else(|| column.type_name.clone())
    }

    fn identity(&self, column: &Column) -> String {
        if column.identity {
            " PRIMARY KEY AUTOINCREMENT".into()
        } else {
            String::new()
        }
    }

    fn render(&self, statement: &CreateTableStatement) -> String {
        let identity = statement
            .columns
            .iter()
            .filter(|column| column.identity)
            .map(|column| column.name.as_str())
            .collect::<HashSet<_>>();
        let mut parts = statement
            .columns
            .iter()
            .map(|column| self.column(column))
            .collect::<Vec<_>>();
        parts.extend(
            statement
                .constraints
                .iter()
                .filter(|constraint| match constraint {
                    TableConstraint::PrimaryKey(pk) => {
                        !pk.columns.iter().all(|column| identity.contains(column.as_str()))
                    }
                    _ => true,
                })
                .map(|constraint| self.constraint(constraint)),
        );
        format!(
            "CREATE TABLE {} ({}){}",
            self.quote(&statement.table),
            parts.join(", "),
            self.suffix()
        )
    }
}