diff options
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters/oracle_adapter.rb')
-rw-r--r-- | activerecord/lib/active_record/connection_adapters/oracle_adapter.rb | 244 |
1 files changed, 0 insertions, 244 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb b/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb deleted file mode 100644 index 2cdb7ec3f7..0000000000 --- a/activerecord/lib/active_record/connection_adapters/oracle_adapter.rb +++ /dev/null @@ -1,244 +0,0 @@ -# Author: Maik Schmidt <contact@maik-schmidt.de> -require 'active_record/connection_adapters/abstract_adapter' -require 'date' - -begin - - module ActiveRecord - class Base - # Establishes a connection to the database that's used by - # all Active Record objects - def self.oracle_connection(config) # :nodoc: - require 'oracle' unless self.class.const_defined?(:ORAconn) - symbolize_strings_in_hash(config) - usr = config[:username] || '' - pwd = config[:password] || '' - db = config[:database] || '' - - connection = ORAconn.logon(usr, pwd, db) - cursor = connection.open - cursor.parse("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'") - rows_affected = cursor.exec - cursor.close - ConnectionAdapters::OracleAdapter.new(connection) - end - end - - module ConnectionAdapters - class OracleAdapter < AbstractAdapter - def select_all(sql, name = nil) - select(sql, name) - end - - def select_one(sql, name = nil) - select(sql, name).first - end - - # Oracle does not support auto-generated columns, so we have to use - # sequences. Every insert is followed by a select statement, which - # returns the current sequence value. The statements are encapsulated - # in an anonymous PL/SQL block (supported since Oracle 7.3) to prevent - # race conditions and to maximize performance. - def insert(sql, name = nil, pk = nil, id_value = nil) - new_id = nil - if !id_value.nil? - execute(sql, name) - new_id = id_value - else - pk_col = pk || ActiveRecord::Base::primary_key - if sql !~ Regexp.new('\b' + pk_col + '\b') - seq_name = sql.sub(/^\s*insert\s+?into\s+(\S+).*$/im, '\1') + "_id" - sql.sub!(/(into\s+.*?\()/im, '\1' + "#{pk_col}, ") - sql.sub!(/(values\s*\()/im, '\1' + "#{seq_name}.nextval, ") - new_id = ' ' * 40 # Enough space for String representation of ID? - log(sql, name, @connection) do |connection| - cursor = connection.open - s = "begin #{sql}; select #{seq_name}.currval into :new_id from dual; end;" - cursor.parse(s) - cursor.bindrv(':new_id', new_id) - cursor.exec - cursor.close - new_id = new_id.to_i - end - else - execute(sql, name) - end - end - new_id - end - - def execute(sql, name = nil) - rows_affected = 0 - log(sql, name, @connection) do |connection| - cursor = connection.open - cursor.parse(sql) - rows_affected = cursor.exec - cursor.close - end - rows_affected - end - - alias_method :update, :execute - alias_method :delete, :execute - - def begin_db_transaction - @connection.commitoff - end - - def commit_db_transaction - @connection.commit - @connection.commiton - end - - def rollback_db_transaction - @connection.rollback - @connection.commiton - end - - def quote_column_name(name) name; end - - def quote(value, column = nil) - if column && column.type == :timestamp && value.class.to_s == "String" - begin - value = DateTime.parse(value) - rescue => ex - # Value cannot be parsed. - end - end - - case value - when String - if column && column.type == :binary - "'#{quote_string(column.string_to_binary(value))}'" # ' (for ruby-mode) - else - "'#{quote_string(value)}'" # ' (for ruby-mode) - end - when NilClass then "NULL" - when TrueClass then (column && column.type == :boolean ? "'t'" : "1") - when FalseClass then (column && column.type == :boolean ? "'f'" : "0") - when Float, Fixnum, Bignum then value.to_s - when Date then "to_date('#{value.strftime("%Y-%m-%d")}', 'YYYY-MM-DD')" - when Time, DateTime then "to_date('#{value.strftime("%Y-%m-%d %H:%M:%S")}', 'YYYY-MM-DD HH24:MI:SS')" - else "'#{quote_string(value.to_yaml)}'" - end - end - - def quote_string(s) - s.gsub(/'/, "''") # ' (for ruby-mode) - end - - def add_limit!(sql, limit) - l, o = limit.to_s.scan(/\d+/) - if o.nil? - sql.sub!(/^.*$/im, "select * from (#{sql}) where rownum <= #{l}") - else - raise ArgumentError, "LIMIT clauses with OFFSET are not supported yet!" - end - end - - def columns(table_name, name = nil) - sql = <<-SQL - select column_name, - data_type, - data_length, - data_precision, - data_default - from user_tab_columns - where table_name = upper('#{table_name}') - SQL - result = [] - cols = select_all(sql, name) - cols.each do |c| - name = c['column_name'].downcase - default = c['data_default'] - default = (default == 'NULL') ? nil : default - type = get_sql_type(c['data_type'], c['data_length']) - result << Column.new(name, default, type) - end - result - end - - private - - def get_sql_type(type_name, type_length) - case type_name - when /timestamp/i - return "TIMESTAMP" - when /number/i - return "INT" - when /date/i - return "DATE" - else - return "#{type_name}(#{type_length})" - end - end - - def select(sql, name = nil) - col_names = [] - cursor = nil - log(sql, name, @connection) do |connection| - cursor = connection.open - col_names = parse(cursor, sql) - cursor.exec - end - - rows = [] - while cursor.fetch do - row = {} - col_names.each_with_index do |name, i| - row[name] = cursor.getCol(i + 1)[0] - end - rows << row - end - cursor.close - rows - end - - VARCHAR2 = 1 - NUMBER = 2 - INTEGER = 3 ## external - FLOAT = 4 ## external - LONG = 8 - ROWID = 11 - DATE = 12 - RAW = 23 - LONG_RAW = 24 - UNSIGNED_INT = 68 ## external - CHAR = 96 - MLSLABEL = 105 - - def parse(cursor, sql) - cursor.parse(sql) - colnr = 1 - col_names = [] - loop { - colinfo = cursor.describe(colnr) - break if colinfo.nil? - - col_names << colinfo[2].downcase - collength, coltype = colinfo[3], colinfo[1] - - collength, coltype = case coltype - when NUMBER - [40, VARCHAR2] - when VARCHAR2, CHAR - [(collength * 1.5).ceil, VARCHAR2] - when LONG - [65535, LONG] - when LONG_RAW - [65535, LONG_RAW] - else - [collength, VARCHAR2] - end - - cursor.define(colnr, collength, coltype) - colnr += 1 - } - col_names - end - end - end - end -rescue LoadError - # Oracle driver is unavailable. -end |