Included Modules

Files

Class/Module Index [+]

Quicksearch

ArJdbc::Derby

Constants

ADAPTER_NAME
NATIVE_DATABASE_TYPES
NO_LIMIT_TYPES

@private In Derby, these cannot specify a limit.

Public Class Methods

arel_visitor_type(config = nil) click to toggle source

@see ActiveRecord::ConnectionAdapters::Jdbc::ArelSupport

# File lib/arjdbc/derby/adapter.rb, line 97
def self.arel_visitor_type(config = nil)
  require 'arel/visitors/derby'; ::Arel::Visitors::Derby
end
column_selector() click to toggle source

@see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types

# File lib/arjdbc/derby/adapter.rb, line 24
def self.column_selector
  [ /derby/, lambda { |config, column| column.extend(Column) } ]
end
emulate_booleans() click to toggle source

@deprecated Use {emulate_booleans?} instead.

# File lib/arjdbc/derby/adapter.rb, line 37
def self.emulate_booleans; @@emulate_booleans; end
emulate_booleans=(emulate) click to toggle source

@see emulate_booleans?

# File lib/arjdbc/derby/adapter.rb, line 39
def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
emulate_booleans?() click to toggle source

Boolean emulation can be disabled using :

ArJdbc::Derby.emulate_booleans = false
# File lib/arjdbc/derby/adapter.rb, line 35
def self.emulate_booleans?; @@emulate_booleans; end
extended(adapter) click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 10
def self.extended(adapter)
  require 'arjdbc/derby/active_record_patch'
end
included(base) click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 14
def self.included(base)
  require 'arjdbc/derby/active_record_patch'
end
jdbc_connection_class() click to toggle source

@see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class

# File lib/arjdbc/derby/adapter.rb, line 19
def self.jdbc_connection_class
  ::ActiveRecord::ConnectionAdapters::DerbyJdbcConnection
end

Public Instance Methods

adapter_name() click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 103
def adapter_name
  ADAPTER_NAME
end
add_column(table_name, column_name, type, options = {}) click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 285
def add_column(table_name, column_name, type, options = {})
  add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{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
add_column_options!(sql, options) click to toggle source

@override fix case where AR passes `:default => nil, :null => true`

# File lib/arjdbc/derby/adapter.rb, line 292
def add_column_options!(sql, options)
  options.delete(:default) if options.has_key?(:default) && options[:default].nil?
  sql << " DEFAULT #{quote(options.delete(:default))}" if options.has_key?(:default)
  super
end
add_limit_offset!(sql, options) click to toggle source

@note Only used with (non-AREL) ActiveRecord *2.3*. @see Arel::Visitors::Derby

# File lib/arjdbc/derby/adapter.rb, line 468
def add_limit_offset!(sql, options)
  sql << " OFFSET #{options[:offset]} ROWS" if options[:offset]
  # ROWS/ROW and FIRST/NEXT mean the same
  sql << " FETCH FIRST #{options[:limit]} ROWS ONLY" if options[:limit]
end
change_column(table_name, column_name, type, options = {}) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 323
def change_column(table_name, column_name, type, options = {})
  # TODO this needs a review since now we're likely to be on >= 10.8

  # Notes about changing in Derby:
  #    http://db.apache.org/derby/docs/10.2/ref/rrefsqlj81859.html#rrefsqlj81859__rrefsqlj37860)
  #
  # We support changing columns using the strategy outlined in:
  #    https://issues.apache.org/jira/browse/DERBY-1515
  #
  # This feature has not made it into a formal release and is not in Java 6.
  # We will need to conditionally support this (supposed to arrive for 10.3.0.0).

  # null/not nulling is easy, handle that separately
  if options.include?(:null)
    # This seems to only work with 10.2 of Derby
    if options.delete(:null) == false
      execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} NOT NULL"
    else
      execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN #{quote_column_name(column_name)} NULL"
    end
  end

  # anything left to do?
  unless options.empty?
    begin
      execute "ALTER TABLE #{quote_table_name(table_name)} ALTER COLUMN " <<
              " #{quote_column_name(column_name)} SET DATA TYPE #{type_to_sql(type, options[:limit])}"
    rescue
      transaction do
        temp_new_column_name = "#{column_name}_newtype"
        # 1) ALTER TABLE t ADD COLUMN c1_newtype NEWTYPE;
        add_column table_name, temp_new_column_name, type, options
        # 2) UPDATE t SET c1_newtype = c1;
        execute "UPDATE #{quote_table_name(table_name)} SET " <<
                " #{quote_column_name(temp_new_column_name)} = " <<
                " CAST(#{quote_column_name(column_name)} AS #{type_to_sql(type, options[:limit])})"
        # 3) ALTER TABLE t DROP COLUMN c1;
        remove_column table_name, column_name
        # 4) ALTER TABLE t RENAME COLUMN c1_newtype to c1;
        rename_column table_name, temp_new_column_name, column_name
      end
    end
  end
end
columns_for_distinct(columns, orders) click to toggle source

@override Since AR 4.0 (on 4.1 {distinct} is gone and won’t be called).

# File lib/arjdbc/derby/adapter.rb, line 388
def columns_for_distinct(columns, orders)
  return columns if orders.blank?

  # construct a clean list of column names from the ORDER BY clause,
  # removing any ASC/DESC modifiers
  order_columns = [ orders ]; order_columns.flatten! # AR 3.x vs 4.x
  order_columns.map! do |column|
    column = column.to_sql unless column.is_a?(String) # handle AREL node
    column.split(',').collect! { |s| s.split.first }
  end.flatten!
  order_columns.reject!(&:blank?)
  order_columns = order_columns.zip (0...order_columns.size).to_a
  order_columns = order_columns.map { |s, i| "#{s} AS alias_#{i}" }

  columns = [ columns ]; columns.flatten!
  columns.push( *order_columns ).join(', ')
  # return a DISTINCT clause that's distinct on the columns we want but
  # includes all the required columns for the ORDER BY to work properly
end
configure_connection() click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 123
def configure_connection
  # must be done or SELECT...FOR UPDATE won't work how we expect :
  tx_isolation = config[:transaction_isolation] # set false to leave as is
  tx_isolation = :serializable if tx_isolation.nil?
  @connection.transaction_isolation = tx_isolation if tx_isolation
  # if a user name was specified upon connection, the user's name is the
  # default schema for the connection, if a schema with that name exists
  set_schema(config[:schema]) if config.key?(:schema)
end
create_database(name = nil, options = {}) click to toggle source

@private

# File lib/arjdbc/derby/adapter.rb, line 449
def create_database(name = nil, options = {}); end
create_savepoint(name = current_savepoint_name(true)) click to toggle source

Ensure the savepoint name is unused before creating it. @override

# File lib/arjdbc/derby/adapter.rb, line 167
def create_savepoint(name = current_savepoint_name(true))
  release_savepoint(name) if @connection.marked_savepoint_names.include?(name)
  super(name)
end
create_schema(schema) click to toggle source

Creates a new Derby schema. @see set_schema

# File lib/arjdbc/derby/adapter.rb, line 433
def create_schema(schema)
  execute "CREATE SCHEMA #{schema}", 'Create Schema'
end
current_schema() click to toggle source

@return [String] the current schema name

# File lib/arjdbc/derby/adapter.rb, line 419
def current_schema
  @current_schema ||=
    select_value "SELECT CURRENT SCHEMA FROM SYS.SYSSCHEMAS FETCH FIRST 1 ROWS ONLY", 'SCHEMA'
end
current_schema=(schema) click to toggle source
Alias for: set_schema
distinct(columns, order_by) click to toggle source

SELECT DISTINCT clause for a given set of columns and a given ORDER BY clause.

Derby requires the ORDER BY columns in the select list for distinct queries, and requires that the ORDER BY include the distinct column. "`

distinct("posts.id", "posts.created_at desc")

“` @note This is based on distinct method for the PostgreSQL Adapter. @override

# File lib/arjdbc/derby/adapter.rb, line 383
def distinct(columns, order_by)
  "DISTINCT #{columns_for_distinct(columns, order_by)}"
end
drop_database(name = nil) click to toggle source

@private

# File lib/arjdbc/derby/adapter.rb, line 452
def drop_database(name = nil)
  tables.each { |table| drop_table(table) }
end
drop_schema(schema) click to toggle source

Drops an existing schema, needs to be empty (no DB objects).

# File lib/arjdbc/derby/adapter.rb, line 438
def drop_schema(schema)
  execute "DROP SCHEMA #{schema} RESTRICT", 'Drop Schema'
end
empty_insert_statement_value() click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 250
def empty_insert_statement_value
  'VALUES ( DEFAULT )' # won't work as Derby does need to know the columns count
end
execute(sql, name = nil, binds = []) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 475
def execute(sql, name = nil, binds = [])
  sql = to_sql(sql, binds)
  insert = self.class.insert?(sql)
  update = ! insert && ! self.class.select?(sql)
  sql = correct_is_null(sql, insert || update)
  super(sql, name, binds)
end
index_name_length() click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 133
def index_name_length
  128
end
init_connection(jdbc_connection) click to toggle source

@private

# File lib/arjdbc/derby/adapter.rb, line 108
def init_connection(jdbc_connection)
  md = jdbc_connection.meta_data
  major_version = md.database_major_version; minor_version = md.database_minor_version
  if major_version < 10 || (major_version == 10 && minor_version < 5)
    raise ::ActiveRecord::ConnectionNotEstablished, "Derby adapter requires Derby >= 10.5"
  end
  if major_version == 10 && minor_version < 8 # 10.8 ~ supports JDBC 4.1
    config[:connection_alive_sql] ||=
      'SELECT 1 FROM SYS.SYSSCHEMAS FETCH FIRST 1 ROWS ONLY' # FROM clause mandatory
  else
    # NOTE: since the loaded Java driver class can't change :
    Derby.send(:remove_method, :init_connection) rescue nil
  end
end
last_insert_id() click to toggle source

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/derby/adapter.rb, line 487
def last_insert_id
  @connection.identity_val_local
end
native_database_types() click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 161
def native_database_types
  NATIVE_DATABASE_TYPES
end
primary_keys(table_name) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 409
def primary_keys(table_name)
  @connection.primary_keys table_name.to_s.upcase
end
quote(value, column = nil) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 173
def quote(value, column = nil)
  return value.quoted_id if value.respond_to?(:quoted_id)
  return value if sql_literal?(value)
  return 'NULL' if value.nil?

  column_type = column && column.type
  if column_type == :string || column_type == :text
    # Derby is not permissive
    # e.g. sending an Integer to a VARCHAR column will fail
    case value
    when BigDecimal then value = value.to_s('F')
    when Numeric then value = value.to_s
    when true, false then value = value.to_s
    when Date, Time then value = quoted_date(value)
    else # on 2.3 attribute serialization needs to_yaml here
      value = value.to_s if ActiveRecord::VERSION::MAJOR >= 3
    end
  end

  case value
  when String, ActiveSupport::Multibyte::Chars
    if column_type == :text
      "CAST('#{quote_string(value)}' AS CLOB)"
    elsif column_type == :binary
      "CAST(X'#{quote_binary(value)}' AS BLOB)"
    elsif column_type == :xml
      "XMLPARSE(DOCUMENT '#{quote_string(value)}' PRESERVE WHITESPACE)"
    elsif column_type == :integer
      value.to_i
    elsif column_type == :float
      value.to_f
    else
      "'#{quote_string(value)}'"
    end
  else
    super
  end
end
quote_column_name(name) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 457
def quote_column_name(name)
  %{"#{name.to_s.upcase.gsub('"', '""')}"}
end
quote_table_name_for_assignment(table, attr) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 462
def quote_table_name_for_assignment(table, attr)
  quote_column_name(attr)
end
quoted_date(value) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 213
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
recreate_database(name = nil, options = {}) click to toggle source

@private

# File lib/arjdbc/derby/adapter.rb, line 443
def recreate_database(name = nil, options = {})
  drop_database(name)
  create_database(name, options)
end
remove_column(table_name, column_name, type = nil, options = {}) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 301
def remove_column(table_name, column_name, type = nil, options = {})
  do_remove_column(table_name, column_name)
end
Also aliased as: remove_columns
remove_columns(table_name, column_name, type = nil, options = {}) click to toggle source
Alias for: remove_column
remove_index(table_name, options) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 276
def remove_index(table_name, options)
  execute "DROP INDEX #{index_name(table_name, options)}"
end
rename_column(table_name, column_name, new_column_name) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 369
def rename_column(table_name, column_name, new_column_name)
  execute "RENAME COLUMN #{quote_table_name(table_name)}.#{quote_column_name(column_name)} " <<
          " TO #{quote_column_name(new_column_name)}"
end
rename_table(name, new_name) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 281
def rename_table(name, new_name)
  execute "RENAME TABLE #{quote_table_name(name)} TO #{quote_table_name(new_name)}"
end
reset_pk_sequence!(table, pk = nil, sequence = nil) click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 261
def reset_pk_sequence!(table, pk = nil, sequence = nil)
  klasses = classes_for_table_name(table)
  klass   = klasses.nil? ? nil : klasses.first
  pk      = klass.primary_key unless klass.nil?
  if pk && klass.columns_hash[pk].type == :integer
    reset_sequence!(klass.table_name, pk)
  end
end
reset_sequence!(table, column, sequence = nil) click to toggle source

Set the sequence to the max value of the table’s column. @override

# File lib/arjdbc/derby/adapter.rb, line 256
def reset_sequence!(table, column, sequence = nil)
  mpk = select_value("SELECT MAX(#{quote_column_name(column)}) FROM #{quote_table_name(table)}")
  execute("ALTER TABLE #{quote_table_name(table)} ALTER COLUMN #{quote_column_name(column)} RESTART WITH #{mpk.to_i + 1}")
end
set_schema(schema) click to toggle source

Change the current (implicit) Derby schema to be used for this connection.

# File lib/arjdbc/derby/adapter.rb, line 425
def set_schema(schema)
  @current_schema = nil
  execute "SET SCHEMA #{schema}", 'SCHEMA'
end
Also aliased as: current_schema=
table_definition(*args) click to toggle source
# File lib/arjdbc/derby/adapter.rb, line 245
def table_definition(*args)
  new_table_definition(TableDefinition, *args)
end
tables(name = nil) click to toggle source

@override

# File lib/arjdbc/derby/adapter.rb, line 414
def tables(name = nil)
  @connection.tables(nil, current_schema)
end
type_to_sql(type, limit = nil, precision = nil, scale = nil) click to toggle source

Convert the specified column type to a SQL string. @override

# File lib/arjdbc/derby/adapter.rb, line 228
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
  return super unless NO_LIMIT_TYPES.include?(t = type.to_s.downcase.to_sym)

  native_type = NATIVE_DATABASE_TYPES[t]
  native_type.is_a?(Hash) ? native_type[:name] : native_type
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.