aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/connection_adapters
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2005-07-03 08:31:14 +0000
committerJeremy Kemper <jeremy@bitsweat.net>2005-07-03 08:31:14 +0000
commit96c60b0ec6d59eec58f7919eaed9d1a878a57615 (patch)
tree6ced60e2be06edad726cf19586182b680684b0b6 /activerecord/lib/active_record/connection_adapters
parenta250a98a52be27700cfcf2aef236ff9a3c7304f3 (diff)
downloadrails-96c60b0ec6d59eec58f7919eaed9d1a878a57615.tar.gz
rails-96c60b0ec6d59eec58f7919eaed9d1a878a57615.tar.bz2
rails-96c60b0ec6d59eec58f7919eaed9d1a878a57615.zip
r1603@asus: jeremy | 2005-07-02 14:38:52 -0700
Faster MysqlAdapter#select. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1622 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/connection_adapters')
-rwxr-xr-xactiverecord/lib/active_record/connection_adapters/abstract_adapter.rb72
-rw-r--r--activerecord/lib/active_record/connection_adapters/db2_adapter.rb8
-rwxr-xr-xactiverecord/lib/active_record/connection_adapters/mysql_adapter.rb77
-rw-r--r--activerecord/lib/active_record/connection_adapters/oci_adapter.rb4
-rw-r--r--activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb2
-rw-r--r--activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb8
6 files changed, 86 insertions, 85 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
index 0503dbebea..82168c54ad 100755
--- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
@@ -16,7 +16,7 @@ def require_library_or_gem(library_name)
raise cannot_require
end
# 2. Rubygems is installed and loaded. Try to load the library again
- begin
+ begin
require library_name
rescue LoadError => gem_not_installed
raise cannot_require
@@ -32,7 +32,7 @@ module ActiveRecord
@config, @adapter_method = config, adapter_method
end
end
-
+
# The class -> [adapter_method, config] map
@@defined_connections = {}
@@ -92,32 +92,32 @@ module ActiveRecord
# for (not necessarily the current class).
def self.retrieve_connection #:nodoc:
klass = self
- until klass == ActiveRecord::Base.superclass
- Thread.current['active_connections'] ||= {}
- if Thread.current['active_connections'][klass]
- return Thread.current['active_connections'][klass]
- elsif @@defined_connections[klass]
- klass.connection = @@defined_connections[klass]
+ ar_super = ActiveRecord::Base.superclass
+ until klass == ar_super
+ if conn = (Thread.current['active_connections'] ||= {})[klass]
+ return conn
+ elsif conn = @@defined_connections[klass]
+ klass.connection = conn
return self.connection
end
klass = klass.superclass
end
raise ConnectionNotEstablished
end
-
+
# Returns true if a connection that's accessible to this class have already been opened.
def self.connected?
klass = self
until klass == ActiveRecord::Base.superclass
if Thread.current['active_connections'].is_a?(Hash) && Thread.current['active_connections'][klass]
- return true
+ return true
else
klass = klass.superclass
end
end
return false
end
-
+
# Remove the connection for this class. This will close the active
# connection and the defined connection (if they exist). The result
# can be used as argument for establish_connection, for easy
@@ -129,7 +129,7 @@ module ActiveRecord
Thread.current['active_connections'][klass] = nil
conn.config if conn
end
-
+
# Set the connection for the class.
def self.connection=(spec)
raise ConnectionNotEstablished unless spec
@@ -147,17 +147,15 @@ module ActiveRecord
module ConnectionAdapters # :nodoc:
class Column # :nodoc:
attr_reader :name, :default, :type, :limit
+ attr_accessor :primary
# The name should contain the name of the column, such as "name" in "name varchar(250)"
# The default should contain the type-casted default of the column, such as 1 in "count int(11) DEFAULT 1"
# The type parameter should either contain :integer, :float, :datetime, :date, :text, or :string
# The sql_type is just used for extracting the limit, such as 10 in "varchar(10)"
def initialize(name, default, sql_type = nil)
- @name, @default, @type = name, default, simplified_type(sql_type)
+ @name, @default, @type = name, type_cast(default), simplified_type(sql_type)
@limit = extract_limit(sql_type) unless sql_type.nil?
- end
-
- def default
- type_cast(@default)
+ @primary = nil
end
def klass
@@ -173,7 +171,7 @@ module ActiveRecord
when :boolean then Object
end
end
-
+
def type_cast(value)
if value.nil? then return nil end
case type
@@ -190,18 +188,18 @@ module ActiveRecord
else value
end
end
-
+
def human_name
Base.human_attribute_name(@name)
end
-
+
def string_to_binary(value)
value
- end
+ end
def binary_to_string(value)
value
- end
+ end
private
def string_to_date(string)
@@ -210,7 +208,7 @@ module ActiveRecord
# treat 0000-00-00 as nil
Date.new(date_array[0], date_array[1], date_array[2]) rescue nil
end
-
+
def string_to_time(string)
return string unless string.is_a?(String)
time_array = ParseDate.parsedate(string.to_s).compact
@@ -224,12 +222,12 @@ module ActiveRecord
# pad the resulting array with dummy date information
time_array[0] = 2000; time_array[1] = 1; time_array[2] = 1;
Time.send(Base.default_timezone, *time_array) rescue nil
- end
-
+ end
+
def extract_limit(sql_type)
$1.to_i if sql_type =~ /\((.*)\)/
end
-
+
def simplified_type(field_type)
case field_type
when /int/i
@@ -271,7 +269,7 @@ module ActiveRecord
# Returns an array of record hashes with the column names as a keys and fields as values.
def select_all(sql, name = nil) end
-
+
# Returns a record hash with the column names as a keys and fields as values.
def select_one(sql, name = nil) end
@@ -310,8 +308,8 @@ module ActiveRecord
# Begins the transaction (and turns off auto-committing).
def begin_db_transaction() end
-
- # Commits the transaction (and turns on auto-committing).
+
+ # Commits the transaction (and turns on auto-committing).
def commit_db_transaction() end
# Rolls back the transaction (and turns on auto-committing). Must be done if the transaction block
@@ -320,7 +318,7 @@ module ActiveRecord
def quote(value, column = nil)
case value
- when String
+ when String
if column && column.type == :binary
"'#{quote_string(column.string_to_binary(value))}'" # ' (for ruby-mode)
else
@@ -330,7 +328,7 @@ module ActiveRecord
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 "'#{value.to_s}'"
+ when Date then "'#{value.to_s}'"
when Time, DateTime then "'#{value.strftime("%Y-%m-%d %H:%M:%S")}'"
else "'#{quote_string(value.to_yaml)}'"
end
@@ -356,7 +354,7 @@ module ActiveRecord
return unless options
add_limit_offset!(sql, options)
end
-
+
def add_limit_offset!(sql, options)
return if options[:limit].nil?
sql << " LIMIT #{options[:limit]}"
@@ -399,7 +397,7 @@ module ActiveRecord
def log(sql, name, connection = nil)
connection ||= @connection
begin
- if @logger.nil? || @logger.level > Logger::INFO
+ if !@logger || @logger.level > Logger::INFO
yield connection
elsif block_given?
result = nil
@@ -418,11 +416,11 @@ module ActiveRecord
end
def log_info(sql, name, runtime)
- if @logger.nil? then return end
+ return unless @logger
@logger.info(
format_log_entry(
- "#{name.nil? ? "SQL" : name} (#{sprintf("%f", runtime)})",
+ "#{name.nil? ? "SQL" : name} (#{sprintf("%f", runtime)})",
sql.gsub(/ +/, " ")
)
)
@@ -435,7 +433,7 @@ module ActiveRecord
else
@@row_even = true; caller_color = "1;36"; message_color = "4;35"; dump_color = "0;37"
end
-
+
log_entry = " \e[#{message_color}m#{message}\e[m"
log_entry << " \e[#{dump_color}m%s\e[m" % dump if dump.kind_of?(String) && !dump.nil?
log_entry << " \e[#{dump_color}m%p\e[m" % dump if !dump.kind_of?(String) && !dump.nil?
@@ -448,7 +446,7 @@ module ActiveRecord
class TableDefinition
attr_accessor :columns
-
+
def initialize
@columns = []
end
diff --git a/activerecord/lib/active_record/connection_adapters/db2_adapter.rb b/activerecord/lib/active_record/connection_adapters/db2_adapter.rb
index b712971609..b7a164eddc 100644
--- a/activerecord/lib/active_record/connection_adapters/db2_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/db2_adapter.rb
@@ -79,14 +79,16 @@ begin
@connection.set_auto_commit_on
end
- def quote_column_name(name) name; end
+ def quote_column_name(column_name)
+ column_name
+ end
def adapter_name()
'DB2'
end
- def quote_string(s)
- s.gsub(/'/, "''") # ' (for ruby-mode)
+ def quote_string(string)
+ string.gsub(/'/, "''") # ' (for ruby-mode)
end
def add_limit_with_offset!(sql, limit, offset)
diff --git a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
index c11ce3772a..82ebf6bb4a 100755
--- a/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb
@@ -108,20 +108,26 @@ module ActiveRecord
def insert(sql, name = nil, pk = nil, id_value = nil)
execute(sql, name = nil)
- return id_value || @connection.insert_id
+ id_value || @connection.insert_id
end
- def execute(sql, name = nil)
- begin
- return log(sql, name, @connection) { |connection| connection.query(sql) }
- rescue ActiveRecord::StatementInvalid => exception
- if LOST_CONNECTION_ERROR_MESSAGES.any? { |msg| exception.message.split(":").first =~ /^#{msg}/ }
- @connection.real_connect(*@connection_options)
- @logger.info("Retrying invalid statement with reopened connection") if @logger
- return log(sql, name, @connection) { |connection| connection.query(sql) }
+ def execute(sql, name = nil, retries = 2)
+ unless @logger
+ @connection.query(sql)
+ else
+ log(sql, name) { @connection.query(sql) }
+ end
+ rescue ActiveRecord::StatementInvalid => exception
+ if LOST_CONNECTION_ERROR_MESSAGES.any? { |msg| exception.message.split(":").first =~ /^#{msg}/ }
+ @connection.real_connect(*@connection_options)
+ @logger.info("Retrying invalid statement with reopened connection") if @logger
+ unless @logger
+ @connection.query(sql)
else
- raise
+ log(sql, name) { @connection.query(sql) }
end
+ else
+ raise
end
end
@@ -134,36 +140,30 @@ module ActiveRecord
def begin_db_transaction
- begin
- execute "BEGIN"
- rescue Exception
- # Transactions aren't supported
- end
+ execute "BEGIN"
+ rescue Exception
+ # Transactions aren't supported
end
def commit_db_transaction
- begin
- execute "COMMIT"
- rescue Exception
- # Transactions aren't supported
- end
+ execute "COMMIT"
+ rescue Exception
+ # Transactions aren't supported
end
def rollback_db_transaction
- begin
- execute "ROLLBACK"
- rescue Exception
- # Transactions aren't supported
- end
+ execute "ROLLBACK"
+ rescue Exception
+ # Transactions aren't supported
end
def quote_column_name(name)
- return "`#{name}`"
+ "`#{name}`"
end
- def quote_string(s)
- Mysql::quote(s)
+ def quote_string(string)
+ Mysql::quote(string)
end
@@ -174,12 +174,12 @@ module ActiveRecord
end
def add_limit_offset!(sql, options)
- return if options[:limit].nil?
-
- if options[:offset].blank?
- sql << " LIMIT #{options[:limit]}"
- else
- sql << " LIMIT #{options[:offset]}, #{options[:limit]}"
+ unless options[:limit].blank?
+ unless options[:offset].blank?
+ sql << " LIMIT #{options[:offset]}, #{options[:limit]}"
+ else
+ sql << " LIMIT #{options[:limit]}"
+ end
end
end
@@ -203,14 +203,15 @@ module ActiveRecord
private
def select(sql, name = nil)
- result = nil
@connection.query_with_result = true
result = execute(sql, name)
rows = []
- all_fields_initialized = result.fetch_fields.inject({}) { |all_fields, f| all_fields[f.name] = nil; all_fields }
- result.each_hash { |row| rows << all_fields_initialized.dup.update(row) }
+ #all_fields_initialized = result.fetch_fields.inject({}) { |all_fields, f| all_fields[f.name] = nil; all_fields }
+ #result.each_hash { |row| rows << all_fields_initialized.dup.update(row) }
+ result.each_hash { |row| rows << row }
+ result.free
rows
end
end
end
-end \ No newline at end of file
+end
diff --git a/activerecord/lib/active_record/connection_adapters/oci_adapter.rb b/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
index ef2e288be5..ec3bac67d3 100644
--- a/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/oci_adapter.rb
@@ -99,8 +99,8 @@ begin
# * <tt>:password</tt> -- Defaults to nothing
# * <tt>:host</tt> -- Defaults to localhost
class OCIAdapter < AbstractAdapter
- def quote_string(s)
- s.gsub /'/, "''"
+ def quote_string(string)
+ string.gsub(/'/, "''")
end
def quote(value, column = nil)
diff --git a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb
index e2e55ef01f..a76308b63e 100644
--- a/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/sqlite_adapter.rb
@@ -159,7 +159,7 @@ module ActiveRecord
end
def quote_column_name(name)
- return "'#{name}'"
+ "'#{name}'"
end
def adapter_name()
diff --git a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb
index dd5a7eb39f..f685a0a787 100644
--- a/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/sqlserver_adapter.rb
@@ -300,8 +300,8 @@ module ActiveRecord
end
end
- def quote_string(s)
- s.gsub(/\'/, "''")
+ def quote_string(string)
+ string.gsub(/\'/, "''")
end
def quote_column_name(name)
@@ -363,7 +363,7 @@ module ActiveRecord
end
def has_identity_column(table_name)
- return get_identity_column(table_name) != nil
+ !get_identity_column(table_name).nil?
end
def get_identity_column(table_name)
@@ -377,7 +377,7 @@ module ActiveRecord
end
def query_contains_identity_column(sql, col)
- return sql =~ /\[#{col}\]/
+ sql =~ /\[#{col}\]/
end
def change_order_direction(order)