class Dbsketch::Rendering::SQL::DatabaseRenderer

Public Class Methods

new(index_renderer: nil, operation_renderer: nil, table_renderer: nil, trigger_renderer: nil, view_renderer: nil, options: {}) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 19
def initialize index_renderer: nil, operation_renderer: nil, table_renderer: nil, trigger_renderer: nil, view_renderer: nil, options: {}
        ### Preconditions
        raise ArgumentError, "index_renderer is not a Dbsketch::Rendering::SQL::IndexRenderer" unless nil == index_renderer or index_renderer.is_a? IndexRenderer
        raise ArgumentError, "operation_renderer is not a Dbsketch::Rendering::SQL::OperationRenderer" unless nil == operation_renderer or operation_renderer.is_a? OperationRenderer
        raise ArgumentError, "table_renderer is not a Dbsketch::Rendering::SQL::TableRenderer" unless nil == table_renderer or table_renderer.is_a? TableRenderer
        raise ArgumentError, "trigger_renderer is not a Dbsketch::Rendering::SQL::TriggerRenderer" unless nil == trigger_renderer or trigger_renderer.is_a? TriggerRenderer
        raise ArgumentError, "view_renderer is not a Dbsketch::Rendering::SQL::ViewRenderer" unless nil == view_renderer or view_renderer.is_a? ViewRenderer
        raise ArgumentError, "options is not a Hash" unless options.is_a? Hash
        raise ArgumentError, "options[:drop_if_exists] has not a value in [:before, :inline]" unless [nil, :before, :inline].include? options[:drop_if_exists]
        raise ArgumentError, "options[:order_by_dependencies] == true is not compatible with options[:drop_if_exists] == :inline" if options[:order_by_dependencies] and :inline == options[:drop_if_exists]
        ###
        @options = {
                :drop_if_exists                   => nil,
                :go_statements                    => true,
                :order_by_dependencies    => true,
                :pretty                                   => false,
        }.merge options
        @index_renderer = (nil == index_renderer ? IndexRenderer.new : index_renderer)
        @operation_renderer = (nil == operation_renderer ? OperationRenderer.new : operation_renderer)
        @table_renderer = (nil == table_renderer ? TableRenderer.new(:options => @options) : table_renderer)
        @trigger_renderer = (nil == trigger_renderer ? TriggerRenderer.new : trigger_renderer)
        @view_renderer = (nil == view_renderer ? ViewRenderer.new : view_renderer)
end

Public Instance Methods

alter(database_diff) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 57
def alter database_diff
        ### Preconditions
        raise ArgumentError, "database_diff is not a Dbsketch::Comparison::DatabaseDiff" unless database_diff.is_a? Dbsketch::Comparison::DatabaseDiff
        ###
        separator = ";\n" + (@options[:go_statements] ? "go\n" : '')

        diffs = database_diff.indexes + database_diff.operations + database_diff.tables + database_diff.triggers + database_diff.views
        deletions = diffs.select { |d| d.deletion? }.map { |i| drop_item i.old_value }
        changes = diffs.select { |d| d.change? }.map { |i| alter_item(i) }
        creations = diffs.select { |d| d.addition? }.map { |i| create_item i.new_value }

        (deletions + changes + creations).flatten.compact.join(separator) + separator
end
create(database) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 43
def create database
        ### Preconditions
        raise ArgumentError, "database is not a Dbsketch::Model::Database" unless database.is_a? Dbsketch::Model::Database
        ###
        database.order_items! if @options[:order_by_dependencies]
        if :before == @options[:drop_if_exists]
                drop_before_and_create database
        elsif :inline == @options[:drop_if_exists]
                drop_inline_and_create database
        else
                only_create database
        end
end

Private Instance Methods

alter_item(item_diff) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 105
def alter_item item_diff
        if item_diff.old_value.is_a? Dbsketch::Model::Index
                [drop_item(item_diff.old_value), create_item(item_diff.new_value)]
        elsif item_diff.old_value.is_a? Dbsketch::Model::Operation
                [drop_item(item_diff.old_value), create_item(item_diff.new_value)]
        elsif item_diff.old_value.is_a? Dbsketch::Model::Table
                @table_renderer.alter item_diff
        elsif item_diff.old_value.is_a? Dbsketch::Model::Trigger
                [drop_item(item_diff.old_value), create_item(item_diff.new_value)]
        elsif item_diff.old_value.is_a? Dbsketch::Model::View
                [drop_item(item_diff.old_value), create_item(item_diff.new_value)]
        end
end
create_item(item) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 73
def create_item item
        if item.is_a? Dbsketch::Model::CustomCode
                item.do_code
        elsif item.is_a? Dbsketch::Model::Index
                @index_renderer.create item
        elsif item.is_a? Dbsketch::Model::Operation
                @operation_renderer.create item
        elsif item.is_a? Dbsketch::Model::Table
                @table_renderer.create item
        elsif item.is_a? Dbsketch::Model::Trigger
                @trigger_renderer.create item
        elsif item.is_a? Dbsketch::Model::View
                @view_renderer.create item
        end
end
drop_before_and_create(database) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 129
def drop_before_and_create database
        separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
        items_to_drop = @options[:order_by_dependencies] ? database.items.reverse : database.items
        (items_to_drop.map { |i| drop_item(i) } + database.items.map { |i| create_item(i) }).flatten.compact.join(separator) + separator
end
drop_inline_and_create(database) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 124
def drop_inline_and_create database
        separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
        database.items.map { |i| [drop_item(i), create_item(i)] }.flatten.compact.join(separator) + separator
end
drop_item(item) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 89
def drop_item item
        if item.is_a? Dbsketch::Model::CustomCode
                item.undo_code
        elsif item.is_a? Dbsketch::Model::Index
                @index_renderer.drop item
        elsif item.is_a? Dbsketch::Model::Operation
                @operation_renderer.drop item
        elsif item.is_a? Dbsketch::Model::Table
                @table_renderer.drop item
        elsif item.is_a? Dbsketch::Model::Trigger
                @trigger_renderer.drop item
        elsif item.is_a? Dbsketch::Model::View
                @view_renderer.drop item
        end
end
only_create(database) click to toggle source
# File lib/dbsketch/rendering/sql/database_renderer.rb, line 119
def only_create database
        separator = ";\n" + (@options[:go_statements] ? "go\n" : '')
        database.items.map { |i| create_item i }.flatten.compact.join(separator) + separator
end