Class: ActiveRecord::ConnectionAdapters::IBM_IDS

Inherits:
IBM_DataServer show all
Defined in:
lib/active_record/connection_adapters/ibm_db_adapter.rb

Overview

class IBM_DB2_I5

Instance Method Summary collapse

Methods inherited from IBM_DataServer

#check_reserved_words, #create_index_after_table, #execute, #initialize, #limit_not_supported_types, #remove_column, #select, #select_rows, #setup_for_lob_table

Constructor Details

This class inherits a constructor from ActiveRecord::ConnectionAdapters::IBM_DataServer

Instance Method Details

#change_column(table_name, column_name, type, options) ⇒ Object



2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2079

def change_column(table_name, column_name, type, options)
  if !options[:null].nil? && !options[:null]
    execute "ALTER TABLE #{table_name} MODIFY #{column_name} #{@adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])} NOT NULL"
  else
    execute "ALTER TABLE #{table_name} MODIFY #{column_name} #{@adapter.type_to_sql(type, options[:limit], options[:precision], options[:scale])}"  
  end 
  if !options[:default].nil?
     change_column_default(table_name, column_name, options[:default])
  end
  reorg_table(table_name)
end

#change_column_default(table_name, column_name, default) ⇒ Object

IDS specific ALTER TABLE statement to add a default clause IDS requires the data type to be explicitly specified when adding the DEFAULT clause



2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2094

def change_column_default(table_name, column_name, default)
  sql_type = nil
  is_nullable = true
  @adapter.columns(table_name).select do |col| 
     if (col.name == column_name)
        sql_type =  @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
        is_nullable = col.null 
     end
  end
  # SQL statement which alters column's default value
  change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} DEFAULT #{@adapter.quote(default)}"
  change_column_sql << " NOT NULL" unless is_nullable 
  stmt = execute(change_column_sql)
  reorg_table(table_name)
  # Ensures to free the resources associated with the statement
  ensure
    IBM_DB.free_result stmt if stmt
end

#change_column_null(table_name, column_name, null, default) ⇒ Object

IDS specific ALTER TABLE statement to change the nullability of a column



2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2114

def change_column_null(table_name,column_name,null,default)
  if !default.nil?
    change_column_default table_name, column_name, default
  end
  sql_type = nil
  @adapter.columns(table_name).select do |col| 
    if (col.name == column_name)
      sql_type =  @adapter.type_to_sql(col.type, col.limit, col.precision, col.scale)
    end
  end
  if !null.nil?
    if !null
      change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type} NOT NULL"
    else
      change_column_sql = "ALTER TABLE #{table_name} MODIFY #{column_name} #{sql_type}"     
    end 
  end
  stmt = execute(change_column_sql)
  reorg_table(table_name)
  ensure
    IBM_DB.free_result stmt if stmt
end

#get_datetime_mappingObject

This method returns the IDS SQL type corresponding to the Rails datetime/timestamp type



2144
2145
2146
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2144

def get_datetime_mapping
  return "datetime year to fraction(5)"
end

#get_double_mappingObject

This method returns the IDS SQL type corresponding to Rails double type



2155
2156
2157
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2155

def get_double_mapping
  return "double precision"
end

#get_time_mappingObject

This method returns the IDS SQL type corresponding to the Rails time type



2150
2151
2152
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2150

def get_time_mapping
  return "datetime hour to second"
end

#last_generated_id(stmt) ⇒ Object

Method that returns the last automatically generated ID on the given @connection. This method is required by the insert method. IDS returns the last generated serial value in the SQLCA unlike DB2 where the generated value has to be retrieved using the IDENTITY_VAL_LOCAL function. We used the “stmt” parameter to identify the statement resource from which to get the last generated value



2182
2183
2184
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2182

def last_generated_id(stmt)
  IBM_DB.get_last_serial_value(stmt)
end

#primary_key_definition(start_id) ⇒ Object

End of rename_column



2075
2076
2077
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2075

def primary_key_definition(start_id)
  return "SERIAL(#{start_id}) PRIMARY KEY"
end

#query_offset_limit(sql, offset, limit) ⇒ Object

Handling offset/limit as per Informix requirements



2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2160

def query_offset_limit(sql, offset, limit)
  if limit != 0
    if !offset.nil?
      # Modifying the SQL to utilize the skip and limit amounts
      sql.gsub!(/SELECT/i,"SELECT SKIP #{offset} LIMIT #{limit}")
    else
      # Modifying the SQL to retrieve only the first #{limit} rows
      sql = sql.gsub!("SELECT","SELECT FIRST #{limit}")
    end
  else
    # Modifying the SQL to ensure that no rows will be returned
    sql.gsub!(/SELECT/i,"SELECT * FROM (SELECT")
    sql << ") WHERE 0 = 1"
  end
end

#rename_column(table_name, column_name, new_column_name) ⇒ Object

IDS specific ALTER TABLE statement to rename a column



2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2040

def rename_column(table_name, column_name, new_column_name)
  _table_name      = table_name.to_s
  _column_name     = column_name.to_s
  _new_column_name = new_column_name.to_s

  nil_condition    = _table_name.nil? || _column_name.nil? || _new_column_name.nil?
  empty_condition  = _table_name.empty? || 
                       _column_name.empty? || 
                         _new_column_name.empty? unless nil_condition

  if nil_condition || empty_condition
    raise ArgumentError,"One of the arguments passed to rename_column is empty or nil"
  end

  begin
    rename_column_sql = "RENAME COLUMN #{table_name}.#{column_name} TO \
         #{new_column_name}"

    unless stmt = execute(rename_column_sql)
      error_msg = IBM_DB.conn_errormsg 
      error_msg = IBM_DB.stmt_errormsg if error_msg.empty?
      if error_msg && !error_msg.empty?
        raise "Rename column failed : #{error_msg}"
      else
        raise StandardError.new('An unexpected error occurred during renaming the column')
      end
    end

    reorg_table(_table_name)

  ensure
    IBM_DB.free_stmt stmt if stmt
  end #End of begin
end

#reorg_table(table_name) ⇒ Object

Reorganizes the table for column changes



2138
2139
2140
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2138

def reorg_table(table_name)
  execute("UPDATE STATISTICS FOR TABLE #{table_name}")
end

#set_binary_default(value) ⇒ Object

This method throws an error when trying to create a default value on a BLOB/CLOB column for IDS. The documentation states: “if the column is a BLOB or CLOB datatype, NULL is the only valid default value.”



2189
2190
2191
2192
2193
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2189

def set_binary_default(value)
  unless (value == 'NULL')
    raise "Informix Dynamic Server only allows NULL as a valid default value for a BLOB data type"
  end
end

#set_binary_valueObject

For Informix Dynamic Server, we treat binary value same as we treat a text value. We support literals by converting the insert into a dummy insert and an update (See handle_lobs method above)



2198
2199
2200
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2198

def set_binary_value
  "'@@@IBMBINARY@@@'"
end

#set_case(value) ⇒ Object

For Informix Dynamic Server, the arguments to the meta-data functions need to be in lower-case



2213
2214
2215
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2213

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



2036
2037
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2036

def set_schema(schema)
end

#set_text_default(value) ⇒ Object

This method throws an error when trying to create a default value on a BLOB/CLOB column for IDS. The documentation states: “if the column is a BLOB or CLOB datatype, NULL is the only valid default value.”



2205
2206
2207
2208
2209
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2205

def set_text_default(value)
  unless (value == 'NULL')
    raise "Informix Dynamic Server only allows NULL as a valid default value for a CLOB data type"
  end
end