Skip to content

Commit 6fac0a4

Browse files
committed
Memory performance, using static resources, ivars, etc.
1 parent 7720eeb commit 6fac0a4

File tree

8 files changed

+63
-109
lines changed

8 files changed

+63
-109
lines changed

lib/active_record/connection_adapters/sqlserver/database_statements.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,11 @@ def do_execute(sql, name = nil)
203203
end
204204

205205
def raw_connection_do(sql)
206-
case connection_mode
206+
case @connection_options[:mode]
207207
when :odbc
208-
raw_connection.do(sql)
208+
@connection.do(sql)
209209
else :adonet
210-
raw_connection.create_command.tap{ |cmd| cmd.command_text = sql }.execute_non_query
210+
@connection.create_command.tap{ |cmd| cmd.command_text = sql }.execute_non_query
211211
end
212212
end
213213

@@ -226,17 +226,17 @@ def raw_select(sql, name=nil, options={})
226226

227227
def raw_connection_run(sql)
228228
with_auto_reconnect do
229-
case connection_mode
229+
case @connection_options[:mode]
230230
when :odbc
231-
block_given? ? raw_connection.run_block(sql) { |handle| yield(handle) } : raw_connection.run(sql)
231+
block_given? ? @connection.run_block(sql) { |handle| yield(handle) } : @connection.run(sql)
232232
else :adonet
233-
raw_connection.create_command.tap{ |cmd| cmd.command_text = sql }.execute_reader
233+
@connection.create_command.tap{ |cmd| cmd.command_text = sql }.execute_reader
234234
end
235235
end
236236
end
237237

238238
def handle_more_results?(handle)
239-
case connection_mode
239+
case @connection_options[:mode]
240240
when :odbc
241241
handle.more_results
242242
when :adonet
@@ -245,7 +245,7 @@ def handle_more_results?(handle)
245245
end
246246

247247
def handle_to_names_and_values(handle, options={})
248-
case connection_mode
248+
case @connection_options[:mode]
249249
when :odbc
250250
handle_to_names_and_values_odbc(handle, options)
251251
when :adonet
@@ -320,7 +320,7 @@ def handle_to_names_and_values_adonet(handle, options={})
320320
end
321321

322322
def finish_statement_handle(handle)
323-
case connection_mode
323+
case @connection_options[:mode]
324324
when :odbc
325325
handle.drop if handle && handle.respond_to?(:drop) && !handle.finished?
326326
when :adonet

lib/active_record/connection_adapters/sqlserver/errors.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ module Errors
1919

2020

2121
def lost_connection_exceptions
22-
exceptions = LOST_CONNECTION_EXCEPTIONS[connection_mode]
22+
exceptions = LOST_CONNECTION_EXCEPTIONS[@connection_options[:mode]]
2323
@lost_connection_exceptions ||= exceptions ? exceptions.map{ |e| e.constantize rescue nil }.compact : []
2424
end
2525

2626
def lost_connection_messages
27-
LOST_CONNECTION_MESSAGES[connection_mode]
27+
LOST_CONNECTION_MESSAGES[@connection_options[:mode]]
2828
end
2929

3030
end

lib/active_record/connection_adapters/sqlserver/quoting.rb

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module ConnectionAdapters
33
module Sqlserver
44
module Quoting
55

6+
QUOTED_TRUE, QUOTED_FALSE = '1', '0'
7+
68
def quote(value, column = nil)
79
case value
810
when String, ActiveSupport::Multibyte::Chars
@@ -22,21 +24,21 @@ def quote_string(string)
2224
string.to_s.gsub(/\'/, "''")
2325
end
2426

25-
def quote_column_name(column_name)
26-
column_name.to_s.split('.').map{ |name| name =~ /^\[.*\]$/ ? name : "[#{name}]" }.join('.')
27+
def quote_column_name(name)
28+
@sqlserver_quoted_column_and_table_names[name] ||=
29+
name.to_s.split('.').map{ |n| n =~ /^\[.*\]$/ ? n : "[#{n}]" }.join('.')
2730
end
2831

29-
def quote_table_name(table_name)
30-
return table_name if table_name =~ /^\[.*\]$/
31-
quote_column_name(table_name)
32+
def quote_table_name(name)
33+
quote_column_name(name)
3234
end
3335

3436
def quoted_true
35-
'1'
37+
QUOTED_TRUE
3638
end
3739

3840
def quoted_false
39-
'0'
41+
QUOTED_FALSE
4042
end
4143

4244
def quoted_date(value)

lib/active_record/connection_adapters/sqlserver/schema_statements.rb

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,7 @@ module Sqlserver
44
module SchemaStatements
55

66
def native_database_types
7-
{
8-
:primary_key => "int NOT NULL IDENTITY(1,1) PRIMARY KEY",
9-
:string => { :name => native_string_database_type, :limit => 255 },
10-
:text => { :name => native_text_database_type },
11-
:integer => { :name => "int", :limit => 4 },
12-
:float => { :name => "float", :limit => 8 },
13-
:decimal => { :name => "decimal" },
14-
:datetime => { :name => "datetime" },
15-
:timestamp => { :name => "datetime" },
16-
:time => { :name => native_time_database_type },
17-
:date => { :name => native_date_database_type },
18-
:binary => { :name => native_binary_database_type },
19-
:boolean => { :name => "bit"},
20-
# These are custom types that may move somewhere else for good schema_dumper.rb hacking to output them.
21-
:char => { :name => 'char' },
22-
:varchar_max => { :name => 'varchar(max)' },
23-
:nchar => { :name => "nchar" },
24-
:nvarchar => { :name => "nvarchar", :limit => 255 },
25-
:nvarchar_max => { :name => "nvarchar(max)" },
26-
:ntext => { :name => "ntext" }
27-
}
7+
ActiveRecord::ConnectionAdapters::SQLServerAdapter::NATIVE_DATABASE_TYPES
288
end
299

3010
def tables(name = nil)
@@ -167,6 +147,31 @@ def views(name = nil)
167147

168148
# === SQLServer Specific ======================================== #
169149

150+
def initialize_native_database_types
151+
return if defined?(ActiveRecord::ConnectionAdapters::SQLServerAdapter::NATIVE_DATABASE_TYPES)
152+
ActiveRecord::ConnectionAdapters::SQLServerAdapter.const_set(:NATIVE_DATABASE_TYPES,{
153+
:primary_key => "int NOT NULL IDENTITY(1,1) PRIMARY KEY",
154+
:string => { :name => native_string_database_type, :limit => 255 },
155+
:text => { :name => native_text_database_type },
156+
:integer => { :name => "int", :limit => 4 },
157+
:float => { :name => "float", :limit => 8 },
158+
:decimal => { :name => "decimal" },
159+
:datetime => { :name => "datetime" },
160+
:timestamp => { :name => "datetime" },
161+
:time => { :name => native_time_database_type },
162+
:date => { :name => native_date_database_type },
163+
:binary => { :name => native_binary_database_type },
164+
:boolean => { :name => "bit"},
165+
# These are custom types that may move somewhere else for good schema_dumper.rb hacking to output them.
166+
:char => { :name => 'char' },
167+
:varchar_max => { :name => 'varchar(max)' },
168+
:nchar => { :name => "nchar" },
169+
:nvarchar => { :name => "nvarchar", :limit => 255 },
170+
:nvarchar_max => { :name => "nvarchar(max)" },
171+
:ntext => { :name => "ntext" }
172+
})
173+
end
174+
170175
def column_definitions(table_name)
171176
db_name = unqualify_db_name(table_name)
172177
db_name_with_period = "#{db_name}." if db_name
@@ -330,6 +335,7 @@ def initialize_sqlserver_caches(reset_columns=true)
330335
@sqlserver_columns_cache = {} if reset_columns
331336
@sqlserver_views_cache = nil
332337
@sqlserver_view_information_cache = {}
338+
@sqlserver_quoted_column_and_table_names = {}
333339
end
334340

335341
# === SQLServer Specific (Identity Inserts) ===================== #

lib/active_record/connection_adapters/sqlserver_adapter.rb

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def is_identity?
102102
end
103103

104104
def is_utf8?
105-
sql_type =~ /nvarchar|ntext|nchar/i
105+
@sql_type =~ /nvarchar|ntext|nchar/i
106106
end
107107

108108
def default_function
@@ -185,17 +185,22 @@ class SQLServerAdapter < AbstractAdapter
185185
DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+(\d{4})/
186186
SUPPORTED_VERSIONS = [2005,2008].freeze
187187

188+
attr_reader :database_version, :database_year
189+
188190
cattr_accessor :native_text_database_type, :native_binary_database_type, :native_string_database_type,
189191
:log_info_schema_queries, :enable_default_unicode_types, :auto_connect,
190192
:cs_equality_operator
191193

192194
def initialize(logger,config)
193195
@connection_options = config
194196
connect
195-
super(raw_connection, logger)
197+
super(@connection, logger)
198+
@database_version = info_schema_query { select_value('SELECT @@version') }
199+
@database_year = DATABASE_VERSION_REGEXP.match(@database_version)[1].to_i rescue 0
200+
initialize_native_database_types
196201
initialize_sqlserver_caches
197202
use_database
198-
unless SUPPORTED_VERSIONS.include?(database_year)
203+
unless SUPPORTED_VERSIONS.include?(@database_year)
199204
raise NotImplementedError, "Currently, only #{SUPPORTED_VERSIONS.to_sentence} are supported."
200205
end
201206
end
@@ -249,11 +254,11 @@ def reconnect!
249254
end
250255

251256
def disconnect!
252-
case connection_mode
257+
case @connection_options[:mode]
253258
when :odbc
254-
raw_connection.disconnect rescue nil
259+
@connection.disconnect rescue nil
255260
else :adonet
256-
raw_connection.close rescue nil
261+
@connection.close rescue nil
257262
end
258263
end
259264

@@ -274,32 +279,24 @@ def primary_key(table_name)
274279

275280
# === SQLServer Specific (DB Reflection) ======================== #
276281

277-
def database_version
278-
@database_version ||= info_schema_query { select_value('SELECT @@version') }
279-
end
280-
281-
def database_year
282-
DATABASE_VERSION_REGEXP.match(database_version)[1].to_i
283-
end
284-
285282
def sqlserver?
286283
true
287284
end
288285

289286
def sqlserver_2005?
290-
database_year == 2005
287+
@database_year == 2005
291288
end
292289

293290
def sqlserver_2008?
294-
database_year == 2008
291+
@database_year == 2008
295292
end
296293

297294
def version
298295
self.class::VERSION
299296
end
300297

301298
def inspect
302-
"#<#{self.class} version: #{version}, year: #{database_year}, connection_options: #{@connection_options.inspect}>"
299+
"#<#{self.class} version: #{version}, year: #{@database_year}, connection_options: #{@connection_options.inspect}>"
303300
end
304301

305302
def auto_connect
@@ -352,7 +349,7 @@ def translate_exception(e, message)
352349

353350
def connect
354351
config = @connection_options
355-
@connection = case connection_mode
352+
@connection = case @connection_options[:mode]
356353
when :odbc
357354
odbc = ['::ODBC','::ODBC_UTF8','::ODBC_NONE'].detect{ |odbc_ns| odbc_ns.constantize rescue nil }.constantize
358355
odbc.connect config[:dsn], config[:username], config[:password]
@@ -411,10 +408,6 @@ def auto_reconnected?
411408
ensure
412409
@auto_connecting = false
413410
end
414-
415-
def connection_mode
416-
@connection_options[:mode]
417-
end
418411

419412
end #class SQLServerAdapter < AbstractAdapter
420413

test/cases/adapter_test_sqlserver.rb

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,6 @@ def setup
7070
assert_contains @supported_version, @connection.database_year
7171
end
7272

73-
should 'return true to #sqlserver_2005?' do
74-
@connection.stubs(:database_version).returns(@sqlserver_2005_string)
75-
assert @connection.sqlserver_2005?
76-
end
77-
78-
should 'return true to #sqlserver_2008?' do
79-
@connection.stubs(:database_version).returns(@sqlserver_2008_string)
80-
assert @connection.sqlserver_2008?
81-
end
82-
8373
end
8474

8575
context 'for #unqualify_table_name and #unqualify_db_name' do

test/cases/migration_test_sqlserver.rb

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -64,40 +64,3 @@ def setup
6464
end
6565

6666

67-
class ChangeTableMigrationsTest < ActiveRecord::TestCase
68-
69-
COERCED_TESTS = [:test_string_creates_string_column]
70-
71-
include SqlserverCoercedTest
72-
73-
def setup
74-
@connection = Person.connection
75-
@connection.create_table :delete_me, :force => true do |t|
76-
end
77-
end
78-
79-
def teardown
80-
@connection.drop_table :delete_me rescue nil
81-
end
82-
83-
def test_coerced_string_creates_string_column
84-
with_sqlserver_change_table do |t|
85-
@connection.expects(:add_column).with(:delete_me, :foo, sqlserver_string_column, {})
86-
@connection.expects(:add_column).with(:delete_me, :bar, sqlserver_string_column, {})
87-
t.string :foo, :bar
88-
end
89-
end
90-
91-
protected
92-
93-
def with_sqlserver_change_table
94-
@connection.change_table :delete_me do |t|
95-
yield t
96-
end
97-
end
98-
99-
def sqlserver_string_column
100-
"#{@connection.native_string_database_type}(255)"
101-
end
102-
103-
end

test/cases/sqlserver_helper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def raw_select_with_query_record(sql, name=nil, options={})
9393
module ActiveRecord
9494
class TestCase < ActiveSupport::TestCase
9595
class << self
96-
def connection_mode_odbc? ; ActiveRecord::Base.connection.send(:connection_mode) == :odbc ; end
96+
def connection_mode_odbc? ; ActiveRecord::Base.connection.instance_variable_get(:@connection_options)[:mode] == :odbc ; end
9797
def sqlserver_2005? ; ActiveRecord::Base.connection.sqlserver_2005? ; end
9898
def sqlserver_2008? ; ActiveRecord::Base.connection.sqlserver_2008? ; end
9999
def ruby_19? ; RUBY_VERSION >= '1.9' ; end

0 commit comments

Comments
 (0)