@note This adapter doesn’t support explain `config.active_record.auto_explain_threshold_in_seconds` should be commented (Rails < 4.0)
@see quote @private
@see quote @private
only record precision and scale for types that can set them via CREATE TABLE: publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000927.html
@deprecated no longer used @see ActiveRecord::ConnectionAdapters::JdbcAdapter#arel2_visitors
# File lib/arjdbc/db2/adapter.rb, line 40 def self.arel2_visitors(config) { 'db2' => arel_visitor_type } end
@see ActiveRecord::ConnectionAdapters::Jdbc::ArelSupport
# File lib/arjdbc/db2/adapter.rb, line 34 def self.arel_visitor_type(config = nil) require 'arel/visitors/db2'; ::Arel::Visitors::DB2 end
@see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
# File lib/arjdbc/db2/column.rb, line 5 def self.column_selector [ /(db2|zos)/, lambda { |config, column| column.extend(Column) } ] end
@deprecated Use {emulate_booleans?} instead.
# File lib/arjdbc/db2/adapter.rb, line 53 def self.emulate_booleans; @@emulate_booleans; end
@see emulate_booleans?
# File lib/arjdbc/db2/adapter.rb, line 55 def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
Boolean emulation can be disabled using :
ArJdbc::DB2.emulate_booleans = false
# File lib/arjdbc/db2/adapter.rb, line 51 def self.emulate_booleans?; @@emulate_booleans; end
@private
# File lib/arjdbc/db2/adapter.rb, line 10 def self.extended(adapter); initialize!; end
@private
# File lib/arjdbc/db2/adapter.rb, line 16 def self.initialize! return if @@_initialized; @@_initialized = true require 'arjdbc/util/serialized_attributes' Util::SerializedAttributes.setup /blob|clob/, 'after_save_with_db2_lob' end
@see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
# File lib/arjdbc/db2/adapter.rb, line 24 def self.jdbc_connection_class ::ActiveRecord::ConnectionAdapters::DB2JdbcConnection end
@see update_lob_values?
# File lib/arjdbc/db2/adapter.rb, line 68 def self.update_lob_values=(update); @@update_lob_values = update; end
Updating records with LOB values (binary/text columns) in a separate statement can be disabled using :
ArJdbc::DB2.update_lob_values = false
@note This only applies when prepared statements are not used.
# File lib/arjdbc/db2/adapter.rb, line 66 def self.update_lob_values?; @@update_lob_values; end
# File lib/arjdbc/db2/adapter.rb, line 604 def _execute(sql, name = nil) if self.class.select?(sql) @connection.execute_query_raw(sql) elsif self.class.insert?(sql) @connection.execute_insert(sql) || last_insert_id else @connection.execute_update(sql) end end
# File lib/arjdbc/db2/adapter.rb, line 90 def adapter_name ADAPTER_NAME end
# File lib/arjdbc/db2/adapter.rb, line 353 def add_column(table_name, column_name, type, options = {}) # The keyword COLUMN allows to use reserved names for columns (ex: date) add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD COLUMN #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" add_column_options!(add_column_sql, options) execute(add_column_sql) end
# File lib/arjdbc/db2/adapter.rb, line 360 def add_column_options!(sql, options) # handle case of defaults for CLOB columns, # which might get incorrect if we write LOBs in the after_save callback if options_include_default?(options) column = options[:column] if column && column.type == :text sql << " DEFAULT #{quote(options.delete(:default))}" end if column && column.type == :binary # quoting required for the default value of a column : value = options.delete(:default) # DB2 z/OS only allows NULL or "" (empty) string as DEFAULT value # for a BLOB column. non-empty string and non-NULL, return error! if value.nil? sql_value = "NULL" else sql_value = zos? ? "#{value}" : "BLOB('#{quote_string(value)}'" end sql << " DEFAULT #{sql_value}" end end super end
# File lib/arjdbc/db2/adapter.rb, line 443 def add_index(table_name, column_name, options = {}) if ! zos? || ( table_name.to_s == ActiveRecord::Migrator.schema_migrations_table_name.to_s ) column_name = column_name.to_s if column_name.is_a?(Symbol) super else statement = 'CREATE' statement << ' UNIQUE ' if options[:unique] statement << " INDEX #{ActiveRecord::Base.table_name_prefix}#{options[:name]} " statement << " ON #{table_name}(#{column_name})" execute statement end end
@note Only used with (non-AREL) ActiveRecord *2.3*. @see Arel::Visitors::DB2
# File lib/arjdbc/db2/adapter.rb, line 386 def add_limit_offset!(sql, options) replace_limit_offset!(sql, options[:limit], options[:offset]) end
@private @deprecated no longer used
# File lib/arjdbc/db2/adapter.rb, line 633 def as400? false end
# File lib/arjdbc/db2/adapter.rb, line 487 def change_column(table_name, column_name, type, options = {}) data_type = type_to_sql(type, options[:limit], options[:precision], options[:scale]) sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DATA TYPE #{data_type}" execute_table_change(sql, table_name, 'Change Column') if options.include?(:default) and options.include?(:null) # which to run first? if options[:null] or options[:default].nil? change_column_null(table_name, column_name, options[:null]) change_column_default(table_name, column_name, options[:default]) else change_column_default(table_name, column_name, options[:default]) change_column_null(table_name, column_name, options[:null]) end elsif options.include?(:default) change_column_default(table_name, column_name, options[:default]) elsif options.include?(:null) change_column_null(table_name, column_name, options[:null]) end end
# File lib/arjdbc/db2/adapter.rb, line 478 def change_column_default(table_name, column_name, default) if default.nil? sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP DEFAULT" else sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET WITH DEFAULT #{quote(default)}" end execute_table_change(sql, table_name, 'Change Column') end
# File lib/arjdbc/db2/adapter.rb, line 469 def change_column_null(table_name, column_name, null) if null sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} DROP NOT NULL" else sql = "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET NOT NULL" end execute_table_change(sql, table_name, 'Change Column') end
# File lib/arjdbc/db2/adapter.rb, line 544 def columns(table_name, name = nil) columns = @connection.columns_internal(table_name.to_s, nil, schema) # catalog == nil if zos? # Remove the mighty db2_generated_rowid_for_lobs from the list of columns columns = columns.reject { |col| "db2_generated_rowid_for_lobs" == col.name } end # scrub out sizing info when CREATE TABLE doesn't support it # but JDBC reports it (doh!) for column in columns base_sql_type = column.sql_type.sub(/\(.*/, "").upcase column.limit = nil unless HAVE_LIMIT.include?(base_sql_type) column.precision = nil unless HAVE_PRECISION.include?(base_sql_type) #column.scale = nil unless HAVE_SCALE.include?(base_sql_type) end columns end
# File lib/arjdbc/db2/adapter.rb, line 83 def configure_connection schema = self.schema set_schema(schema) if schema && schema != config[:username] end
# File lib/arjdbc/db2/adapter.rb, line 190 def create_table(name, options = {}) if zos? zos_create_table(name, options) else super(name, options) end end
# File lib/arjdbc/db2/adapter.rb, line 571 def drop_database(name = nil) tables.each { |table| drop_table("#{table}") } end
# File lib/arjdbc/db2/adapter.rb, line 563 def indexes(table_name, name = nil) @connection.indexes(table_name, name, schema) end
@see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
# File lib/arjdbc/db2/adapter.rb, line 29 def jdbc_column_class ::ActiveRecord::ConnectionAdapters::DB2Column end
Returns the value of an identity column of the last INSERT statement made over this connection. @note Check the IDENTITY_VAL_LOCAL function for documentation. @return [Fixnum]
# File lib/arjdbc/db2/adapter.rb, line 593 def last_insert_id @connection.identity_val_local end
# File lib/arjdbc/db2/adapter.rb, line 339 def modify_types(types) super(types) types[:primary_key] = 'int not null generated by default as identity (start with 1) primary key' types[:string][:limit] = 255 types[:integer][:limit] = nil types[:boolean] = {:name => "decimal(1)"} types end
@override
# File lib/arjdbc/db2/adapter.rb, line 115 def native_database_types # NOTE: currently merging with what JDBC gives us since there's a lot # of DB2-like stuff we could be connecting e.g. "classic", Z/OS etc. # types = super types = super.merge(NATIVE_DATABASE_TYPES) types end
# File lib/arjdbc/db2/adapter.rb, line 186 def next_sequence_value(sequence_name) select_value("SELECT NEXT VALUE FOR #{sequence_name} FROM sysibm.sysdummy1") end
# File lib/arjdbc/db2/adapter.rb, line 250 def pk_and_sequence_for(table) # In JDBC/DB2 side, only upcase names of table and column are handled. keys = super(table.upcase) if keys && keys[0] # In ActiveRecord side, only downcase names of table and column are handled. keys[0] = keys[0].downcase end keys end
# File lib/arjdbc/db2/adapter.rb, line 177 def prefetch_primary_key?(table_name = nil) # TRUE if the table has no identity column names = table_name.upcase.split(".") sql = "SELECT 1 FROM SYSCAT.COLUMNS WHERE IDENTITY = 'Y' " sql << "AND TABSCHEMA = '#{names.first}' " if names.size == 2 sql << "AND TABNAME = '#{names.last}'" select_one(sql).nil? end
Properly quotes the various data types. @param value contains the data @param column (optional) contains info on the field @override
# File lib/arjdbc/db2/adapter.rb, line 264 def quote(value, column = nil) return value.quoted_id if value.respond_to?(:quoted_id) return value if sql_literal?(value) if column if column.respond_to?(:primary) && column.primary && column.klass != String return value.to_i.to_s end if value && (column.type.to_sym == :decimal || column.type.to_sym == :integer) return value.to_s end end column_type = column && column.type.to_sym case value when nil then 'NULL' when Numeric # IBM_DB doesn't accept quotes on numeric types # if the column type is text or string, return the quote value if column_type == :text || column_type == :string "'#{value}'" else value.to_s end when String, ActiveSupport::Multibyte::Chars if column_type == :binary && column.sql_type !~ /for bit data/ if update_lob_value?(value, column) value.nil? ? 'NULL' : BLOB_VALUE_MARKER # '@@@IBMBINARY@@@'" else "BLOB('#{quote_string(value)}')" end elsif column && column.sql_type =~ /clob/ # :text if update_lob_value?(value, column) value.nil? ? 'NULL' : CLOB_VALUE_MARKER # "'@@@IBMTEXT@@@'" else "'#{quote_string(value)}'" end elsif column_type == :xml value.nil? ? 'NULL' : "'#{quote_string(value)}'" # "'<ibm>@@@IBMXML@@@</ibm>'" else "'#{quote_string(value)}'" end when Symbol then "'#{quote_string(value.to_s)}'" when Time # AS400 doesn't support date in time column if column_type == :time quote_time(value) else super end else super end end
# File lib/arjdbc/db2/adapter.rb, line 335 def quote_column_name(column_name) column_name.to_s end
# File lib/arjdbc/db2/adapter.rb, line 329 def quote_time(value) value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal # AS400 doesn't support date in time column "'#{value.strftime("%H:%M:%S")}'" end
@override
# File lib/arjdbc/db2/adapter.rb, line 319 def quoted_date(value) if value.acts_like?(:time) && value.respond_to?(:usec) usec = sprintf("%06d", value.usec) value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal "#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}" else super end end
# File lib/arjdbc/db2/adapter.rb, line 567 def recreate_database(name = nil, options = {}) drop_database(name) end
# File lib/arjdbc/db2/adapter.rb, line 510 def remove_column(table_name, column_name, type = nil, options = {}) db2_remove_column(table_name, column_name) end
@override
# File lib/arjdbc/db2/adapter.rb, line 458 def remove_index!(table_name, index_name) execute "DROP INDEX #{quote_column_name(index_name)}" end
# File lib/arjdbc/db2/adapter.rb, line 528 def rename_table(name, new_name) # http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000980.html execute_table_change("RENAME TABLE #{name} TO #{new_name}", new_name, 'Rename Table') end
@private shared with {Arel::Visitors::DB2}
# File lib/arjdbc/db2/adapter.rb, line 391 def replace_limit_offset!(sql, limit, offset) return sql unless limit limit = limit.to_i if offset replace_limit_offset_with_ordering(sql, limit, offset) else if limit == 1 sql << " FETCH FIRST ROW ONLY" else sql << " FETCH FIRST #{limit} ROWS ONLY" end sql end end
@private only used from {Arel::Visitors::DB2}
# File lib/arjdbc/db2/adapter.rb, line 408 def replace_limit_offset_for_arel!( query, sql ) replace_limit_offset_with_ordering sql, query.limit.value, query.offset && query.offset.value, query.orders end
@deprecated seems not sued nor tested ?!
# File lib/arjdbc/db2/adapter.rb, line 434 def runstats_for_table(tablename, priority = 10) @connection.execute_update "call sysproc.admin_cmd('RUNSTATS ON TABLE #{tablename} WITH DISTRIBUTION AND DETAILED INDEXES ALL UTIL_IMPACT_PRIORITY #{priority}')" end
# File lib/arjdbc/db2/adapter.rb, line 637 def schema db2_schema end
# File lib/arjdbc/db2/adapter.rb, line 641 def schema=(schema) set_schema(@db2_schema = schema) if db2_schema != schema end
# File lib/arjdbc/db2/adapter.rb, line 438 def select(sql, name, binds) # DB2 does not like "= NULL", "!= NULL", or "<> NULL". exec_query(to_sql(sql.gsub(/(!=|<>)\s*null/, "IS NOT NULL").gsub(/=\s*null/, "IS NULL"), binds), name, binds) end
# File lib/arjdbc/db2/adapter.rb, line 173 def table_definition(*args) new_table_definition(TableDefinition, *args) end
# File lib/arjdbc/db2/adapter.rb, line 533 def tables @connection.tables(nil, schema) end
# File lib/arjdbc/db2/adapter.rb, line 348 def type_to_sql(type, limit = nil, precision = nil, scale = nil) limit = nil if type.to_sym == :integer super(type, limit, precision, scale) end
@see update_lob_values? @see ArJdbc::Util::SerializedAttributes#update_lob_columns
# File lib/arjdbc/db2/adapter.rb, line 72 def update_lob_value?(value, column = nil) DB2.update_lob_values? && ! prepared_statements? # && value end
Generated with the Darkfish Rdoc Generator 2.