Module: JdbcSpec::MissingFunctionalityHelper

Included in:
Derby
Defined in:
lib/jdbc_adapter/missing_functionality_helper.rb

Instance Method Summary collapse

Instance Method Details

#alter_table(table_name, options = {}) ⇒ Object

Taken from SQLite adapter



5
6
7
8
9
10
11
12
13
14
# File 'lib/jdbc_adapter/missing_functionality_helper.rb', line 5

def alter_table(table_name, options = {}) #:nodoc:
  table_name = table_name.to_s.downcase
  altered_table_name = "altered_#{table_name}"
  caller = lambda {|definition| yield definition if block_given?}

  transaction do
    move_table(table_name, altered_table_name, options)
    move_table(altered_table_name, table_name, &caller)
  end
end

#copy_table(from, to, options = {}) ⇒ Object

:nodoc:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/jdbc_adapter/missing_functionality_helper.rb', line 21

def copy_table(from, to, options = {}) #:nodoc:
  create_table(to, options) do |@definition|
    columns(from).each do |column|
      column_name = options[:rename] ?
      (options[:rename][column.name] ||
       options[:rename][column.name.to_sym] ||
       column.name) : column.name
      column_name = column_name.to_s
      @definition.column(column_name, column.type, 
                         :limit => column.limit, :default => column.default,
                         :null => column.null)
    end
    @definition.primary_key(primary_key(from))
    yield @definition if block_given?
  end
  
  copy_table_indexes(from, to)
  copy_table_contents(from, to, 
                      @definition.columns, 
                      options[:rename] || {})
end

#copy_table_contents(from, to, columns, rename = {}) ⇒ Object

:nodoc:



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/jdbc_adapter/missing_functionality_helper.rb', line 59

def copy_table_contents(from, to, columns, rename = {}) #:nodoc:
  column_mappings = Hash[*columns.map {|col| [col.name, col.name]}.flatten]
  rename.inject(column_mappings) {|map, a| map[a.last] = a.first; map}
  from_columns = columns(from).collect {|col| col.name}
  columns = columns.find_all{|col| from_columns.include?(column_mappings[col.name])}
  execute("SELECT * FROM #{from}").each do |row|
    sql = "INSERT INTO #{to} ("+columns.map(&:name)*','+") VALUES ("            
    sql << columns.map {|col| quote(row[column_mappings[col.name]],col)} * ', '
    sql << ')'
    execute sql
  end
end

#copy_table_indexes(from, to) ⇒ Object

:nodoc:



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/jdbc_adapter/missing_functionality_helper.rb', line 43

def copy_table_indexes(from, to) #:nodoc:
  indexes(from).each do |index|
    name = index.name.downcase
    if to == "altered_#{from}"
      name = "temp_#{name}"
    elsif from == "altered_#{to}"
      name = name[5..-1]
    end
    
    # index name can't be the same
    opts = { :name => name.gsub(/_(#{from})_/, "_#{to}_") }
    opts[:unique] = true if index.unique
    add_index(to, index.columns, opts)
  end
end

#move_table(from, to, options = {}, &block) ⇒ Object

:nodoc:



16
17
18
19
# File 'lib/jdbc_adapter/missing_functionality_helper.rb', line 16

def move_table(from, to, options = {}, &block) #:nodoc:
  copy_table(from, to, options, &block)
  drop_table(from)
end