diff options
-rw-r--r-- | lib/arel/select_manager.rb | 8 | ||||
-rw-r--r-- | lib/arel/visitors/to_sql.rb | 30 | ||||
-rw-r--r-- | test/support/fake_record.rb | 16 | ||||
-rw-r--r-- | test/visitors/test_ibm_db.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_informix.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_join_sql.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_mssql.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_mysql.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_postgres.rb | 2 | ||||
-rw-r--r-- | test/visitors/test_to_sql.rb | 24 |
10 files changed, 38 insertions, 52 deletions
diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb index ce8a9caf23..82b73cf3aa 100644 --- a/lib/arel/select_manager.rb +++ b/lib/arel/select_manager.rb @@ -51,7 +51,7 @@ module Arel if $VERBOSE warn "(#{caller.first}) where_clauses is deprecated and will be removed in arel 3.0.0 with no replacement" end - to_sql = Visitors::ToSql.new @engine.connection_pool + to_sql = Visitors::ToSql.new @engine.connection @ctx.wheres.map { |c| to_sql.accept c } end @@ -161,13 +161,13 @@ module Arel def wheres warn "#{caller[0]}: SelectManager#wheres is deprecated and will be removed in ARel 3.0.0 with no replacement" - Compatibility::Wheres.new @engine.connection_pool, @ctx.wheres + Compatibility::Wheres.new @engine.connection, @ctx.wheres end def where_sql return if @ctx.wheres.empty? - viz = Visitors::WhereSql.new @engine.connection_pool + viz = Visitors::WhereSql.new @engine.connection Nodes::SqlLiteral.new viz.accept @ctx end @@ -222,7 +222,7 @@ module Arel end def order_clauses - visitor = Visitors::OrderClauses.new(@engine.connection_pool) + visitor = Visitors::OrderClauses.new(@engine.connection) visitor.accept(@ast).map { |x| Nodes::SqlLiteral.new x } diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb index b414234766..ab48ce8724 100644 --- a/lib/arel/visitors/to_sql.rb +++ b/lib/arel/visitors/to_sql.rb @@ -4,30 +4,22 @@ require 'date' module Arel module Visitors class ToSql < Arel::Visitors::Visitor - def initialize pool - @pool = pool - @connection = nil + attr_accessor :last_column + + def initialize connection + @connection = connection + @schema_cache = connection.schema_cache @quoted_tables = {} @quoted_columns = {} + @last_column = nil end def accept object self.last_column = nil - @pool.with_connection do |conn| - @connection = conn - super - end + super end private - def last_column= col - Thread.current[:arel_visitors_to_sql_last_column] = col - end - - def last_column - Thread.current[:arel_visitors_to_sql_last_column] - end - def visit_Arel_Nodes_DeleteStatement o [ "DELETE FROM #{visit o.relation}", @@ -97,7 +89,7 @@ key on UpdateManager using UpdateManager#key= end def table_exists? name - @pool.table_exists? name + @schema_cache.table_exists? name end def column_for attr @@ -110,7 +102,7 @@ key on UpdateManager using UpdateManager#key= end def column_cache - @pool.columns_hash + @schema_cache.columns_hash end def visit_Arel_Nodes_Values o @@ -387,7 +379,9 @@ key on UpdateManager using UpdateManager#key= alias :visit_Bignum :literal alias :visit_Fixnum :literal - def quoted o; quote(o, last_column) end + def quoted o + quote(o, last_column) + end alias :visit_ActiveSupport_Multibyte_Chars :quoted alias :visit_ActiveSupport_StringInquirer :quoted diff --git a/test/support/fake_record.rb b/test/support/fake_record.rb index ddef7b66c5..79182f86bd 100644 --- a/test/support/fake_record.rb +++ b/test/support/fake_record.rb @@ -3,9 +3,10 @@ module FakeRecord end class Connection - attr_reader :tables, :columns_hash, :visitor + attr_reader :tables, :columns_hash + attr_accessor :visitor - def initialize(visitor) + def initialize(visitor = nil) @tables = %w{ users photos developers products} @columns = { 'users' => [ @@ -50,6 +51,10 @@ module FakeRecord "\"#{name.to_s}\"" end + def schema_cache + self + end + def quote thing, column = nil if column && column.type == :integer return 'NULL' if thing.nil? @@ -79,7 +84,8 @@ module FakeRecord def initialize @spec = Spec.new(:adapter => 'america') - @connection = Connection.new(Arel::Visitors::ToSql.new(self)) + @connection = Connection.new + @connection.visitor = Arel::Visitors::ToSql.new(connection) end def with_connection @@ -93,6 +99,10 @@ module FakeRecord def columns_hash connection.columns_hash end + + def schema_cache + connection + end end class Base diff --git a/test/visitors/test_ibm_db.rb b/test/visitors/test_ibm_db.rb index 90008ba05e..b055e883d6 100644 --- a/test/visitors/test_ibm_db.rb +++ b/test/visitors/test_ibm_db.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the ibm_db visitor' do before do - @visitor = IBM_DB.new Table.engine.connection_pool + @visitor = IBM_DB.new Table.engine.connection end it 'uses FETCH FIRST n ROWS to limit results' do diff --git a/test/visitors/test_informix.rb b/test/visitors/test_informix.rb index 422da846fe..67b02e0a64 100644 --- a/test/visitors/test_informix.rb +++ b/test/visitors/test_informix.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the informix visitor' do before do - @visitor = Informix.new Table.engine.connection_pool + @visitor = Informix.new Table.engine.connection end it 'uses LIMIT n to limit results' do diff --git a/test/visitors/test_join_sql.rb b/test/visitors/test_join_sql.rb index 6f7440cc47..b3fc7661aa 100644 --- a/test/visitors/test_join_sql.rb +++ b/test/visitors/test_join_sql.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the join_sql visitor' do before do - @visitor = ToSql.new Table.engine.connection_pool + @visitor = ToSql.new Table.engine.connection @visitor.extend(JoinSql) end diff --git a/test/visitors/test_mssql.rb b/test/visitors/test_mssql.rb index 21588f53cf..d62d4b8d1f 100644 --- a/test/visitors/test_mssql.rb +++ b/test/visitors/test_mssql.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the mssql visitor' do before do - @visitor = MSSQL.new Table.engine.connection_pool + @visitor = MSSQL.new Table.engine.connection @table = Arel::Table.new "users" end diff --git a/test/visitors/test_mysql.rb b/test/visitors/test_mysql.rb index 487db325e8..6330112229 100644 --- a/test/visitors/test_mysql.rb +++ b/test/visitors/test_mysql.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the mysql visitor' do before do - @visitor = MySQL.new Table.engine.connection_pool + @visitor = MySQL.new Table.engine.connection end it 'squashes parenthesis on multiple unions' do diff --git a/test/visitors/test_postgres.rb b/test/visitors/test_postgres.rb index e8df681269..921bd96c1a 100644 --- a/test/visitors/test_postgres.rb +++ b/test/visitors/test_postgres.rb @@ -4,7 +4,7 @@ module Arel module Visitors describe 'the postgres visitor' do before do - @visitor = PostgreSQL.new Table.engine.connection_pool + @visitor = PostgreSQL.new Table.engine.connection end describe 'locking' do diff --git a/test/visitors/test_to_sql.rb b/test/visitors/test_to_sql.rb index 12af197596..9b86a89300 100644 --- a/test/visitors/test_to_sql.rb +++ b/test/visitors/test_to_sql.rb @@ -1,14 +1,10 @@ require 'helper' -class Arel::Visitors::ToSql - def last_column; Thread.current[:arel_visitors_to_sql_last_column]; end -end - module Arel module Visitors describe 'the to_sql visitor' do before do - @visitor = ToSql.new Table.engine.connection_pool + @visitor = ToSql.new Table.engine.connection @table = Table.new(:users) @attr = @table[:id] end @@ -29,20 +25,6 @@ module Arel assert visited, 'hello method was called' end - it "should be thread safe around usage of last_column" do - visit_integer_column = Thread.new do - Thread.stop - @visitor.send(:visit_Arel_Attributes_Attribute, @attr) - end - - sleep 0.2 - @visitor.accept(@table[:name]) - assert_equal(:string, @visitor.last_column.type) - visit_integer_column.run - visit_integer_column.join - assert_equal(:string, @visitor.last_column.type) - end - it 'should not quote sql literals' do node = @table[Arel.star] sql = @visitor.accept node @@ -220,7 +202,7 @@ module Arel end end in_node = Nodes::In.new @attr, %w{ a b c } - visitor = visitor.new(Table.engine.connection_pool) + visitor = visitor.new(Table.engine.connection) visitor.expected = Table.engine.connection.columns(:users).find { |x| x.name == 'name' } @@ -308,7 +290,7 @@ module Arel end end in_node = Nodes::NotIn.new @attr, %w{ a b c } - visitor = visitor.new(Table.engine.connection_pool) + visitor = visitor.new(Table.engine.connection) visitor.expected = Table.engine.connection.columns(:users).find { |x| x.name == 'name' } |