activerecord-sqlserver-adapter 3.0.9 → 3.0.10

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 CHANGED
@@ -1,4 +1,15 @@
1
1
 
2
+ * 3.0.10 *
3
+
4
+ * Fix #rowtable_orders visitor helper to use first column if no pk column was found.
5
+
6
+ * Flatten sp_helpconstraint when looking for constraints just in case fks are present. Issue #64.
7
+
8
+ * Start to support 2011 code named "Denali".
9
+
10
+ * Limit and Offset can take SqlLiteral objects now.
11
+
12
+
2
13
  * 3.0.9 *
3
14
 
4
15
  * Fix array literal parsing bug for ruby 1.9.
@@ -1,4 +1,5 @@
1
1
  require 'active_record/version'
2
+ require 'active_support/core_ext/class/inheritable_attributes'
2
3
 
3
4
  module ActiveRecord
4
5
  module ConnectionAdapters
@@ -242,7 +242,8 @@ module ActiveRecord
242
242
  end
243
243
 
244
244
  def remove_default_constraint(table_name, column_name)
245
- select_all("EXEC sp_helpconstraint '#{quote_string(table_name)}','nomsg'").select do |row|
245
+ # If their are foreign keys in this table, we could still get back a 2D array, so flatten just in case.
246
+ select_all("EXEC sp_helpconstraint '#{quote_string(table_name)}','nomsg'").flatten.select do |row|
246
247
  row['constraint_type'] == "DEFAULT on column #{column_name}"
247
248
  end.each do |row|
248
249
  do_execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{row['constraint_name']}"
@@ -164,9 +164,9 @@ module ActiveRecord
164
164
  include Sqlserver::Errors
165
165
 
166
166
  ADAPTER_NAME = 'SQLServer'.freeze
167
- VERSION = '3.0.9'.freeze
168
- DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+(\d{4})/
169
- SUPPORTED_VERSIONS = [2005,2008].freeze
167
+ VERSION = '3.0.10'.freeze
168
+ DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+"?(\d{4}|\w+)"?/
169
+ SUPPORTED_VERSIONS = [2005,2008,2011].freeze
170
170
 
171
171
  attr_reader :database_version, :database_year,
172
172
  :connection_supports_native_types
@@ -180,11 +180,16 @@ module ActiveRecord
180
180
  connect
181
181
  super(@connection, logger)
182
182
  @database_version = info_schema_query { select_value('SELECT @@version') }
183
- @database_year = DATABASE_VERSION_REGEXP.match(@database_version)[1].to_i rescue 0
183
+ @database_year = begin
184
+ year = DATABASE_VERSION_REGEXP.match(@database_version)[1]
185
+ year == "Denali" ? 2011 : year.to_i
186
+ rescue
187
+ 0
188
+ end
184
189
  initialize_sqlserver_caches
185
190
  use_database
186
191
  unless SUPPORTED_VERSIONS.include?(@database_year)
187
- raise NotImplementedError, "Currently, only #{SUPPORTED_VERSIONS.to_sentence} are supported."
192
+ raise NotImplementedError, "Currently, only #{SUPPORTED_VERSIONS.to_sentence} are supported. We got back #{@database_version}."
188
193
  end
189
194
  end
190
195
 
@@ -285,6 +290,10 @@ module ActiveRecord
285
290
  @database_year == 2008
286
291
  end
287
292
 
293
+ def sqlserver_2011?
294
+ @database_year == 2011
295
+ end
296
+
288
297
  def version
289
298
  self.class::VERSION
290
299
  end
@@ -6,21 +6,6 @@ module Arel
6
6
  class LockWithSQLServer < Arel::Nodes::Unary
7
7
  end
8
8
 
9
- # In versions of ActiveRecord prior to v3.0.3 limits and offset were always integers via
10
- # a #to_i. Somewhere between ActiveRecord and ARel this is not happening anymore nor are they
11
- # in agreement which should be responsible. Since we need to make sure that these are visited
12
- # correctly and that we can do math with them, these are here to cast to integers.
13
- class Limit < Arel::Nodes::Unary
14
- def initialize expr
15
- @expr = expr.to_i
16
- end
17
- end
18
- class Offset < Arel::Nodes::Unary
19
- def initialize expr
20
- @expr = expr.to_i
21
- end
22
- end
23
-
24
9
  # Extending the Ordering class to be comparrison friendly which allows us to call #uniq on a
25
10
  # collection of them. See SelectManager#order for more details.
26
11
  class Ordering < Arel::Nodes::Binary
@@ -49,19 +34,18 @@ module Arel
49
34
  @ast.orders.concat(exprs.map{ |x|
50
35
  case x
51
36
  when Arel::Attributes::Attribute
52
- c = engine.connection
53
- tn = x.relation.table_alias || x.relation.name
54
- expr = Arel::Nodes::SqlLiteral.new "#{c.quote_table_name(tn)}.#{c.quote_column_name(x.name)}"
37
+ table = Arel::Table.new(x.relation.table_alias || x.relation.name)
38
+ expr = table[x.name]
55
39
  Arel::Nodes::Ordering.new expr
56
40
  when String
57
41
  x.split(',').map do |s|
58
42
  expr, direction = s.split
59
- expr = Arel::Nodes::SqlLiteral.new(expr)
43
+ expr = Arel.sql(expr)
60
44
  direction = direction =~ /desc/i ? :desc : :asc
61
45
  Arel::Nodes::Ordering.new expr, direction
62
46
  end
63
47
  else
64
- expr = Arel::Nodes::SqlLiteral.new x.to_s
48
+ expr = Arel.sql(x.to_s)
65
49
  Arel::Nodes::Ordering.new expr
66
50
  end
67
51
  }.flatten)
@@ -99,7 +83,7 @@ module Arel
99
83
  end
100
84
 
101
85
  def visit_Arel_Nodes_Offset(o)
102
- "WHERE [__rnt].[__rn] > #{visit o.expr}"
86
+ "WHERE [__rnt].[__rn] > (#{visit o.expr})"
103
87
  end
104
88
 
105
89
  def visit_Arel_Nodes_Limit(o)
@@ -136,7 +120,7 @@ module Arel
136
120
  groups = projections.map { |x| projection_without_expression(x) }
137
121
  projections = projections.map { |x| projection_without_expression(x) }
138
122
  orders = orders.map do |x|
139
- expr = Arel::Nodes::SqlLiteral.new projection_without_expression(x.expr)
123
+ expr = Arel.sql projection_without_expression(x.expr)
140
124
  x.descending? ? Arel::Nodes::Max.new([expr]) : Arel::Nodes::Min.new([expr])
141
125
  end
142
126
  end
@@ -166,7 +150,7 @@ module Arel
166
150
 
167
151
  def visit_Arel_Nodes_SelectStatementForComplexCount(o)
168
152
  core = o.cores.first
169
- o.limit.expr = o.limit.expr + (o.offset ? o.offset.expr : 0) if o.limit
153
+ o.limit.expr = Arel.sql("#{o.limit.expr} + #{o.offset ? o.offset.expr : 0}") if o.limit
170
154
  orders = rowtable_orders(o)
171
155
  [ "SELECT COUNT([count]) AS [count_id]",
172
156
  "FROM (",
@@ -301,11 +285,11 @@ module Arel
301
285
  end
302
286
  elsif join_in_select_statement?(o) && all_projections_aliased_in_select_statement?(o)
303
287
  core.projections.map do |x|
304
- Arel::Nodes::SqlLiteral.new x.split(',').map{ |y| y.split(' AS ').last.strip }.join(', ')
288
+ Arel.sql x.split(',').map{ |y| y.split(' AS ').last.strip }.join(', ')
305
289
  end
306
290
  elsif function_select_statement?(o)
307
291
  # TODO: [ARel 2.2] Use Arel.star
308
- [Arel::Nodes::SqlLiteral.new('*')]
292
+ [Arel.sql('*')]
309
293
  else
310
294
  tn = table_from_select_statement(o).name
311
295
  core.projections.map { |x| x.gsub /\[#{tn}\]\./, '[__rnt].' }
@@ -316,16 +300,16 @@ module Arel
316
300
  core = o.cores.first
317
301
  if !o.orders.empty?
318
302
  o.orders
319
- elsif join_in_select_statement?(o)
320
- [table_from_select_statement(o).primary_key.asc]
321
303
  else
322
- [table_from_select_statement(o).primary_key.asc]
304
+ t = table_from_select_statement(o)
305
+ c = t.primary_key || t.columns.first
306
+ [c.asc]
323
307
  end.uniq
324
308
  end
325
309
 
326
310
  # TODO: We use this for grouping too, maybe make Grouping objects vs SqlLiteral.
327
311
  def projection_without_expression(projection)
328
- Arel::Nodes::SqlLiteral.new(projection.split(',').map do |x|
312
+ Arel.sql(projection.split(',').map do |x|
329
313
  x.strip!
330
314
  x.sub!(/^(COUNT|SUM|MAX|MIN|AVG)\s*(\((.*)\))?/,'\3')
331
315
  x.sub!(/^DISTINCT\s*/,'')
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-sqlserver-adapter
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 19
5
+ prerelease:
5
6
  segments:
6
7
  - 3
7
8
  - 0
8
- - 9
9
- version: 3.0.9
9
+ - 10
10
+ version: 3.0.10
10
11
  platform: ruby
11
12
  authors:
12
13
  - Ken Collins
@@ -18,7 +19,7 @@ autorequire:
18
19
  bindir: bin
19
20
  cert_chain: []
20
21
 
21
- date: 2011-01-17 00:00:00 -05:00
22
+ date: 2011-03-01 00:00:00 -05:00
22
23
  default_executable:
23
24
  dependencies:
24
25
  - !ruby/object:Gem::Dependency
@@ -29,6 +30,7 @@ dependencies:
29
30
  requirements:
30
31
  - - ~>
31
32
  - !ruby/object:Gem::Version
33
+ hash: 1
32
34
  segments:
33
35
  - 3
34
36
  - 0
@@ -44,6 +46,7 @@ dependencies:
44
46
  requirements:
45
47
  - - ~>
46
48
  - !ruby/object:Gem::Version
49
+ hash: 1
47
50
  segments:
48
51
  - 2
49
52
  - 0
@@ -89,6 +92,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
92
  requirements:
90
93
  - - ">="
91
94
  - !ruby/object:Gem::Version
95
+ hash: 3
92
96
  segments:
93
97
  - 0
94
98
  version: "0"
@@ -97,13 +101,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
101
  requirements:
98
102
  - - ">="
99
103
  - !ruby/object:Gem::Version
104
+ hash: 3
100
105
  segments:
101
106
  - 0
102
107
  version: "0"
103
108
  requirements: []
104
109
 
105
110
  rubyforge_project: activerecord-sqlserver-adapter
106
- rubygems_version: 1.3.7
111
+ rubygems_version: 1.5.0
107
112
  signing_key:
108
113
  specification_version: 3
109
114
  summary: SQL Server 2005 and 2008 Adapter For ActiveRecord.