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, #prepare, #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



4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4130

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
  change_column_default(table_name, column_name, options[:default]) unless options[:default].nil?
  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



4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4145

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.sql_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_stmt(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



4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4165

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

#get_datetime_mappingObject

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



4191
4192
4193
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4191

def get_datetime_mapping
  'datetime year to fraction(5)'
end

#get_double_mappingObject

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



4202
4203
4204
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4202

def get_double_mapping
  'double precision'
end

#get_time_mappingObject

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



4197
4198
4199
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4197

def get_time_mapping
  '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



4212
4213
4214
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4212

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

#primary_key_definition(start_id) ⇒ Object

End of rename_column



4126
4127
4128
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4126

def primary_key_definition(start_id)
  "SERIAL(#{start_id})"
end

#rename_column(table_name, column_name, new_column_name) ⇒ Object

IDS specific ALTER TABLE statement to rename a column



4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4092

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?
  unless nil_condition
    empty_condition = _table_name.empty? ||
                      _column_name.empty? ||
                      _new_column_name.empty?
  end

  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.getErrormsg(@adapter.connection, IBM_DB::DB_CONN)
      raise "Rename column failed : #{error_msg}" if error_msg && !error_msg.empty?

      raise StandardError.new('An unexpected error occurred during renaming the column')

    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



4185
4186
4187
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4185

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.”



4219
4220
4221
4222
4223
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4219

def set_binary_default(value)
  return if value == 'NULL'

  raise 'Informix Dynamic Server only allows NULL as a valid default value for a BLOB data type'
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)



4228
4229
4230
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4228

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



4243
4244
4245
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4243

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



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

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.”



4235
4236
4237
4238
4239
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 4235

def set_text_default(value)
  return if value == 'NULL'

  raise 'Informix Dynamic Server only allows NULL as a valid default value for a CLOB data type'
end