activerecord-sqlserver-adapter 2.3.24 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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