activerecord-sqlserver-adapter 2.3.12 → 2.3.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +11 -0
- data/Rakefile +0 -7
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +10 -11
- data/test/cases/basics_test_sqlserver.rb +59 -1
- data/test/cases/column_test_sqlserver.rb +2 -1
- data/test/cases/migration_test_sqlserver.rb +22 -0
- data/test/connections/native_sqlserver_odbc/connection.rb +1 -1
- metadata +4 -4
data/CHANGELOG
CHANGED
@@ -1,4 +1,15 @@
|
|
1
1
|
|
2
|
+
* 2-3-stable *
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
* 2.3.13 *
|
7
|
+
|
8
|
+
* Fixed native database type memoization, now at connection instance level. Fix #execute_procedure for :dblib mode to return indifferent access rows too. Misc test case fixes for 2000 & 2005 need for using coerced Time vs Date type. Fix SQL Server 2000's lack of using TinyTds' native affected rows for UPDATE statements, revert to raw SQL.
|
9
|
+
|
10
|
+
* Make login timeout and query timeout backward database.yml friendly for :dblib mode.
|
11
|
+
|
12
|
+
|
2
13
|
* 2.3.12 *
|
3
14
|
|
4
15
|
* Add multiple results set support with #execute_procedure for :dblib mode. [Ken Collins]
|
data/Rakefile
CHANGED
@@ -147,7 +147,7 @@ module ActiveRecord
|
|
147
147
|
class SQLServerAdapter < AbstractAdapter
|
148
148
|
|
149
149
|
ADAPTER_NAME = 'SQLServer'.freeze
|
150
|
-
VERSION = '2.3.
|
150
|
+
VERSION = '2.3.13'.freeze
|
151
151
|
DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+(\d{4})/
|
152
152
|
SUPPORTED_VERSIONS = [2000,2005,2008].freeze
|
153
153
|
LIMITABLE_TYPES = ['string','integer','float','char','nchar','varchar','nvarchar'].to_set.freeze
|
@@ -182,7 +182,6 @@ module ActiveRecord
|
|
182
182
|
super(@connection, logger)
|
183
183
|
@database_version = info_schema_query { select_value('SELECT @@version') }
|
184
184
|
@database_year = DATABASE_VERSION_REGEXP.match(@database_version)[1].to_i rescue 0
|
185
|
-
initialize_native_database_types
|
186
185
|
initialize_sqlserver_caches
|
187
186
|
use_database
|
188
187
|
unless SUPPORTED_VERSIONS.include?(@database_year)
|
@@ -269,7 +268,6 @@ module ActiveRecord
|
|
269
268
|
when String, ActiveSupport::Multibyte::Chars
|
270
269
|
if column && column.type == :binary
|
271
270
|
column.class.string_to_binary(value)
|
272
|
-
# elsif column && column.type == :string
|
273
271
|
elsif value.is_utf8? || (column && column.type == :string)
|
274
272
|
"N'#{quote_string(value)}'"
|
275
273
|
else
|
@@ -417,7 +415,7 @@ module ActiveRecord
|
|
417
415
|
r = row.with_indifferent_access
|
418
416
|
yield(r) if block_given?
|
419
417
|
end
|
420
|
-
result.each
|
418
|
+
result.each.map{ |row| row.is_a?(Hash) ? row.with_indifferent_access : row }
|
421
419
|
when :odbc
|
422
420
|
results = []
|
423
421
|
raw_connection_run(sql) do |handle|
|
@@ -570,7 +568,7 @@ module ActiveRecord
|
|
570
568
|
# SCHEMA STATEMENTS ========================================#
|
571
569
|
|
572
570
|
def native_database_types
|
573
|
-
|
571
|
+
@native_database_types ||= initialize_native_database_types.freeze
|
574
572
|
end
|
575
573
|
|
576
574
|
def table_alias_length
|
@@ -814,6 +812,8 @@ module ActiveRecord
|
|
814
812
|
@connection = case @connection_options[:mode]
|
815
813
|
when :dblib
|
816
814
|
appname = config[:appname] || Rails.application.class.name.split('::').first rescue nil
|
815
|
+
login_timeout = config[:login_timeout].present? ? config[:login_timeout].to_i : nil
|
816
|
+
timeout = config[:timeout].present? ? config[:timeout].to_i/1000 : nil
|
817
817
|
encoding = config[:encoding].present? ? config[:encoding] : nil
|
818
818
|
TinyTds::Client.new({
|
819
819
|
:dataserver => config[:dataserver],
|
@@ -821,8 +821,8 @@ module ActiveRecord
|
|
821
821
|
:password => config[:password],
|
822
822
|
:database => config[:database],
|
823
823
|
:appname => appname,
|
824
|
-
:login_timeout =>
|
825
|
-
:timeout =>
|
824
|
+
:login_timeout => login_timeout,
|
825
|
+
:timeout => timeout,
|
826
826
|
:encoding => encoding
|
827
827
|
}).tap do |client|
|
828
828
|
client.execute("SET ANSI_DEFAULTS ON").do
|
@@ -961,7 +961,7 @@ module ActiveRecord
|
|
961
961
|
@update_sql = true
|
962
962
|
case @connection_options[:mode]
|
963
963
|
when :dblib
|
964
|
-
execute(sql, name)
|
964
|
+
sqlserver_2000? ? execute(sql, name) && select_value('SELECT @@ROWCOUNT AS AffectedRows') : execute(sql, name)
|
965
965
|
else
|
966
966
|
execute(sql, name)
|
967
967
|
select_value('SELECT @@ROWCOUNT AS AffectedRows')
|
@@ -1266,8 +1266,7 @@ module ActiveRecord
|
|
1266
1266
|
end
|
1267
1267
|
|
1268
1268
|
def initialize_native_database_types
|
1269
|
-
|
1270
|
-
ActiveRecord::ConnectionAdapters::SQLServerAdapter.const_set(:NATIVE_DATABASE_TYPES,{
|
1269
|
+
{
|
1271
1270
|
:primary_key => "int NOT NULL IDENTITY(1,1) PRIMARY KEY",
|
1272
1271
|
:string => { :name => native_string_database_type, :limit => 255 },
|
1273
1272
|
:text => { :name => native_text_database_type },
|
@@ -1288,7 +1287,7 @@ module ActiveRecord
|
|
1288
1287
|
:nvarchar_max => { :name => "nvarchar(max)" },
|
1289
1288
|
:ntext => { :name => "ntext" },
|
1290
1289
|
:ss_timestamp => { :name => 'timestamp'}
|
1291
|
-
}
|
1290
|
+
}
|
1292
1291
|
end
|
1293
1292
|
|
1294
1293
|
def column_definitions(table_name)
|
@@ -1,12 +1,16 @@
|
|
1
1
|
require 'cases/sqlserver_helper'
|
2
2
|
require 'models/developer'
|
3
|
+
require 'models/topic'
|
3
4
|
|
4
5
|
class BasicsTestSqlserver < ActiveRecord::TestCase
|
5
6
|
end
|
6
7
|
|
7
8
|
class BasicsTest < ActiveRecord::TestCase
|
8
9
|
|
9
|
-
COERCED_TESTS = [
|
10
|
+
COERCED_TESTS = [
|
11
|
+
:test_read_attributes_before_type_cast_on_datetime,
|
12
|
+
:test_preserving_date_objects,
|
13
|
+
:test_to_xml ]
|
10
14
|
|
11
15
|
include SqlserverCoercedTest
|
12
16
|
|
@@ -19,5 +23,59 @@ class BasicsTest < ActiveRecord::TestCase
|
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
26
|
+
def test_coerced_test_preserving_date_objects
|
27
|
+
klass = sqlserver_2008? ? Date : (connection_mode_dblib? ? Time : Date)
|
28
|
+
assert_kind_of klass, Topic.find(1).last_read, "The last_read attribute should be of the #{klass.name} class"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_coerced_test_to_xml
|
32
|
+
xml = REXML::Document.new(topics(:first).to_xml(:indent => 0))
|
33
|
+
bonus_time_in_current_timezone = topics(:first).bonus_time.xmlschema
|
34
|
+
written_on_in_current_timezone = topics(:first).written_on.xmlschema
|
35
|
+
|
36
|
+
assert_equal "topic", xml.root.name
|
37
|
+
assert_equal "The First Topic" , xml.elements["//title"].text
|
38
|
+
assert_equal "David" , xml.elements["//author-name"].text
|
39
|
+
|
40
|
+
assert_equal "1", xml.elements["//id"].text
|
41
|
+
assert_equal "integer" , xml.elements["//id"].attributes['type']
|
42
|
+
|
43
|
+
assert_equal "1", xml.elements["//replies-count"].text
|
44
|
+
assert_equal "integer" , xml.elements["//replies-count"].attributes['type']
|
45
|
+
|
46
|
+
assert_equal written_on_in_current_timezone, xml.elements["//written-on"].text
|
47
|
+
assert_equal "datetime" , xml.elements["//written-on"].attributes['type']
|
48
|
+
|
49
|
+
assert_equal "--- Have a nice day\n" , xml.elements["//content"].text
|
50
|
+
assert_equal "yaml" , xml.elements["//content"].attributes['type']
|
51
|
+
|
52
|
+
assert_equal "david@loudthinking.com", xml.elements["//author-email-address"].text
|
53
|
+
|
54
|
+
assert_equal nil, xml.elements["//parent-id"].text
|
55
|
+
assert_equal "integer", xml.elements["//parent-id"].attributes['type']
|
56
|
+
assert_equal "true", xml.elements["//parent-id"].attributes['nil']
|
57
|
+
|
58
|
+
if sqlserver_2000? || sqlserver_2005?
|
59
|
+
last_read_in_current_timezone, last_read_type = if connection_mode_odbc?
|
60
|
+
["2004-04-15", "date"]
|
61
|
+
elsif connection_mode_dblib?
|
62
|
+
["2004-04-15 00:00:00", "date"]
|
63
|
+
else
|
64
|
+
[topics(:first).last_read.xmlschema, "datetime"]
|
65
|
+
end
|
66
|
+
assert_equal last_read_in_current_timezone, xml.elements["//last-read"].text
|
67
|
+
assert_equal last_read_type , xml.elements["//last-read"].attributes['type']
|
68
|
+
else
|
69
|
+
assert_equal "2004-04-15", xml.elements["//last-read"].text
|
70
|
+
assert_equal "date" , xml.elements["//last-read"].attributes['type']
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal "false", xml.elements["//approved"].text
|
74
|
+
assert_equal "boolean" , xml.elements["//approved"].attributes['type']
|
75
|
+
|
76
|
+
assert_equal bonus_time_in_current_timezone, xml.elements["//bonus-time"].text
|
77
|
+
assert_equal "datetime" , xml.elements["//bonus-time"].attributes['type']
|
78
|
+
end
|
79
|
+
|
22
80
|
|
23
81
|
end
|
@@ -237,7 +237,8 @@ class ColumnTestSqlserver < ActiveRecord::TestCase
|
|
237
237
|
|
238
238
|
should 'have column and objects cast to date' do
|
239
239
|
assert_equal :date, @date.type, "This column: \n#{@date.inspect}"
|
240
|
-
|
240
|
+
klass = sqlserver_2008? ? Date : (connection_mode_dblib? ? Time : Date)
|
241
|
+
assert_instance_of klass, @chronic_date.date
|
241
242
|
end
|
242
243
|
|
243
244
|
should 'have column objects cast to time' do
|
@@ -84,3 +84,25 @@ class MigrationTest < ActiveRecord::TestCase
|
|
84
84
|
|
85
85
|
end
|
86
86
|
|
87
|
+
|
88
|
+
class ChangeTableMigrationsTest < ActiveRecord::TestCase
|
89
|
+
|
90
|
+
COERCED_TESTS = [:test_string_creates_string_column]
|
91
|
+
|
92
|
+
include SqlserverCoercedTest
|
93
|
+
|
94
|
+
def test_coerced_string_creates_string_column
|
95
|
+
with_change_table do |t|
|
96
|
+
@connection.expects(:add_column).with(:delete_me, :foo, coerced_string_column, {})
|
97
|
+
@connection.expects(:add_column).with(:delete_me, :bar, coerced_string_column, {})
|
98
|
+
t.string :foo, :bar
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def coerced_string_column
|
103
|
+
"#{Person.connection.native_string_database_type}(255)"
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-sqlserver-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 2
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 2.3.
|
9
|
+
- 13
|
10
|
+
version: 2.3.13
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Ken Collins
|
@@ -19,7 +19,7 @@ autorequire:
|
|
19
19
|
bindir: bin
|
20
20
|
cert_chain: []
|
21
21
|
|
22
|
-
date: 2010-10-
|
22
|
+
date: 2010-10-31 00:00:00 -04:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|