#!/usr/bin/env ruby require 'builder/builder.rb' module Prick::SubCommand def self.build(database, username, schema, builddir: "schema", timer: nil, dump: nil) Timer.on! if timer time "Prick::Command#build" do begin super_conn = PgConn.new conn = nil builder = nil time "Load build object" do if super_conn.rdbms.exist? database conn = PgConn.new(database, username) exist = true else super_conn.rdbms.create database, owner: username conn = PgConn.new(database, username) exit = false end builder = Prick::Build::Builder.new(conn, builddir) if exist # Explicit schema is always rebuilt refresh = [builder.refresh_schemas, schema].compact.flatten.uniq keep = builder.keep_schemas.reject { |s| s == schema } # Rebuild non-existing keep-schemas keep.reject! { |schema| refresh << schema if !conn.schema.exist?(schema) } # Eliminate keep schemas from build pool builder.pool.delete_schema(keep) # Drop refresh schemes refresh.each { |schema| conn.schema.drop(schema, cascade: true) } end builder.pool.delete_schema(builder.pool.after_schema(schema)) if schema end case dump when :nodes; builder.nodes.reject { |node| node.is_a?(Build::BuildNode) }.map &:dump when :allnodes; builder.nodes.map &:dump when :batches; builder.dump when nil; else raise Prick::Error, "Illegal dump type: #{dump.inspect}" end && exit time "Execute build object" do builder.execute conn end rescue Prick::Error => ex $stderr.puts ex.message exit 1 rescue ::Command::Error => ex $stderr.puts ex.message exit 1 ensure super_conn&.terminate conn&.terminate end end end end