module ArJdbc::FireBird
Constants
- ADAPTER_NAME
- BLOB_VALUE_MARKER
@see quote @private
- IDENTIFIER_LENGTH
- NATIVE_DATABASE_TYPES
- SELECT_RE
@private
Public Class Methods
@deprecated no longer used
# File lib/arjdbc/firebird/adapter.rb, line 71 def self.arel2_visitors(config = nil) { 'firebird' => arel_visitor_type, 'firebirdsql' => arel_visitor_type } end
@see ArJdbc::ArelHelper::ClassMethods#arel_visitor_type
# File lib/arjdbc/firebird/adapter.rb, line 66 def self.arel_visitor_type(config = nil) require 'arel/visitors/firebird'; ::Arel::Visitors::Firebird end
@see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
# File lib/arjdbc/firebird/adapter.rb, line 26 def self.column_selector [ /firebird/i, lambda { |cfg, column| column.extend(Column) } ] end
@deprecated Use {#emulate_booleans?} instead.
# File lib/arjdbc/firebird/adapter.rb, line 84 def self.emulate_booleans; @@emulate_booleans; end
@see emulate_booleans?
# File lib/arjdbc/firebird/adapter.rb, line 86 def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
Boolean emulation can be disabled using :
ArJdbc::Firebird.emulate_booleans = false
# File lib/arjdbc/firebird/adapter.rb, line 82 def self.emulate_booleans?; @@emulate_booleans; end
@private
# File lib/arjdbc/firebird/adapter.rb, line 7 def self.extended(adapter); initialize!; end
@private
# File lib/arjdbc/firebird/adapter.rb, line 13 def self.initialize! return if @@_initialized; @@_initialized = true require 'arjdbc/util/serialized_attributes' Util::SerializedAttributes.setup /blob/i end
@see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
# File lib/arjdbc/firebird/adapter.rb, line 21 def self.jdbc_connection_class ::ActiveRecord::ConnectionAdapters::FirebirdJdbcConnection end
@see update_lob_values?
# File lib/arjdbc/firebird/adapter.rb, line 97 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::Firebird.update_lob_values = false
# File lib/arjdbc/firebird/adapter.rb, line 95 def self.update_lob_values?; @@update_lob_values; end
Public Instance Methods
# File lib/arjdbc/firebird/adapter.rb, line 108 def adapter_name ADAPTER_NAME end
# File lib/arjdbc/firebird/adapter.rb, line 250 def add_limit_offset!(sql, options) if limit = options[:limit] insert_limit_offset!(sql, limit, options[:offset]) end end
# File lib/arjdbc/firebird/adapter.rb, line 316 def change_column(table_name, column_name, type, options = {}) execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}" end
# File lib/arjdbc/firebird/adapter.rb, line 173 def clear_cache! super reload_type_map end
# File lib/arjdbc/firebird/adapter.rb, line 283 def column_name_length; IDENTIFIER_LENGTH; end
# File lib/arjdbc/firebird/adapter.rb, line 300 def create_table(name, options = {}) super(name, options) execute "CREATE GENERATOR #{default_sequence_name(name)}" end
# File lib/arjdbc/firebird/adapter.rb, line 285 def default_sequence_name(table_name, column = nil) len = IDENTIFIER_LENGTH - 4 table_name.to_s.gsub (/(^|\.)([\w$-]{1,#{len}})([\w$-]*)$/), '\1\2_seq' end
# File lib/arjdbc/firebird/adapter.rb, line 311 def drop_table(name, options = {}) super(name) execute_quietly "DROP GENERATOR #{default_sequence_name(name)}" end
Does this adapter restrict the number of IDs you can use in a list. Oracle has a limit of 1000.
# File lib/arjdbc/firebird/adapter.rb, line 241 def ids_in_list_limit 1499 end
# File lib/arjdbc/firebird/adapter.rb, line 282 def index_name_length; IDENTIFIER_LENGTH; end
# File lib/arjdbc/firebird/adapter.rb, line 133 def initialize_type_map(m) register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text register_class_with_limit m, %r(date(?:\(.*?\))?$)i, DateType register_class_with_limit m, %r(time(?:\(.*?\))?$)i, ActiveRecord::Type::Time register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer m.alias_type %r(blob)i, 'binary' m.alias_type %r(clob)i, 'text' m.alias_type %r(double)i, 'float' m.register_type(%r(decimal)i) do |sql_type| scale = extract_scale(sql_type) precision = extract_precision(sql_type) if scale == 0 ActiveRecord::Type::Integer.new(precision: precision) else ActiveRecord::Type::Decimal.new(precision: precision, scale: scale) end end m.alias_type %r(numeric)i, 'decimal' register_class_with_limit m, %r(varchar)i, ActiveRecord::Type::String m.register_type(%r(^char)i) do |sql_type| precision = extract_precision(sql_type) if Firebird.emulate_booleans? && precision == 1 ActiveRecord::Type::Boolean.new else ActiveRecord::Type::String.new(:precision => precision) end end register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime register_class_with_limit m, %r(timestamp)i, TimestampType end
# File lib/arjdbc/firebird/adapter.rb, line 245 def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = []) execute(sql, name, binds) id_value end
# File lib/arjdbc/firebird/adapter.rb, line 259 def insert_limit_offset!(sql, limit, offset) lim_off = '' lim_off << "FIRST #{limit}" if limit lim_off << " SKIP #{offset}" if offset lim_off.strip! sql.sub!(SELECT_RE, "\\&#{lim_off} ") unless lim_off.empty? end
@see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_column_class
# File lib/arjdbc/firebird/adapter.rb, line 63 def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::FirebirdColumn end
# File lib/arjdbc/firebird/adapter.rb, line 129 def native_database_types NATIVE_DATABASE_TYPES end
# File lib/arjdbc/firebird/adapter.rb, line 296 def next_sequence_value(sequence_name) select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"] end
Should primary key values be selected from their corresponding sequence before the insert statement? @see next_sequence_value @override
# File lib/arjdbc/firebird/adapter.rb, line 272 def prefetch_primary_key?(table_name = nil) return true if table_name.nil? primary_keys(table_name.to_s).size == 1 # columns(table_name).count { |column| column.primary } == 1 end
@override
# File lib/arjdbc/firebird/adapter.rb, line 329 def quote(value, column = nil) return value.quoted_id if value.respond_to?(:quoted_id) return value if sql_literal?(value) type = column && column.type # BLOBs are updated separately by an after_save trigger. if type == :binary || type == :text if update_lob_values? return value.nil? ? "NULL" : BLOB_VALUE_MARKER else return "'#{quote_string(value)}'" end end case value when String, ActiveSupport::Multibyte::Chars value = value.to_s if type == :integer value.to_i.to_s elsif type == :float value.to_f.to_s else "'#{quote_string(value)}'" end when NilClass then 'NULL' when TrueClass then (type == :integer ? '1' : quoted_true) when FalseClass then (type == :integer ? '0' : quoted_false) when Float, Fixnum, Bignum then value.to_s # BigDecimals need to be output in a non-normalized form and quoted. when BigDecimal then value.to_s('F') when Symbol then "'#{quote_string(value.to_s)}'" else if type == :time && value.acts_like?(:time) return "'#{get_time(value).strftime("%H:%M:%S")}'" end if type == :date && value.acts_like?(:date) return "'#{value.strftime("%Y-%m-%d")}'" end super end end
@override
# File lib/arjdbc/firebird/adapter.rb, line 404 def quote_column_name(column_name) column_name = column_name.to_s %Q("#{column_name =~ /[[:upper:]]/ ? column_name : column_name.upcase}") end
@override
# File lib/arjdbc/firebird/adapter.rb, line 384 def quote_string(string) string.gsub(/'/, "''") end
@override
# File lib/arjdbc/firebird/adapter.rb, line 399 def quote_table_name_for_assignment(table, attr) quote_column_name(attr) end
@override
# File lib/arjdbc/firebird/adapter.rb, line 373 def quoted_date(value) if value.acts_like?(:time) && value.respond_to?(:usec) usec = sprintf "%04d", (value.usec / 100.0).round value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal "#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}" else super end end
@override
# File lib/arjdbc/firebird/adapter.rb, line 394 def quoted_false quote(0) end
@override
# File lib/arjdbc/firebird/adapter.rb, line 389 def quoted_true quote(1) end
# File lib/arjdbc/firebird/adapter.rb, line 324 def remove_index(table_name, options) execute "DROP INDEX #{index_name(table_name, options)}" end
# File lib/arjdbc/firebird/adapter.rb, line 320 def rename_column(table_name, column_name, new_column_name) execute "ALTER TABLE #{table_name} ALTER #{column_name} TO #{new_column_name}" end
# File lib/arjdbc/firebird/adapter.rb, line 305 def rename_table(name, new_name) execute "RENAME #{name} TO #{new_name}" name_seq, new_name_seq = default_sequence_name(name), default_sequence_name(new_name) execute_quietly "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name_seq}' WHERE RDB$GENERATOR_NAME='#{name_seq}'" end
Set the sequence to the max value of the table's column.
# File lib/arjdbc/firebird/adapter.rb, line 291 def reset_sequence!(table, column, sequence = nil) max_id = select_value("SELECT max(#{column}) FROM #{table}") execute("ALTER SEQUENCE #{default_sequence_name(table, column)} RESTART WITH #{max_id}") end
Does this adapter support using DISTINCT within COUNT?
# File lib/arjdbc/firebird/adapter.rb, line 228 def supports_count_distinct? true end
Does this adapter support DDL rollbacks in transactions? That is, would CREATE TABLE or ALTER TABLE get rolled back by a transaction? PostgreSQL, SQL Server, and others support this. MySQL and others do not.
# File lib/arjdbc/firebird/adapter.rb, line 235 def supports_ddl_transactions? false end
Does this adapter support migrations?
# File lib/arjdbc/firebird/adapter.rb, line 217 def supports_migrations? true end
Can this adapter determine the primary key for tables not attached to an Active Record class, such as join tables?
# File lib/arjdbc/firebird/adapter.rb, line 223 def supports_primary_key? true end
# File lib/arjdbc/firebird/adapter.rb, line 280 def table_alias_length; IDENTIFIER_LENGTH; end
# File lib/arjdbc/firebird/adapter.rb, line 281 def table_name_length; IDENTIFIER_LENGTH; end
# File lib/arjdbc/firebird/adapter.rb, line 195 def type_to_sql(type, limit = nil, precision = nil, scale = nil) case type when :integer case limit when nil then 'integer' when 1..2 then 'smallint' when 3..4 then 'integer' when 5..8 then 'bigint' else raise(ActiveRecordError, "No integer type has byte size #{limit}. "<< "Use a NUMERIC with PRECISION 0 instead.") end when :float if limit.nil? || limit <= 4 'float' else 'double precision' end else super end end
@see update_lob_values?
# File lib/arjdbc/firebird/adapter.rb, line 100 def update_lob_values?; Firebird.update_lob_values?; end