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



2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2800

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



2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2815

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



2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2835

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



2866
2867
2868
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2866

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



2877
2878
2879
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2877

def get_double_mapping
  return "double precision"
end

#get_limit_offset_clauses(limit, offset) ⇒ Object



2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2881

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



2872
2873
2874
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2872

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



2937
2938
2939
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2937

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

#primary_key_definition(start_id) ⇒ Object

End of rename_column



2796
2797
2798
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2796

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



2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2898

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



2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2915

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



2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2762

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



2860
2861
2862
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2860

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



2944
2945
2946
2947
2948
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2944

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)



2953
2954
2955
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2953

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



2968
2969
2970
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2968

def set_case(value)
  value.downcase
end

#set_schema(schema) ⇒ Object

IDS does not support the SET SCHEMA syntax



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

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



2960
2961
2962
2963
2964
# File 'lib/active_record/connection_adapters/ibm_db_adapter.rb', line 2960

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