class DbCompile::Transaction

Encapsulates entire transaction and dependency checking

Public Class Methods

new(path) click to toggle source
# File lib/dbcompile/transaction.rb, line 11
def initialize(path)
  @path = path
  @run_queue = []
  @deps_queue = []
  @manifest = YAML::load_file(File.join(path, 'compile.yml'))

  @manifest.each{ |construct_name, data|
    if data
      data.each{ |object_name, dependencies|
        install_dependencies(construct_name, object_name)
      }
    end
  }
end

Public Instance Methods

build_contruct(construct_name, object_name) click to toggle source
# File lib/dbcompile/transaction.rb, line 46
def build_contruct(construct_name, object_name)
  klass = "DbCompile::#{construct_name.singularize.camelize}".constantize
  klass.new(object_name, @path)
end
execute() click to toggle source
# File lib/dbcompile/transaction.rb, line 51
def execute
  @run_queue.each{ |construct_name, object_name|
    construct = build_contruct(construct_name, object_name)
    msg = "Compiling #{construct.path}"
    puts msg
    ActiveRecord::Base.logger.info msg
    construct.execute
  }
end
install_dependencies(construct_name, object_name) click to toggle source
# File lib/dbcompile/transaction.rb, line 26
def install_dependencies(construct_name, object_name)
  if @deps_queue.include? [construct_name, object_name]
    raise CircularDependenciesException.new(
      "Dependency of #{construct_name} #{object_name} referenced it as a dependency!")
  end
  @deps_queue << [construct_name, object_name]
  if not @run_queue.include? [construct_name, object_name]
    dependencies = @manifest[construct_name][object_name]
    if dependencies
      dependencies.each{ |dep_construct_name, name_list|
        name_list.each{ |dep_object_name|
          install_dependencies(dep_construct_name, dep_object_name)
        }
      }
    end
    @run_queue << [construct_name, object_name]
  end
  @deps_queue.pop
end
verify() click to toggle source
# File lib/dbcompile/transaction.rb, line 61
def verify
  msg = "Verifying compilation"
  puts msg
  ActiveRecord::Base.logger.info msg
  no_errors = true
  @run_queue.each{ |construct_name, object_name|
    construct = build_contruct(construct_name, object_name)
    case construct.verify
      when nil
        msg = "#{construct_name.capitalize} #{object_name} could not be verified."
      when true
        msg = "#{construct_name.capitalize} #{object_name} successfully created."
      when false
        msg = "#{construct_name.capitalize} #{object_name} creation failed."
        no_errors = false
    end
    puts msg
    ActiveRecord::Base.logger.info msg
  }
  return no_errors
end