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



3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3553

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



3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3568

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



3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3588

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



3619
3620
3621
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3619

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



3630
3631
3632
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3630

def get_double_mapping
  return "double precision"
end

#get_time_mappingObject

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



3625
3626
3627
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3625

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



3640
3641
3642
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3640

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

#primary_key_definition(start_id) ⇒ Object

End of rename_column



3549
3550
3551
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3549

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

#rename_column(table_name, column_name, new_column_name) ⇒ Object

IDS specific ALTER TABLE statement to rename a column



3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3515

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



3613
3614
3615
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3613

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



3647
3648
3649
3650
3651
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3647

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)



3656
3657
3658
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3656

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



3671
3672
3673
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3671

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



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

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



3663
3664
3665
3666
3667
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 3663

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