require 'kvm/subversion' require 'kvm/source' require 'kvm/db/jdbc_adapter' require 'kvm/log' #require 'rake' #require 'ant' module KVM class Impex IMPEX_SOURCE=KVM::Source.new(KVM::Subversion::IMPEX_TOOL_REPO_PATH) DRIVERS_DIRECTORY_OPT = 'drivers.directory' DEFAULT_DRIVERS_DIRECTORY = '/opt/java/drivers' BUNDLED_ANT = File.expand_path(File.join('..', '..', 'support', 'ant'), File.dirname(__FILE__)) def initialize(dir) @dir = dir end def create_ddl(schema_dir, db_type, output_dir, opts = {}) run_gensql('create-ddl', schema_dir, db_type, { 'torque.sql.dir' => "#{output_dir}/sql" }.merge(opts)) end def dataxml_to_sql(schema_dir, db_type, output_dir, opts = {}) # generates datasql subdir in release run_gensql('dataxml-to-sql', schema_dir, db_type, opts) mv_dir "#{schema_dir}/datasql/", "#{output_dir}" end def prepare_sqlloader(schema_dir, db_type, output_dir, opts = {}) # generates sqlloader subdir in release run_gensql('prepare-sqlloader', schema_dir, db_type, opts) mv_dir "#{schema_dir}/sqlloader/", "#{output_dir}" end def apply_ddl(dataset_dir, db_type, url, user, password, opts = {}) run_db('apply-ddl', dataset_dir, db_type, url, user, password, opts) end def apply_data_sql(dataset_dir, db_type, url, user, password, opts = {}) run_db('apply-data-sql', dataset_dir, db_type, url, user, password, opts) end def apply_constraint_ddl(dataset_dir, db_type, url, user, password, opts = {}) run_db('apply-constraint-ddl', dataset_dir, db_type, url, user, password, opts) end # compound commands def generate_sql(schema_dir, db_type, output_dir, opts = {}) LOG.info "Generating sql #{schema_dir} #{db_type} #{output_dir}" create_ddl(schema_dir, db_type, output_dir, opts) dataxml_to_sql(schema_dir, db_type, output_dir) #prepare_sqlloader(schema_dir, db_type, output_dir) end # like 'import' except can be used against pregenerated sql datasets def apply_sql(dataset_dir, db_type, url, user, password, opts = {}) LOG.info "Applying sql #{dataset_dir} #{db_type}" # first run without constraints apply_ddl(dataset_dir, db_type, url, user, password, opts) && # insert data apply_data_sql(dataset_dir, db_type, url, user, password, opts) && # apply constraints apply_constraint_ddl(dataset_dir, db_type, url, user, password, opts) end protected def mv_dir(src, tgt_parent) FileUtils.mkdir_p tgt_parent FileUtils.mv src, tgt_parent end def run_db(command, dataset_dir, db_type, url, user, password, opts = {}) run(command, { 'torque.schema.dir' => dataset_dir, 'import.torque.database' => db_type, 'import.torque.database.driver' => KVM::Db::JdbcAdapter::DB_DRIVERS[db_type], 'import.torque.database.url' => url, 'import.torque.database.user' => user, 'import.torque.database.password' => password }.merge(opts)) end def run_gensql(command, schema_dir, db_type, opts = {}) run(command, { 'torque.schema.dir' => schema_dir, 'import.torque.database' => db_type }.merge(opts)) end def run(command, opts) LOG.debug command LOG.debug opts # HACK: because i don't have time to futz with this drivers_dir = ENV['JDBC_DRIVERS_DIR'] || DEFAULT_DRIVERS_DIRECTORY opts[DRIVERS_DIRECTORY_OPT] = drivers_dir unless opts[DRIVERS_DIRECTORY_OPT] prop_array = opts.map { |k, v| "-D#{k}=#{v}" } LOG.debug prop_array ant_args = prop_array + [ "-f", "#{@dir}/impex/build.xml", command ] command_line = ([ File.join(BUNDLED_ANT, 'bin', 'ant') ] + ant_args).join(" ") LOG.debug command_line system (command_line) || raise("Error running impex") end IMPEX = KVM::Impex.new(IMPEX_SOURCE.path) end end