class ArJdbc::Tasks::DB2DatabaseTasks

Public Instance Methods

create() click to toggle source
# File lib/arjdbc/tasks/db2_database_tasks.rb, line 7
def create
  raise "AR-JDBC adapter 'DB2' does not support create_database"
end
purge() click to toggle source
# File lib/arjdbc/tasks/db2_database_tasks.rb, line 11
def purge
  establish_connection(config)
  connection.recreate_database
end
structure_dump(filename) click to toggle source

NOTE: does not work correctly (on non AS400) due driver meta data issue

also try db2move e.g. `db2move SAMPLE EXPORT -sn db2inst`

  • where SAMPLE is the database name

  • and -sn specified schema name

# File lib/arjdbc/tasks/db2_database_tasks.rb, line 23
def structure_dump(filename)
  establish_connection(config)
  dump = File.open(filename, "w:utf-8")
  
  schema_name = connection.schema.upcase if connection.schema
  meta_data = connection.jdbc_connection.meta_data
  tables_rs = meta_data.getTables(nil, schema_name, nil, ["TABLE"].to_java(:String))
  
  have_scale = ArJdbc::DB2::HAVE_SCALE
  have_precision = ArJdbc::DB2::HAVE_LIMIT + ArJdbc::DB2::HAVE_LIMIT
  
  while tables_rs.next
    table_name = tables_rs.getString('TABLE_NAME')
    dump << "CREATE TABLE #{connection.quote_table_name(table_name)} (\n"
    
    cols_rs = meta_data.getColumns(nil, schema_name, table_name, nil)
    begin
      first_col = true
      while cols_rs.next
        column_name = cols_rs.getString(4)
        default = cols_rs.getString(13)
        default = default.empty? ? "" : " DEFAULT #{default}" if default
        type = cols_rs.getString(6)
        precision, scale = cols_rs.getString(7), cols_rs.getString(9)
        column_size = ""
        if scale && have_scale.include?(type)
          column_size = "(#{precision},#{scale})"
        elsif precision && have_precision.include?(type)
          column_size = "(#{precision})"
        end
        nulling = ( cols_rs.getString(18) == 'NO' ? " NOT NULL" : nil )
        autoinc = ( cols_rs.getString(23) == 'YES' ? " GENERATED ALWAYS AS IDENTITY" : nil )
        
        create_column = connection.quote_column_name(column_name)
        create_column << " #{type}"
        create_column << column_size
        create_column << nulling.to_s
        create_column << default.to_s
        create_column << autoinc.to_s
        
        create_column = first_col ? "  #{create_column}" : ",\n  #{create_column}"
        dump << create_column

        first_col = false
      end
    ensure
      cols_rs.close
    end

    dump << "\n);\n\n"

    pk_rs = meta_data.getPrimaryKeys(nil, schema_name, table_name)
    primary_keys = {}
    begin
      while pk_rs.next
        name = pk_rs.getString(6)
        primary_keys[name] ||= []
        primary_keys[name] << pk_rs.getString(4)
      end
    ensure
      pk_rs.close
    end
    primary_keys.each do |constraint_name, cols|
      dump << "ALTER TABLE #{connection.quote_table_name(table_name)}\n"
      dump << "  ADD CONSTRAINT #{constraint_name}\n"
      dump << "    PRIMARY KEY (#{cols.join(', ')});\n\n"
    end
  end
  
  dump.close
end
structure_load(filename) click to toggle source
# File lib/arjdbc/tasks/db2_database_tasks.rb, line 95
def structure_load(filename)
  establish_connection(config)
  IO.read(filename).split(/;\n*/m).each do |ddl| 
    connection.execute ddl.sub(/;$/, '')
  end
end