activerecord-sqlserver-adapter 2.3.24 → 3.0.0
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 +5 -108
- data/MIT-LICENSE +1 -1
- data/README.rdoc +33 -61
- data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +57 -0
- data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +57 -0
- data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
- data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +336 -0
- data/lib/active_record/connection_adapters/sqlserver/errors.rb +33 -0
- data/lib/active_record/connection_adapters/sqlserver/query_cache.rb +17 -0
- data/lib/active_record/connection_adapters/sqlserver/quoting.rb +61 -0
- data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +373 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +131 -1121
- data/lib/arel/engines/sql/compilers/sqlserver_compiler.rb +267 -0
- metadata +26 -76
- data/RUNNING_UNIT_TESTS +0 -31
- data/Rakefile +0 -60
- data/lib/active_record/connection_adapters/sqlserver_adapter/core_ext/active_record.rb +0 -151
- data/lib/active_record/connection_adapters/sqlserver_adapter/core_ext/odbc.rb +0 -40
- data/test/cases/aaaa_create_tables_test_sqlserver.rb +0 -19
- data/test/cases/adapter_test_sqlserver.rb +0 -755
- data/test/cases/attribute_methods_test_sqlserver.rb +0 -33
- data/test/cases/basics_test_sqlserver.rb +0 -86
- data/test/cases/calculations_test_sqlserver.rb +0 -20
- data/test/cases/column_test_sqlserver.rb +0 -354
- data/test/cases/connection_test_sqlserver.rb +0 -148
- data/test/cases/eager_association_test_sqlserver.rb +0 -42
- data/test/cases/execute_procedure_test_sqlserver.rb +0 -35
- data/test/cases/inheritance_test_sqlserver.rb +0 -28
- data/test/cases/method_scoping_test_sqlserver.rb +0 -28
- data/test/cases/migration_test_sqlserver.rb +0 -108
- data/test/cases/named_scope_test_sqlserver.rb +0 -21
- data/test/cases/offset_and_limit_test_sqlserver.rb +0 -108
- data/test/cases/pessimistic_locking_test_sqlserver.rb +0 -125
- data/test/cases/query_cache_test_sqlserver.rb +0 -24
- data/test/cases/schema_dumper_test_sqlserver.rb +0 -72
- data/test/cases/specific_schema_test_sqlserver.rb +0 -154
- data/test/cases/sqlserver_helper.rb +0 -140
- data/test/cases/table_name_test_sqlserver.rb +0 -38
- data/test/cases/transaction_test_sqlserver.rb +0 -93
- data/test/cases/unicode_test_sqlserver.rb +0 -54
- data/test/cases/validations_test_sqlserver.rb +0 -18
- data/test/connections/native_sqlserver/connection.rb +0 -26
- data/test/connections/native_sqlserver_odbc/connection.rb +0 -28
- data/test/migrations/transaction_table/1_table_will_never_be_created.rb +0 -11
- data/test/schema/sqlserver_specific_schema.rb +0 -113
@@ -1,38 +0,0 @@
|
|
1
|
-
require 'cases/sqlserver_helper'
|
2
|
-
require 'models/order'
|
3
|
-
|
4
|
-
class SqlServerRailsOrders < ActiveRecord::Base
|
5
|
-
set_table_name 'rails.orders'
|
6
|
-
end
|
7
|
-
|
8
|
-
class TableNameTestSqlserver < ActiveRecord::TestCase
|
9
|
-
|
10
|
-
self.use_transactional_fixtures = false
|
11
|
-
|
12
|
-
def setup
|
13
|
-
Order.table_name = '[orders]'
|
14
|
-
Order.reset_column_information
|
15
|
-
end
|
16
|
-
|
17
|
-
should 'load columns with escaped table name for model' do
|
18
|
-
assert_equal 4, Order.columns.length
|
19
|
-
end
|
20
|
-
|
21
|
-
should 'not re-escape table name if it is escaped already for SQL queries' do
|
22
|
-
assert_sql(/SELECT \* FROM \[orders\]/) { Order.all }
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'Table scoped to user.table_name' do
|
26
|
-
|
27
|
-
setup do
|
28
|
-
@klass = SqlServerRailsOrders
|
29
|
-
end
|
30
|
-
|
31
|
-
should 'have no issue doing basic column reflection' do
|
32
|
-
assert_nothing_raised() { @klass.columns }
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
end
|
@@ -1,93 +0,0 @@
|
|
1
|
-
require 'cases/sqlserver_helper'
|
2
|
-
require 'models/ship'
|
3
|
-
require 'models/developer'
|
4
|
-
|
5
|
-
class TransactionTestSqlserver < ActiveRecord::TestCase
|
6
|
-
|
7
|
-
self.use_transactional_fixtures = false
|
8
|
-
|
9
|
-
setup :delete_ships
|
10
|
-
|
11
|
-
context 'Testing transaction basics' do
|
12
|
-
|
13
|
-
should 'allow ActiveRecord::Rollback to work in 1 transaction block' do
|
14
|
-
Ship.transaction do
|
15
|
-
Ship.create! :name => 'Black Pearl'
|
16
|
-
raise ActiveRecord::Rollback
|
17
|
-
end
|
18
|
-
assert_no_ships
|
19
|
-
end
|
20
|
-
|
21
|
-
should 'allow nested transactions to totally rollback' do
|
22
|
-
begin
|
23
|
-
Ship.transaction do
|
24
|
-
Ship.create! :name => 'Black Pearl'
|
25
|
-
Ship.transaction do
|
26
|
-
Ship.create! :name => 'Flying Dutchman'
|
27
|
-
raise 'HELL'
|
28
|
-
end
|
29
|
-
end
|
30
|
-
rescue Exception => e
|
31
|
-
assert_no_ships
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'Testing #outside_transaction?' do
|
38
|
-
|
39
|
-
should 'work in simple usage' do
|
40
|
-
assert Ship.connection.outside_transaction?
|
41
|
-
Ship.connection.begin_db_transaction
|
42
|
-
assert !Ship.connection.outside_transaction?
|
43
|
-
Ship.connection.rollback_db_transaction
|
44
|
-
assert Ship.connection.outside_transaction?
|
45
|
-
end
|
46
|
-
|
47
|
-
should 'work inside nested transactions' do
|
48
|
-
assert Ship.connection.outside_transaction?
|
49
|
-
Ship.transaction do
|
50
|
-
assert !Ship.connection.outside_transaction?
|
51
|
-
Ship.transaction do
|
52
|
-
assert !Ship.connection.outside_transaction?
|
53
|
-
end
|
54
|
-
end
|
55
|
-
assert Ship.connection.outside_transaction?
|
56
|
-
end
|
57
|
-
|
58
|
-
should 'not call rollback if no transaction is active' do
|
59
|
-
assert_raise RuntimeError do
|
60
|
-
Ship.transaction do
|
61
|
-
Ship.connection.rollback_db_transaction
|
62
|
-
Ship.connection.expects(:rollback_db_transaction).never
|
63
|
-
raise "Rails doesn't scale!"
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
should 'test_open_transactions_count_is_reset_to_zero_if_no_transaction_active' do
|
69
|
-
Ship.transaction do
|
70
|
-
Ship.transaction do
|
71
|
-
Ship.connection.rollback_db_transaction
|
72
|
-
end
|
73
|
-
assert_equal 0, Ship.connection.open_transactions
|
74
|
-
end
|
75
|
-
assert_equal 0, Ship.connection.open_transactions
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
protected
|
83
|
-
|
84
|
-
def delete_ships
|
85
|
-
Ship.delete_all
|
86
|
-
end
|
87
|
-
|
88
|
-
def assert_no_ships
|
89
|
-
assert Ship.count.zero?, "Expected Ship to have no models but it did have:\n#{Ship.all.inspect}"
|
90
|
-
end
|
91
|
-
|
92
|
-
end
|
93
|
-
|
@@ -1,54 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require 'cases/sqlserver_helper'
|
3
|
-
|
4
|
-
class UnicodeTestSqlserver < ActiveRecord::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
context 'Testing basic saves and unicode limits' do
|
8
|
-
|
9
|
-
should 'save and reload simple nchar string' do
|
10
|
-
assert nchar_data = SqlServerUnicode.create!(:nchar => 'A')
|
11
|
-
assert_equal 'A', SqlServerUnicode.find(nchar_data.id).nchar
|
12
|
-
end
|
13
|
-
|
14
|
-
should 'save and reload simple nvarchar(max) string' do
|
15
|
-
test_string = 'Ken Collins'
|
16
|
-
assert nvarcharmax_data = SqlServerUnicode.create!(:nvarchar_max => test_string)
|
17
|
-
assert_equal test_string, SqlServerUnicode.find(nvarcharmax_data.id).nvarchar_max
|
18
|
-
end if sqlserver_2005? || sqlserver_2008?
|
19
|
-
|
20
|
-
should 'enforce default nchar_10 limit of 10' do
|
21
|
-
assert_raise(ActiveRecord::StatementInvalid) { SqlServerUnicode.create!(:nchar => '01234567891') }
|
22
|
-
end
|
23
|
-
|
24
|
-
should 'enforce default nvarchar_100 limit of 100' do
|
25
|
-
assert_raise(ActiveRecord::StatementInvalid) { SqlServerUnicode.create!(:nvarchar_100 => '0123456789'*10+'1') }
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'Testing unicode data' do
|
31
|
-
|
32
|
-
setup do
|
33
|
-
@unicode_data = "\344\270\200\344\272\21434\344\272\224\345\205\255" # "一二34五六"
|
34
|
-
end
|
35
|
-
|
36
|
-
should 'insert and retrieve unicode data' do
|
37
|
-
assert data = SqlServerUnicode.create!(:nvarchar => @unicode_data)
|
38
|
-
if connection_mode_dblib?
|
39
|
-
assert_equal "一二34五六", data.reload.nvarchar
|
40
|
-
elsif connection_mode_odbc?
|
41
|
-
assert_equal "一二34五六", data.reload.nvarchar, 'perhaps you are not using the utf8 odbc that does this legwork'
|
42
|
-
elsif connection_mode_adonet?
|
43
|
-
assert_equal "一二34五六", data.reload.nvarchar
|
44
|
-
else
|
45
|
-
raise 'need to add a case for this'
|
46
|
-
end
|
47
|
-
assert_equal Encoding.find('UTF-8'), data.nvarchar.encoding if ruby_19?
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
require 'cases/sqlserver_helper'
|
2
|
-
|
3
|
-
class ValidationsTestSqlserver < ActiveRecord::TestCase
|
4
|
-
end
|
5
|
-
|
6
|
-
class ValidationsTest < ActiveRecord::TestCase
|
7
|
-
|
8
|
-
COERCED_TESTS = [:test_validate_uniqueness_with_limit_and_utf8]
|
9
|
-
|
10
|
-
include SqlserverCoercedTest
|
11
|
-
|
12
|
-
def test_coerced_test_validate_uniqueness_with_limit_and_utf8
|
13
|
-
true
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
@@ -1,26 +0,0 @@
|
|
1
|
-
print "Using SQLServer via ADONET\n"
|
2
|
-
require_dependency 'models/course'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
ActiveRecord::Base.logger = Logger.new(File.expand_path(File.join(SQLSERVER_TEST_ROOT,'debug.log')))
|
6
|
-
ActiveRecord::Base.logger.level = 0
|
7
|
-
|
8
|
-
ActiveRecord::Base.configurations = {
|
9
|
-
'arunit' => {
|
10
|
-
:adapter => 'sqlserver',
|
11
|
-
:mode => 'ADONET',
|
12
|
-
:host => 'localhost',
|
13
|
-
:username => 'rails',
|
14
|
-
:database => 'activerecord_unittest'
|
15
|
-
},
|
16
|
-
'arunit2' => {
|
17
|
-
:adapter => 'sqlserver',
|
18
|
-
:mode => 'ADONET',
|
19
|
-
:host => 'localhost',
|
20
|
-
:username => 'rails',
|
21
|
-
:database => 'activerecord_unittest2'
|
22
|
-
}
|
23
|
-
}
|
24
|
-
|
25
|
-
ActiveRecord::Base.establish_connection 'arunit'
|
26
|
-
Course.establish_connection 'arunit2'
|
@@ -1,28 +0,0 @@
|
|
1
|
-
print "Using SQLServer via ODBC to #{ENV['ACTIVERECORD_UNITTEST_DSN'] || 'activerecord_unittest'}\n"
|
2
|
-
require_dependency 'models/course'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
ActiveRecord::Base.logger = Logger.new(File.expand_path(File.join(SQLSERVER_TEST_ROOT,'debug.log')))
|
6
|
-
ActiveRecord::Base.logger.level = 0
|
7
|
-
|
8
|
-
ActiveRecord::Base.configurations = {
|
9
|
-
'arunit' => {
|
10
|
-
:adapter => 'sqlserver',
|
11
|
-
:mode => 'ODBC',
|
12
|
-
:host => 'localhost',
|
13
|
-
:username => 'rails',
|
14
|
-
:dsn => ENV['ACTIVERECORD_UNITTEST_DSN'] || 'activerecord_unittest',
|
15
|
-
:database => 'activerecord_unittest'
|
16
|
-
},
|
17
|
-
'arunit2' => {
|
18
|
-
:adapter => 'sqlserver',
|
19
|
-
:mode => 'ODBC',
|
20
|
-
:host => 'localhost',
|
21
|
-
:username => 'rails',
|
22
|
-
:dsn => ENV['ACTIVERECORD_UNITTEST2_DSN'] || 'activerecord_unittest2',
|
23
|
-
:database => 'activerecord_unittest2'
|
24
|
-
}
|
25
|
-
}
|
26
|
-
|
27
|
-
ActiveRecord::Base.establish_connection 'arunit'
|
28
|
-
Course.establish_connection 'arunit2'
|
@@ -1,113 +0,0 @@
|
|
1
|
-
ActiveRecord::Schema.define do
|
2
|
-
|
3
|
-
create_table :float_data, :force => true do |t|
|
4
|
-
t.float :temperature
|
5
|
-
t.float :temperature_8, :limit => 8
|
6
|
-
t.float :temperature_24, :limit => 24
|
7
|
-
t.float :temperature_32, :limit => 32
|
8
|
-
t.float :temperature_53, :limit => 53
|
9
|
-
end
|
10
|
-
|
11
|
-
create_table :table_with_real_columns, :force => true do |t|
|
12
|
-
t.column :real_number, :real
|
13
|
-
end
|
14
|
-
|
15
|
-
create_table :defaults, :force => true do |t|
|
16
|
-
t.column :positive_integer, :integer, :default => 1
|
17
|
-
t.column :negative_integer, :integer, :default => -1
|
18
|
-
t.column :decimal_number, :decimal, :precision => 3, :scale => 2, :default => 2.78
|
19
|
-
end
|
20
|
-
|
21
|
-
create_table :string_defaults, :force => true do |t|
|
22
|
-
t.column :string_with_null_default, :string, :default => nil
|
23
|
-
t.column :string_with_pretend_null_one, :string, :default => 'null'
|
24
|
-
t.column :string_with_pretend_null_two, :string, :default => '(null)'
|
25
|
-
t.column :string_with_pretend_null_three, :string, :default => 'NULL'
|
26
|
-
t.column :string_with_pretend_null_four, :string, :default => '(NULL)'
|
27
|
-
t.column :string_with_pretend_paren_three, :string, :default => '(3)'
|
28
|
-
t.column :string_with_multiline_default, :string, :default => "Some long default with a\nnew line."
|
29
|
-
end
|
30
|
-
|
31
|
-
create_table :sql_server_chronics, :force => true do |t|
|
32
|
-
t.column :date, :date
|
33
|
-
t.column :time, :time
|
34
|
-
t.column :datetime, :datetime
|
35
|
-
t.column :timestamp, :timestamp
|
36
|
-
t.column :ss_timestamp, :ss_timestamp
|
37
|
-
t.column :smalldatetime, :smalldatetime
|
38
|
-
end
|
39
|
-
|
40
|
-
create_table(:fk_test_has_fks, :force => true) { |t| t.column(:fk_id, :integer, :null => false) }
|
41
|
-
create_table(:fk_test_has_pks, :force => true) { }
|
42
|
-
execute <<-ADDFKSQL
|
43
|
-
ALTER TABLE fk_test_has_fks
|
44
|
-
ADD CONSTRAINT FK__fk_test_has_fk_fk_id
|
45
|
-
FOREIGN KEY (#{quote_column_name('fk_id')})
|
46
|
-
REFERENCES #{quote_table_name('fk_test_has_pks')} (#{quote_column_name('id')})
|
47
|
-
ADDFKSQL
|
48
|
-
|
49
|
-
create_table :sql_server_unicodes, :force => true do |t|
|
50
|
-
t.column :nchar, :nchar
|
51
|
-
t.column :nvarchar, :nvarchar
|
52
|
-
t.column :ntext, :ntext
|
53
|
-
t.column :ntext_10, :ntext, :limit => 10
|
54
|
-
t.column :nchar_10, :nchar, :limit => 10
|
55
|
-
t.column :nvarchar_100, :nvarchar, :limit => 100
|
56
|
-
if ActiveRecord::Base.connection.sqlserver_2005? || ActiveRecord::Base.connection.sqlserver_2008?
|
57
|
-
t.column :nvarchar_max, :nvarchar_max
|
58
|
-
t.column :nvarchar_max_10, :nvarchar_max, :limit => 10
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
create_table :sql_server_strings, :force => true do |t|
|
63
|
-
t.column :char, :char
|
64
|
-
t.column :char_10, :char, :limit => 10
|
65
|
-
if ActiveRecord::Base.connection.sqlserver_2005? || ActiveRecord::Base.connection.sqlserver_2008?
|
66
|
-
t.column :varchar_max, :varchar_max
|
67
|
-
t.column :varchar_max_10, :varchar_max, :limit => 10
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
create_table :sql_server_binary_types, :force => true do |t|
|
72
|
-
# TODO: Add some different native binary types and test.
|
73
|
-
end
|
74
|
-
|
75
|
-
create_table :sql_server_edge_schemas, :force => true do |t|
|
76
|
-
t.string :description
|
77
|
-
t.column :bigint, :bigint
|
78
|
-
t.column :tinyint, :tinyint
|
79
|
-
t.column :guid, :uniqueidentifier
|
80
|
-
end
|
81
|
-
execute %|ALTER TABLE [sql_server_edge_schemas] ADD [guid_newid] uniqueidentifier DEFAULT NEWID();|
|
82
|
-
execute %|ALTER TABLE [sql_server_edge_schemas] ADD [guid_newseqid] uniqueidentifier DEFAULT NEWSEQUENTIALID();| unless ActiveRecord::Base.connection.sqlserver_2000?
|
83
|
-
|
84
|
-
create_table 'quoted-table', :force => true do |t|
|
85
|
-
end
|
86
|
-
execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'quoted-view1') DROP VIEW [quoted-view1]"
|
87
|
-
execute "CREATE VIEW [quoted-view1] AS SELECT * FROM [quoted-table]"
|
88
|
-
execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'quoted-view2') DROP VIEW [quoted-view2]"
|
89
|
-
execute "CREATE VIEW [quoted-view2] AS \n /*#{'x'*4000}}*/ \n SELECT * FROM [quoted-table]"
|
90
|
-
|
91
|
-
execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'customers_view') DROP VIEW customers_view"
|
92
|
-
execute <<-CUSTOMERSVIEW
|
93
|
-
CREATE VIEW customers_view AS
|
94
|
-
SELECT id, name, balance
|
95
|
-
FROM customers
|
96
|
-
CUSTOMERSVIEW
|
97
|
-
|
98
|
-
execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'string_defaults_view') DROP VIEW string_defaults_view"
|
99
|
-
execute <<-STRINGDEFAULTSVIEW
|
100
|
-
CREATE VIEW string_defaults_view AS
|
101
|
-
SELECT id, string_with_pretend_null_one as pretend_null
|
102
|
-
FROM string_defaults
|
103
|
-
STRINGDEFAULTSVIEW
|
104
|
-
|
105
|
-
execute "IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'string_defaults_big_view') DROP VIEW string_defaults_big_view"
|
106
|
-
execute <<-STRINGDEFAULTSBIGVIEW
|
107
|
-
CREATE VIEW string_defaults_big_view AS
|
108
|
-
SELECT id, string_with_pretend_null_one as pretend_null
|
109
|
-
/*#{'x'*4000}}*/
|
110
|
-
FROM string_defaults
|
111
|
-
STRINGDEFAULTSBIGVIEW
|
112
|
-
|
113
|
-
end
|