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
@@ -0,0 +1,267 @@
|
|
1
|
+
module Arel
|
2
|
+
class Lock < Compound
|
3
|
+
def initialize(relation, locked)
|
4
|
+
super(relation)
|
5
|
+
@locked = true == locked ? "WITH(HOLDLOCK, ROWLOCK)" : locked
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Arel
|
11
|
+
module SqlCompiler
|
12
|
+
class SQLServerCompiler < GenericCompiler
|
13
|
+
|
14
|
+
def select_sql
|
15
|
+
if complex_count_sql?
|
16
|
+
select_sql_with_complex_count
|
17
|
+
elsif relation.skipped
|
18
|
+
select_sql_with_skipped
|
19
|
+
else
|
20
|
+
select_sql_without_skipped
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def delete_sql
|
25
|
+
build_query \
|
26
|
+
"DELETE #{taken_clause if relation.taken.present?}".strip,
|
27
|
+
"FROM #{relation.table_sql}",
|
28
|
+
("WHERE #{relation.wheres.collect(&:to_sql).join(' AND ')}" unless relation.wheres.blank? )
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def complex_count_sql?
|
35
|
+
projections = relation.projections
|
36
|
+
projections.first.is_a?(Arel::Count) && projections.size == 1 &&
|
37
|
+
(relation.taken.present? || relation.wheres.present?) && relation.joins(self).blank?
|
38
|
+
end
|
39
|
+
|
40
|
+
def taken_only?
|
41
|
+
relation.taken.present? && relation.skipped.blank?
|
42
|
+
end
|
43
|
+
|
44
|
+
def taken_clause
|
45
|
+
"TOP (#{relation.taken.to_i}) "
|
46
|
+
end
|
47
|
+
|
48
|
+
def expression_select?
|
49
|
+
relation.select_clauses.any? { |sc| sc.match /(COUNT|SUM|MAX|MIN|AVG)\s*\(.*\)/ }
|
50
|
+
end
|
51
|
+
|
52
|
+
def eager_limiting_select?
|
53
|
+
single_distinct_select? && taken_only? && relation.group_clauses.blank?
|
54
|
+
end
|
55
|
+
|
56
|
+
def single_distinct_select?
|
57
|
+
relation.select_clauses.size == 1 && relation.select_clauses.first.to_s.include?('DISTINCT')
|
58
|
+
end
|
59
|
+
|
60
|
+
def all_select_clauses_aliased?
|
61
|
+
relation.select_clauses.all? do |sc|
|
62
|
+
sc.split(',').all? { |c| c.include?(' AS ') }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def select_sql_with_complex_count
|
67
|
+
joins = correlated_safe_joins
|
68
|
+
wheres = relation.where_clauses
|
69
|
+
groups = relation.group_clauses
|
70
|
+
havings = relation.having_clauses
|
71
|
+
orders = relation.order_clauses
|
72
|
+
taken = relation.taken.to_i
|
73
|
+
skipped = relation.skipped.to_i
|
74
|
+
top_clause = "TOP (#{taken+skipped}) " if relation.taken.present?
|
75
|
+
build_query \
|
76
|
+
"SELECT COUNT([count]) AS [count_id]",
|
77
|
+
"FROM (",
|
78
|
+
"SELECT #{top_clause}ROW_NUMBER() OVER (ORDER BY #{unique_orders(rowtable_order_clauses).join(', ')}) AS [__rn],",
|
79
|
+
"1 AS [count]",
|
80
|
+
"FROM #{relation.from_clauses}",
|
81
|
+
(locked unless locked.blank?),
|
82
|
+
(joins unless joins.blank?),
|
83
|
+
("WHERE #{wheres.join(' AND ')}" unless wheres.blank?),
|
84
|
+
("GROUP BY #{groups.join(', ')}" unless groups.blank?),
|
85
|
+
("HAVING #{havings.join(' AND ')}" unless havings.blank?),
|
86
|
+
("ORDER BY #{unique_orders(orders).join(', ')}" unless orders.blank?),
|
87
|
+
") AS [__rnt]",
|
88
|
+
"WHERE [__rnt].[__rn] > #{relation.skipped.to_i}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def select_sql_without_skipped(windowed=false)
|
92
|
+
selects = relation.select_clauses
|
93
|
+
joins = correlated_safe_joins
|
94
|
+
wheres = relation.where_clauses
|
95
|
+
groups = relation.group_clauses
|
96
|
+
havings = relation.having_clauses
|
97
|
+
orders = relation.order_clauses
|
98
|
+
if windowed
|
99
|
+
selects = expression_select? ? selects : selects.map{ |sc| clause_without_expression(sc) }
|
100
|
+
elsif eager_limiting_select?
|
101
|
+
groups = selects.map { |sc| clause_without_expression(sc) }
|
102
|
+
selects = selects.map { |sc| "#{taken_clause}#{clause_without_expression(sc)}" }
|
103
|
+
orders = orders.map do |oc|
|
104
|
+
oc.split(',').reject(&:blank?).map do |c|
|
105
|
+
max = c =~ /desc\s*/i
|
106
|
+
c = clause_without_expression(c).sub(/(asc|desc)/i,'').strip
|
107
|
+
max ? "MAX(#{c})" : "MIN(#{c})"
|
108
|
+
end.join(', ')
|
109
|
+
end
|
110
|
+
elsif taken_only?
|
111
|
+
fsc = "#{taken_clause}#{selects.first}"
|
112
|
+
selects = selects.tap { |sc| sc.shift ; sc.unshift(fsc) }
|
113
|
+
end
|
114
|
+
build_query(
|
115
|
+
(windowed ? selects.join(', ') : "SELECT #{selects.join(', ')}"),
|
116
|
+
"FROM #{relation.from_clauses}",
|
117
|
+
(locked unless locked.blank?),
|
118
|
+
(joins unless joins.blank?),
|
119
|
+
("WHERE #{wheres.join(' AND ')}" unless wheres.blank?),
|
120
|
+
("GROUP BY #{groups.join(', ')}" unless groups.blank?),
|
121
|
+
("HAVING #{havings.join(' AND ')}" unless havings.blank?),
|
122
|
+
("ORDER BY #{unique_orders(orders).join(', ')}" if orders.present? && !windowed))
|
123
|
+
end
|
124
|
+
|
125
|
+
def select_sql_with_skipped
|
126
|
+
tc = taken_clause if relation.taken.present? && !single_distinct_select?
|
127
|
+
build_query \
|
128
|
+
"SELECT #{tc}#{rowtable_select_clauses.join(', ')}",
|
129
|
+
"FROM (",
|
130
|
+
"SELECT ROW_NUMBER() OVER (ORDER BY #{unique_orders(rowtable_order_clauses).join(', ')}) AS [__rn],",
|
131
|
+
select_sql_without_skipped(true),
|
132
|
+
") AS [__rnt]",
|
133
|
+
"WHERE [__rnt].[__rn] > #{relation.skipped.to_i}"
|
134
|
+
end
|
135
|
+
|
136
|
+
def rowtable_select_clauses
|
137
|
+
if single_distinct_select?
|
138
|
+
::Array.wrap(relation.select_clauses.first.dup.tap do |sc|
|
139
|
+
sc.sub! 'DISTINCT', "DISTINCT #{taken_clause if relation.taken.present?}".strip
|
140
|
+
sc.sub! table_name_from_select_clause(sc), '__rnt'
|
141
|
+
sc.strip!
|
142
|
+
end)
|
143
|
+
elsif relation.join? && all_select_clauses_aliased?
|
144
|
+
relation.select_clauses.map do |sc|
|
145
|
+
sc.split(',').map { |c| c.split(' AS ').last.strip }.join(', ')
|
146
|
+
end
|
147
|
+
elsif expression_select?
|
148
|
+
['*']
|
149
|
+
else
|
150
|
+
relation.select_clauses.map do |sc|
|
151
|
+
sc.gsub /\[#{relation.table.name}\]\./, '[__rnt].'
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def rowtable_order_clauses
|
157
|
+
orders = relation.order_clauses
|
158
|
+
if orders.present?
|
159
|
+
orders
|
160
|
+
elsif relation.join?
|
161
|
+
table_names_from_select_clauses.map { |tn| quote("#{tn}.#{pk_for_table(tn)}") }
|
162
|
+
else
|
163
|
+
[quote("#{relation.table.name}.#{relation.primary_key}")]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def limited_update_conditions(conditions,taken)
|
168
|
+
quoted_primary_key = engine.connection.quote_column_name(relation.primary_key)
|
169
|
+
conditions = " #{conditions}".strip
|
170
|
+
build_query \
|
171
|
+
"WHERE #{quoted_primary_key} IN",
|
172
|
+
"(SELECT #{taken_clause if relation.taken.present?}#{quoted_primary_key} FROM #{engine.connection.quote_table_name(relation.table.name)}#{conditions})"
|
173
|
+
end
|
174
|
+
|
175
|
+
def quote(value)
|
176
|
+
engine.connection.quote_column_name(value)
|
177
|
+
end
|
178
|
+
|
179
|
+
def pk_for_table(table_name)
|
180
|
+
engine.connection.primary_key(table_name)
|
181
|
+
end
|
182
|
+
|
183
|
+
def clause_without_expression(clause)
|
184
|
+
clause.to_s.split(',').map do |c|
|
185
|
+
c.strip!
|
186
|
+
c.sub!(/^(COUNT|SUM|MAX|MIN|AVG)\s*(\((.*)\))?/,'\3')
|
187
|
+
c.sub!(/^DISTINCT\s*/,'')
|
188
|
+
c.sub!(/TOP\s*\(\d+\)\s*/i,'')
|
189
|
+
c.strip
|
190
|
+
end.join(', ')
|
191
|
+
end
|
192
|
+
|
193
|
+
def unqualify_table_name(table_name)
|
194
|
+
table_name.to_s.split('.').last.tr('[]','')
|
195
|
+
end
|
196
|
+
|
197
|
+
def table_name_from_select_clause(sc)
|
198
|
+
parts = clause_without_expression(sc).split('.')
|
199
|
+
tn = parts.third ? parts.second : (parts.second ? parts.first : nil)
|
200
|
+
tn ? tn.tr('[]','') : nil
|
201
|
+
end
|
202
|
+
|
203
|
+
def table_names_from_select_clauses
|
204
|
+
relation.select_clauses.map do |sc|
|
205
|
+
sc.split(',').map { table_name_from_select_clause(sc) }
|
206
|
+
end.flatten.compact.uniq
|
207
|
+
end
|
208
|
+
|
209
|
+
def unique_orders(orders)
|
210
|
+
existing_columns = {}
|
211
|
+
orders.inject([]) do |queued_orders, order|
|
212
|
+
table_column, dir = clause_without_expression(order).split
|
213
|
+
table_column = table_column.tr('[]','').split('.')
|
214
|
+
table, column = table_column.size == 2 ? table_column : table_column.unshift('')
|
215
|
+
existing_columns[table] ||= []
|
216
|
+
unless existing_columns[table].include?(column)
|
217
|
+
existing_columns[table] << column
|
218
|
+
queued_orders << order
|
219
|
+
end
|
220
|
+
queued_orders
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
def correlated_safe_joins
|
225
|
+
joins = relation.joins(self)
|
226
|
+
if joins.present?
|
227
|
+
find_and_fix_uncorrelated_joins
|
228
|
+
relation.joins(self)
|
229
|
+
else
|
230
|
+
joins
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
def find_and_fix_uncorrelated_joins
|
235
|
+
join_relation = relation
|
236
|
+
while join_relation.present?
|
237
|
+
return join_relation if uncorrelated_inner_join_relation?(join_relation)
|
238
|
+
join_relation = join_relation.relation rescue nil
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
def uncorrelated_inner_join_relation?(r)
|
243
|
+
if r.is_a?(Arel::StringJoin) && r.relation1.is_a?(Arel::OuterJoin) &&
|
244
|
+
r.relation2.is_a?(String) && r.relation2.starts_with?('INNER JOIN')
|
245
|
+
outter_join_table1 = r.relation1.relation1.table
|
246
|
+
outter_join_table2 = r.relation1.relation2.table
|
247
|
+
string_join_table_info = r.relation2.split(' ON ').first.sub('INNER JOIN ','')
|
248
|
+
return nil if string_join_table_info.include?(' AS ') # Assume someone did something right.
|
249
|
+
string_join_table_name = unqualify_table_name(string_join_table_info)
|
250
|
+
uncorrelated_table1 = string_join_table_name == outter_join_table1.name && string_join_table_name == outter_join_table1.alias.name
|
251
|
+
uncorrelated_table2 = string_join_table_name == outter_join_table2.name && string_join_table_name == outter_join_table2.alias.name
|
252
|
+
if uncorrelated_table1 || uncorrelated_table2
|
253
|
+
on_index = r.relation2.index(' ON ')
|
254
|
+
r.relation2.insert on_index, " AS [#{string_join_table_name}_crltd]"
|
255
|
+
r.relation2.sub! "[#{string_join_table_name}].", "[#{string_join_table_name}_crltd]."
|
256
|
+
return r
|
257
|
+
else
|
258
|
+
return nil
|
259
|
+
end
|
260
|
+
end
|
261
|
+
rescue
|
262
|
+
nil
|
263
|
+
end
|
264
|
+
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 7
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
|
-
- 2
|
8
7
|
- 3
|
9
|
-
-
|
10
|
-
|
8
|
+
- 0
|
9
|
+
- 0
|
10
|
+
version: 3.0.0
|
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:
|
22
|
+
date: 2010-08-29 00:00:00 -04:00
|
23
23
|
default_executable:
|
24
24
|
dependencies:
|
25
25
|
- !ruby/object:Gem::Dependency
|
@@ -32,12 +32,12 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
hash: 7
|
34
34
|
segments:
|
35
|
-
-
|
36
|
-
-
|
37
|
-
version: "
|
35
|
+
- 3
|
36
|
+
- 0
|
37
|
+
version: "3.0"
|
38
38
|
type: :runtime
|
39
39
|
version_requirements: *id001
|
40
|
-
description: SQL Server
|
40
|
+
description: SQL Server 2005 and 2008 Adapter For ActiveRecord
|
41
41
|
email: ken@metaskills.net
|
42
42
|
executables: []
|
43
43
|
|
@@ -48,48 +48,24 @@ extra_rdoc_files:
|
|
48
48
|
files:
|
49
49
|
- CHANGELOG
|
50
50
|
- MIT-LICENSE
|
51
|
-
- Rakefile
|
52
51
|
- README.rdoc
|
53
|
-
-
|
54
|
-
- lib/
|
52
|
+
- lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb
|
53
|
+
- lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb
|
54
|
+
- lib/active_record/connection_adapters/sqlserver/database_limits.rb
|
55
|
+
- lib/active_record/connection_adapters/sqlserver/database_statements.rb
|
56
|
+
- lib/active_record/connection_adapters/sqlserver/errors.rb
|
57
|
+
- lib/active_record/connection_adapters/sqlserver/query_cache.rb
|
58
|
+
- lib/active_record/connection_adapters/sqlserver/quoting.rb
|
59
|
+
- lib/active_record/connection_adapters/sqlserver/schema_statements.rb
|
55
60
|
- lib/active_record/connection_adapters/sqlserver_adapter.rb
|
56
|
-
- lib/
|
57
|
-
- lib/
|
58
|
-
- test/cases/aaaa_create_tables_test_sqlserver.rb
|
59
|
-
- test/cases/adapter_test_sqlserver.rb
|
60
|
-
- test/cases/attribute_methods_test_sqlserver.rb
|
61
|
-
- test/cases/basics_test_sqlserver.rb
|
62
|
-
- test/cases/calculations_test_sqlserver.rb
|
63
|
-
- test/cases/column_test_sqlserver.rb
|
64
|
-
- test/cases/connection_test_sqlserver.rb
|
65
|
-
- test/cases/eager_association_test_sqlserver.rb
|
66
|
-
- test/cases/execute_procedure_test_sqlserver.rb
|
67
|
-
- test/cases/inheritance_test_sqlserver.rb
|
68
|
-
- test/cases/method_scoping_test_sqlserver.rb
|
69
|
-
- test/cases/migration_test_sqlserver.rb
|
70
|
-
- test/cases/named_scope_test_sqlserver.rb
|
71
|
-
- test/cases/offset_and_limit_test_sqlserver.rb
|
72
|
-
- test/cases/pessimistic_locking_test_sqlserver.rb
|
73
|
-
- test/cases/query_cache_test_sqlserver.rb
|
74
|
-
- test/cases/schema_dumper_test_sqlserver.rb
|
75
|
-
- test/cases/specific_schema_test_sqlserver.rb
|
76
|
-
- test/cases/sqlserver_helper.rb
|
77
|
-
- test/cases/table_name_test_sqlserver.rb
|
78
|
-
- test/cases/transaction_test_sqlserver.rb
|
79
|
-
- test/cases/unicode_test_sqlserver.rb
|
80
|
-
- test/cases/validations_test_sqlserver.rb
|
81
|
-
- test/connections/native_sqlserver/connection.rb
|
82
|
-
- test/connections/native_sqlserver_odbc/connection.rb
|
83
|
-
- test/migrations/transaction_table/1_table_will_never_be_created.rb
|
84
|
-
- test/schema/sqlserver_specific_schema.rb
|
61
|
+
- lib/activerecord-sqlserver-adapter.rb
|
62
|
+
- lib/arel/engines/sql/compilers/sqlserver_compiler.rb
|
85
63
|
has_rdoc: true
|
86
|
-
homepage: http://github.com/rails-sqlserver
|
64
|
+
homepage: http://github.com/rails-sqlserver/activerecord-sqlserver-adapter
|
87
65
|
licenses: []
|
88
66
|
|
89
67
|
post_install_message:
|
90
68
|
rdoc_options:
|
91
|
-
- --line-numbers
|
92
|
-
- --inline-source
|
93
69
|
- --main
|
94
70
|
- README.rdoc
|
95
71
|
require_paths:
|
@@ -114,36 +90,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
114
90
|
version: "0"
|
115
91
|
requirements: []
|
116
92
|
|
117
|
-
rubyforge_project:
|
118
|
-
rubygems_version: 1.
|
93
|
+
rubyforge_project: activerecord-sqlserver-adapter
|
94
|
+
rubygems_version: 1.3.7
|
119
95
|
signing_key:
|
120
96
|
specification_version: 3
|
121
|
-
summary: SQL Server
|
122
|
-
test_files:
|
123
|
-
|
124
|
-
- test/cases/adapter_test_sqlserver.rb
|
125
|
-
- test/cases/attribute_methods_test_sqlserver.rb
|
126
|
-
- test/cases/basics_test_sqlserver.rb
|
127
|
-
- test/cases/calculations_test_sqlserver.rb
|
128
|
-
- test/cases/column_test_sqlserver.rb
|
129
|
-
- test/cases/connection_test_sqlserver.rb
|
130
|
-
- test/cases/eager_association_test_sqlserver.rb
|
131
|
-
- test/cases/execute_procedure_test_sqlserver.rb
|
132
|
-
- test/cases/inheritance_test_sqlserver.rb
|
133
|
-
- test/cases/method_scoping_test_sqlserver.rb
|
134
|
-
- test/cases/migration_test_sqlserver.rb
|
135
|
-
- test/cases/named_scope_test_sqlserver.rb
|
136
|
-
- test/cases/offset_and_limit_test_sqlserver.rb
|
137
|
-
- test/cases/pessimistic_locking_test_sqlserver.rb
|
138
|
-
- test/cases/query_cache_test_sqlserver.rb
|
139
|
-
- test/cases/schema_dumper_test_sqlserver.rb
|
140
|
-
- test/cases/specific_schema_test_sqlserver.rb
|
141
|
-
- test/cases/sqlserver_helper.rb
|
142
|
-
- test/cases/table_name_test_sqlserver.rb
|
143
|
-
- test/cases/transaction_test_sqlserver.rb
|
144
|
-
- test/cases/unicode_test_sqlserver.rb
|
145
|
-
- test/cases/validations_test_sqlserver.rb
|
146
|
-
- test/connections/native_sqlserver/connection.rb
|
147
|
-
- test/connections/native_sqlserver_odbc/connection.rb
|
148
|
-
- test/migrations/transaction_table/1_table_will_never_be_created.rb
|
149
|
-
- test/schema/sqlserver_specific_schema.rb
|
97
|
+
summary: SQL Server 2005 and 2008 Adapter For ActiveRecord.
|
98
|
+
test_files: []
|
99
|
+
|
data/RUNNING_UNIT_TESTS
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
== Creating the test database
|
2
|
-
|
3
|
-
The default names for the test databases are "activerecord_unittest" and
|
4
|
-
"activerecord_unittest2". If you want to use another database name then be sure
|
5
|
-
to update the connection adapter setups you want to test with in
|
6
|
-
test/connections/<your database>/connection.rb. Define a user named 'rails'
|
7
|
-
in SQL Server with all privileges granted for the test databases. Use an empty
|
8
|
-
password for said user.
|
9
|
-
|
10
|
-
The connection files make certain assumptions. For instance, the ODBC connection
|
11
|
-
assumes you have a DSN setup that matches the name of the default database names.
|
12
|
-
Review the test/connections/native_sqlserver_#{mode} file you are testing for details.
|
13
|
-
|
14
|
-
|
15
|
-
== Requirements
|
16
|
-
|
17
|
-
Get the development dependencies.
|
18
|
-
|
19
|
-
$ bundle install
|
20
|
-
|
21
|
-
The tests of this adapter depend on the existence of rails checkout. Make sure
|
22
|
-
to checkout remotes/origin/2-3-stable, I suggest using the git_remote_branch to
|
23
|
-
create a personal tracking branch. Then make a local topic branch off of that like
|
24
|
-
2-3-stable_sqlserver and commit this patch https://gist.github.com/761508 or you
|
25
|
-
will have around 90 some errors like this.
|
26
|
-
|
27
|
-
"Conversion failed when converting the nvarchar value 'Godfather' to data
|
28
|
-
type int.: INSERT INTO [items] ([name], [id]) VALUES (N'Godfather', 1)
|
29
|
-
|
30
|
-
|
31
|
-
|
data/Rakefile
DELETED
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
require 'rake/rdoctask'
|
4
|
-
|
5
|
-
|
6
|
-
def test_libs(mode='odbc')
|
7
|
-
['lib',
|
8
|
-
'test',
|
9
|
-
"test/connections/native_sqlserver#{mode == 'adonet' ? '' : "_#{mode}"}",
|
10
|
-
"#{ENV['RAILS_SOURCE']}/activerecord/test"]
|
11
|
-
end
|
12
|
-
|
13
|
-
def test_files
|
14
|
-
Dir.glob("test/cases/**/*_test_sqlserver.rb").sort +
|
15
|
-
(Dir.glob("#{ENV['RAILS_SOURCE']}/activerecord/test/cases/**/*_test.rb") -
|
16
|
-
Dir.glob("#{ENV['RAILS_SOURCE']}/activerecord/test/cases/adapters/**/*_test.rb")).sort
|
17
|
-
end
|
18
|
-
|
19
|
-
|
20
|
-
task :test => ['test:dblib']
|
21
|
-
|
22
|
-
|
23
|
-
namespace :test do
|
24
|
-
|
25
|
-
['dblib','odbc','adonet'].each do |mode|
|
26
|
-
|
27
|
-
Rake::TestTask.new(mode) do |t|
|
28
|
-
t.libs = test_libs(mode)
|
29
|
-
t.test_files = test_files
|
30
|
-
t.verbose = true
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
|
-
namespace :profile do
|
39
|
-
|
40
|
-
['dblib','odbc','adonet'].each do |mode|
|
41
|
-
namespace mode.to_sym do
|
42
|
-
|
43
|
-
Dir.glob("test/profile/*_profile_case.rb").sort.each do |test_file|
|
44
|
-
|
45
|
-
profile_case = File.basename(test_file).sub('_profile_case.rb','')
|
46
|
-
|
47
|
-
Rake::TestTask.new(profile_case) do |t|
|
48
|
-
t.libs = test_libs(mode)
|
49
|
-
t.test_files = [test_file]
|
50
|
-
t.verbose = true
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
|