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.
Files changed (45) hide show
  1. data/CHANGELOG +5 -108
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +33 -61
  4. data/lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb +57 -0
  5. data/lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb +57 -0
  6. data/lib/active_record/connection_adapters/sqlserver/database_limits.rb +49 -0
  7. data/lib/active_record/connection_adapters/sqlserver/database_statements.rb +336 -0
  8. data/lib/active_record/connection_adapters/sqlserver/errors.rb +33 -0
  9. data/lib/active_record/connection_adapters/sqlserver/query_cache.rb +17 -0
  10. data/lib/active_record/connection_adapters/sqlserver/quoting.rb +61 -0
  11. data/lib/active_record/connection_adapters/sqlserver/schema_statements.rb +373 -0
  12. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +131 -1121
  13. data/lib/arel/engines/sql/compilers/sqlserver_compiler.rb +267 -0
  14. metadata +26 -76
  15. data/RUNNING_UNIT_TESTS +0 -31
  16. data/Rakefile +0 -60
  17. data/lib/active_record/connection_adapters/sqlserver_adapter/core_ext/active_record.rb +0 -151
  18. data/lib/active_record/connection_adapters/sqlserver_adapter/core_ext/odbc.rb +0 -40
  19. data/test/cases/aaaa_create_tables_test_sqlserver.rb +0 -19
  20. data/test/cases/adapter_test_sqlserver.rb +0 -755
  21. data/test/cases/attribute_methods_test_sqlserver.rb +0 -33
  22. data/test/cases/basics_test_sqlserver.rb +0 -86
  23. data/test/cases/calculations_test_sqlserver.rb +0 -20
  24. data/test/cases/column_test_sqlserver.rb +0 -354
  25. data/test/cases/connection_test_sqlserver.rb +0 -148
  26. data/test/cases/eager_association_test_sqlserver.rb +0 -42
  27. data/test/cases/execute_procedure_test_sqlserver.rb +0 -35
  28. data/test/cases/inheritance_test_sqlserver.rb +0 -28
  29. data/test/cases/method_scoping_test_sqlserver.rb +0 -28
  30. data/test/cases/migration_test_sqlserver.rb +0 -108
  31. data/test/cases/named_scope_test_sqlserver.rb +0 -21
  32. data/test/cases/offset_and_limit_test_sqlserver.rb +0 -108
  33. data/test/cases/pessimistic_locking_test_sqlserver.rb +0 -125
  34. data/test/cases/query_cache_test_sqlserver.rb +0 -24
  35. data/test/cases/schema_dumper_test_sqlserver.rb +0 -72
  36. data/test/cases/specific_schema_test_sqlserver.rb +0 -154
  37. data/test/cases/sqlserver_helper.rb +0 -140
  38. data/test/cases/table_name_test_sqlserver.rb +0 -38
  39. data/test/cases/transaction_test_sqlserver.rb +0 -93
  40. data/test/cases/unicode_test_sqlserver.rb +0 -54
  41. data/test/cases/validations_test_sqlserver.rb +0 -18
  42. data/test/connections/native_sqlserver/connection.rb +0 -26
  43. data/test/connections/native_sqlserver_odbc/connection.rb +0 -28
  44. data/test/migrations/transaction_table/1_table_will_never_be_created.rb +0 -11
  45. 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,11 +0,0 @@
1
- class TableWillNeverBeCreated < ActiveRecord::Migration
2
-
3
- def self.up
4
- create_table(:sqlserver_trans_table1) { }
5
- create_table(:sqlserver_trans_table2) { raise ActiveRecord::StatementInvalid }
6
- end
7
-
8
- def self.down
9
- end
10
-
11
- end
@@ -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