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



3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3216

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



3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3231

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



3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3251

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



3282
3283
3284
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3282

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



3293
3294
3295
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3293

def get_double_mapping
  return "double precision"
end

#get_limit_offset_clauses(limit, offset) ⇒ Object



3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3297

def get_limit_offset_clauses(limit, offset)
  retHash = {"startSegment" => "", "endSegment" => ""}
  if limit != 0
    if !offset.nil?
      # Modifying the SQL to utilize the skip and limit amounts
      retHash["startSegment"] = " SELECT SKIP #{offset} LIMIT #{limit} "
    else
      # Modifying the SQL to retrieve only the first #{limit} rows
      retHash["startSegment"] = " SELECT FIRST #{limit} "
    end
  else
    retHash["startSegment"] = " SELECT * FROM (SELECT "
    retHash["endSegment"] = " ) WHERE 0 = 1 "
  end
end

#get_time_mappingObject

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



3288
3289
3290
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3288

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



3353
3354
3355
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3353

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

#primary_key_definition(start_id) ⇒ Object

End of rename_column



3212
3213
3214
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3212

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



3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3314

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

#query_offset_limit!(sql, offset, limit, options) ⇒ Object

Handling offset/limit as per Informix requirements



3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3331

def query_offset_limit!(sql, offset, limit, options)
  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



3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3178

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.getErrormsg(@adapter.connection, IBM_DB::DB_CONN )
      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



3276
3277
3278
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3276

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



3360
3361
3362
3363
3364
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3360

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)



3369
3370
3371
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3369

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



3384
3385
3386
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3384

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



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

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



3376
3377
3378
3379
3380
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3376

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