schema-sql-generator 0.2.0

A set of tools to manage relational database schemas
Documentation
use crate::common::generator_context::GeneratorContext;
use crate::common::view_generator::ViewGenerator;
use crate::sql_println;
use schema_model::model::view::View;

pub struct SqlServerViewGenerator {
    context: GeneratorContext,
}

impl SqlServerViewGenerator {
    pub fn new(context: GeneratorContext) -> Self {
        Self { context }
    }

    fn get_schema_name(view: &View) -> String {
        match view.schema_name() {
            Some(schema) if schema.eq_ignore_ascii_case("public") => "dbo".to_string(),
            Some(schema) => schema.to_string(),
            None => "dbo".to_string(),
        }
    }

    fn get_fully_qualified_name(view: &View) -> String {
        format!("{}.{}", Self::get_schema_name(view), view.name())
    }
}

impl ViewGenerator for SqlServerViewGenerator {
    fn output_views(&self) {
        let database_model = self.context.settings().database_model();
        let database_type = self.context.settings().database_type();
        let separator = self.context.settings().statement_separator();

        let views: Vec<View> = database_model
            .schemas()
            .iter()
            .flat_map(|schema| schema.views(database_type))
            .collect();

        if !views.is_empty() {
            self.context.with_writer(|writer| {
                for view in views {
                    let view_name = Self::get_fully_qualified_name(&view);
                    sql_println!(writer, "/* {} */", view_name);
                    sql_println!(writer, "if exists (select name from dbo.sysobjects where name = '{}' and type = 'V')", view.name());
                    sql_println!(writer, "   drop view {}{}", view_name, separator);
                    sql_println!(writer, "create view {} as", view_name);
                    sql_println!(writer, "   {}{}", view.sql(), separator);
                    sql_println!(writer, "");
                }
            });
        }
    }
}