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



2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2441

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



2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2456

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_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



2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2476

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



2507
2508
2509
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2507

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



2518
2519
2520
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2518

def get_double_mapping
  return "double precision"
end

#get_time_mappingObject

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



2513
2514
2515
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2513

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



2562
2563
2564
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2562

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

#primary_key_definition(start_id) ⇒ Object

End of rename_column



2437
2438
2439
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2437

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



2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2523

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



2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2540

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



2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2403

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



2501
2502
2503
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2501

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



2569
2570
2571
2572
2573
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2569

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)



2578
2579
2580
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2578

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



2593
2594
2595
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2593

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



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

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



2585
2586
2587
2588
2589
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2585

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