module ActiveRecord::ConnectionAdapters::Firebird::DatabaseStatements

Public Instance Methods

begin_db_transaction() click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 66
def begin_db_transaction
  log("begin transaction", nil) { @connection.transaction('READ COMMITTED') }
end
commit_db_transaction() click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 70
def commit_db_transaction
  log("commit transaction", nil) { @connection.commit }
end
create_sequence(sequence_name) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 96
def create_sequence(sequence_name)
  execute("CREATE SEQUENCE #{sequence_name}") rescue nil
end
create_table(table_name, **options) click to toggle source
Calls superclass method
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 78
def create_table(table_name, **options)
  super

  if options[:sequence] != false && options[:id] != false
    sequence_name = options[:sequence] || default_sequence_name(table_name)
    create_sequence(sequence_name)
  end
end
default_sequence_name(table_name, _column = nil) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 108
def default_sequence_name(table_name, _column = nil)
  "#{table_name}_g01"
end
drop_sequence(sequence_name) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 100
def drop_sequence(sequence_name)
  execute("DROP SEQUENCE #{sequence_name}") rescue nil
end
drop_table(table_name, options = {}) click to toggle source
Calls superclass method
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 87
def drop_table(table_name, options = {})
  if options[:sequence] != false
    sequence_name = options[:sequence] || default_sequence_name(table_name)
    drop_sequence(sequence_name) if sequence_exists?(sequence_name)
  end

  super
end
exec_query(sql, name = 'SQL', binds = [], prepare: false) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 29
def exec_query(sql, name = 'SQL', binds = [], prepare: false)
  sql = sql.encode(encoding, 'UTF-8')

  type_casted_binds = type_casted_binds(binds).map do |value|
    value.encode(encoding) rescue value
  end

  log(sql, name, binds, type_casted_binds) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      begin
        result = @connection.execute(sql, *type_casted_binds)
        if result.is_a?(Fb::Cursor)
          fields = result.fields.map(&:name)
          rows = result.fetchall.map do |row|
            row.map do |col|
              col.encode('UTF-8', @connection.encoding) rescue col
            end
          end

          result.close
          ActiveRecord::Result.new(fields, rows)
        elsif name.end_with?(' Destroy')
          result
        else
          ActiveRecord::Result.new([], [])
        end
      rescue RangeError => e
        return ActiveRecord::Result.new([], []) if sql.downcase.start_with? 'select'
        raise e
      rescue Exception => e
        result.close if result.is_a?(Fb::Cursor)
        raise e.message.encode('UTF-8', @connection.encoding)
      end
    end
  end
end
exec_rollback_db_transaction() click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 74
def exec_rollback_db_transaction
  log("rollback transaction", nil) { @connection.rollback }
end
execute(sql, name = nil) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 19
def execute(sql, name = nil)
  sql = sql.encode(encoding, 'UTF-8')

  log(sql, name) do
    ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
      @connection.query(sql)
    end
  end
end
native_database_types() click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 3
def native_database_types
  {
    primary_key: 'integer not null primary key',
    string:      { name: 'varchar', limit: 255 },
    text:        { name: 'blob sub_type text' },
    integer:     { name: 'integer' },
    float:       { name: 'float' },
    decimal:     { name: 'decimal' },
    datetime:    { name: 'timestamp' },
    timestamp:   { name: 'timestamp' },
    date:        { name: 'date' },
    binary:      { name: 'blob' },
    boolean:     { name: 'smallint' }
  }
end
next_sequence_value(sequence_name) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 112
def next_sequence_value(sequence_name)
  @connection.query("SELECT NEXT VALUE FOR #{sequence_name} FROM RDB$DATABASE")[0][0]
end
sequence_exists?(sequence_name) click to toggle source
# File lib/active_record/connection_adapters/firebird/database_statements.rb, line 104
def sequence_exists?(sequence_name)
  @connection.generator_names.include?(sequence_name)
end