activerecord-sqlserver-adapter 3.1.3 → 3.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,35 @@
1
1
 
2
+ * 3.1.4 *
3
+
4
+ * Use INFORMATION_SCHEMA.KEY_COLUMN_USAGE for schema reflection speed.
5
+ Fixes #125. [Wüthrich Hannes @hwuethrich]
6
+
7
+ * New deadlock victim retry using the #retry_deadlock_victim config. [Joe Rafaniello]
8
+
9
+ * Renamed #with_auto_reconnect to #with_sqlserver_error_handling now that it handles both dropped
10
+ connections and deadlock victim errors. Fixes #150 [Joe Rafaniello]
11
+
12
+ * Add activity_stats method that mimics the SQL Server Activity Monitor. Fixes #146 [Joe Rafaniello]
13
+
14
+ * Add methods for sqlserver's #product_version, #product_level, #edition and include them in inspect.
15
+ Fixes #145 [Joe Rafaniello]
16
+
17
+ * Handle statements that cannot be retried on a new database connection by not reconnecting.
18
+ Fixes #147 [Joe Rafaniello]
19
+
20
+ * Added connection#spid for debugging. Fixes #144 [Joe Rafaniello]
21
+
22
+ * Add ENV['TEST_FILES'] to Rakefile for easy single case tests. [Joe Rafaniello]
23
+
24
+ * Pass ActiveRecord tests. Made windowed distinct pass all orders to groups.
25
+ - test_limited_eager_with_multiple_order_columns
26
+ - test_limited_eager_with_order
27
+
28
+ * Pass AR tests by moving DISTINCT to GROUP BY in windowed SQL.
29
+ - test_count_eager_with_has_many_and_limit_and_high_offset
30
+ - test_eager_with_has_many_and_limit_and_high_offset
31
+
32
+
2
33
  * 3.1.3 *
3
34
 
4
35
  * Distinguish between identity and primary key key columns during schema reflection. Allows us
@@ -0,0 +1,97 @@
1
+ module ActiveRecord
2
+ module ConnectionAdapters
3
+ module Sqlserver
4
+ module CoreExt
5
+ module DatabaseStatements
6
+
7
+ # This is a copy of the current (3.1.3) ActiveRecord's transaction method. We should propose
8
+ # a patch to the default transaction method to make it more callback for adapters that want to
9
+ # do deadlock retry logic. Because this is a copy, we really need to keep an eye out on this when
10
+ # upgradding the adapter.
11
+ def transaction_with_retry_deadlock_victim(options = {})
12
+ options.assert_valid_keys :requires_new, :joinable
13
+
14
+ last_transaction_joinable = defined?(@transaction_joinable) ? @transaction_joinable : nil
15
+ if options.has_key?(:joinable)
16
+ @transaction_joinable = options[:joinable]
17
+ else
18
+ @transaction_joinable = true
19
+ end
20
+ requires_new = options[:requires_new] || !last_transaction_joinable
21
+
22
+ transaction_open = false
23
+ @_current_transaction_records ||= []
24
+
25
+ begin
26
+ if block_given?
27
+ if requires_new || open_transactions == 0
28
+ if open_transactions == 0
29
+ begin_db_transaction
30
+ elsif requires_new
31
+ create_savepoint
32
+ end
33
+ increment_open_transactions
34
+ transaction_open = true
35
+ @_current_transaction_records.push([])
36
+ end
37
+ yield
38
+ end
39
+ rescue Exception => database_transaction_rollback
40
+ if transaction_open && !outside_transaction?
41
+ transaction_open = false
42
+ decrement_open_transactions
43
+ # handle deadlock victim retries at the outermost transaction
44
+ if open_transactions == 0
45
+ if database_transaction_rollback.is_a?(::ActiveRecord::DeadlockVictim)
46
+ # SQL Server has already rolled back, so rollback activerecord's history
47
+ rollback_transaction_records(true)
48
+ retry
49
+ else
50
+ rollback_db_transaction
51
+ rollback_transaction_records(true)
52
+ end
53
+ else
54
+ rollback_to_savepoint
55
+ rollback_transaction_records(false)
56
+ end
57
+ end
58
+ raise unless database_transaction_rollback.is_a?(::ActiveRecord::Rollback)
59
+ end
60
+ ensure
61
+ @transaction_joinable = last_transaction_joinable
62
+
63
+ if outside_transaction?
64
+ @open_transactions = 0
65
+ elsif transaction_open
66
+ decrement_open_transactions
67
+ begin
68
+ if open_transactions == 0
69
+ commit_db_transaction
70
+ commit_transaction_records
71
+ else
72
+ release_savepoint
73
+ save_point_records = @_current_transaction_records.pop
74
+ unless save_point_records.blank?
75
+ @_current_transaction_records.push([]) if @_current_transaction_records.empty?
76
+ @_current_transaction_records.last.concat(save_point_records)
77
+ end
78
+ end
79
+ rescue Exception => database_transaction_rollback
80
+ if open_transactions == 0
81
+ rollback_db_transaction
82
+ rollback_transaction_records(true)
83
+ else
84
+ rollback_to_savepoint
85
+ rollback_transaction_records(false)
86
+ end
87
+ raise
88
+ end
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+
@@ -3,6 +3,8 @@ module ActiveRecord
3
3
  module Sqlserver
4
4
  module DatabaseStatements
5
5
 
6
+ include CoreExt::DatabaseStatements
7
+
6
8
  def select_rows(sql, name = nil)
7
9
  raw_select sql, name, [], :fetch => :rows
8
10
  end
@@ -45,12 +47,20 @@ module ActiveRecord
45
47
  true
46
48
  end
47
49
 
50
+ def transaction(options = {})
51
+ if retry_deadlock_victim?
52
+ block_given? ? transaction_with_retry_deadlock_victim(options) { yield } : transaction_with_retry_deadlock_victim(options)
53
+ else
54
+ block_given? ? super(options) { yield } : super(options)
55
+ end
56
+ end
57
+
48
58
  def begin_db_transaction
49
59
  do_execute "BEGIN TRANSACTION"
50
60
  end
51
61
 
52
62
  def commit_db_transaction
53
- do_execute "COMMIT TRANSACTION"
63
+ disable_auto_reconnect { do_execute "COMMIT TRANSACTION" }
54
64
  end
55
65
 
56
66
  def rollback_db_transaction
@@ -58,14 +68,14 @@ module ActiveRecord
58
68
  end
59
69
 
60
70
  def create_savepoint
61
- do_execute "SAVE TRANSACTION #{current_savepoint_name}"
71
+ disable_auto_reconnect { do_execute "SAVE TRANSACTION #{current_savepoint_name}" }
62
72
  end
63
73
 
64
74
  def release_savepoint
65
75
  end
66
76
 
67
77
  def rollback_to_savepoint
68
- do_execute "ROLLBACK TRANSACTION #{current_savepoint_name}"
78
+ disable_auto_reconnect { do_execute "ROLLBACK TRANSACTION #{current_savepoint_name}" }
69
79
  end
70
80
 
71
81
  def add_limit_offset!(sql, options)
@@ -185,6 +195,51 @@ module ActiveRecord
185
195
  select_value "SELECT NEWSEQUENTIALID()"
186
196
  end
187
197
 
198
+ def activity_stats
199
+ select_all %|
200
+ SELECT
201
+ [session_id] = s.session_id,
202
+ [user_process] = CONVERT(CHAR(1), s.is_user_process),
203
+ [login] = s.login_name,
204
+ [database] = ISNULL(db_name(r.database_id), N''),
205
+ [task_state] = ISNULL(t.task_state, N''),
206
+ [command] = ISNULL(r.command, N''),
207
+ [application] = ISNULL(s.program_name, N''),
208
+ [wait_time_ms] = ISNULL(w.wait_duration_ms, 0),
209
+ [wait_type] = ISNULL(w.wait_type, N''),
210
+ [wait_resource] = ISNULL(w.resource_description, N''),
211
+ [blocked_by] = ISNULL(CONVERT (varchar, w.blocking_session_id), ''),
212
+ [head_blocker] =
213
+ CASE
214
+ -- session has an active request, is blocked, but is blocking others
215
+ WHEN r2.session_id IS NOT NULL AND r.blocking_session_id = 0 THEN '1'
216
+ -- session is idle but has an open tran and is blocking others
217
+ WHEN r.session_id IS NULL THEN '1'
218
+ ELSE ''
219
+ END,
220
+ [total_cpu_ms] = s.cpu_time,
221
+ [total_physical_io_mb] = (s.reads + s.writes) * 8 / 1024,
222
+ [memory_use_kb] = s.memory_usage * 8192 / 1024,
223
+ [open_transactions] = ISNULL(r.open_transaction_count,0),
224
+ [login_time] = s.login_time,
225
+ [last_request_start_time] = s.last_request_start_time,
226
+ [host_name] = ISNULL(s.host_name, N''),
227
+ [net_address] = ISNULL(c.client_net_address, N''),
228
+ [execution_context_id] = ISNULL(t.exec_context_id, 0),
229
+ [request_id] = ISNULL(r.request_id, 0),
230
+ [workload_group] = N''
231
+ FROM sys.dm_exec_sessions s LEFT OUTER JOIN sys.dm_exec_connections c ON (s.session_id = c.session_id)
232
+ LEFT OUTER JOIN sys.dm_exec_requests r ON (s.session_id = r.session_id)
233
+ LEFT OUTER JOIN sys.dm_os_tasks t ON (r.session_id = t.session_id AND r.request_id = t.request_id)
234
+ LEFT OUTER JOIN
235
+ (SELECT *, ROW_NUMBER() OVER (PARTITION BY waiting_task_address ORDER BY wait_duration_ms DESC) AS row_num
236
+ FROM sys.dm_os_waiting_tasks
237
+ ) w ON (t.task_address = w.waiting_task_address) AND w.row_num = 1
238
+ LEFT OUTER JOIN sys.dm_exec_requests r2 ON (r.session_id = r2.blocking_session_id)
239
+ WHERE db_name(r.database_id) = '#{current_database}'
240
+ ORDER BY s.session_id|
241
+ end
242
+
188
243
  # === SQLServer Specific (Rake/Test Helpers) ==================== #
189
244
 
190
245
  def recreate_database
@@ -262,7 +317,7 @@ module ActiveRecord
262
317
  def do_execute(sql, name = nil)
263
318
  name ||= 'EXECUTE'
264
319
  log(sql, name) do
265
- with_auto_reconnect { raw_connection_do(sql) }
320
+ with_sqlserver_error_handling { raw_connection_do(sql) }
266
321
  end
267
322
  end
268
323
 
@@ -307,18 +362,20 @@ module ActiveRecord
307
362
  # === SQLServer Specific (Selecting) ============================ #
308
363
 
309
364
  def raw_select(sql, name=nil, binds=[], options={})
310
- log(sql,name,binds) do
311
- begin
312
- handle = raw_connection_run(sql)
313
- handle_to_names_and_values(handle, options)
314
- ensure
315
- finish_statement_handle(handle)
316
- end
365
+ log(sql,name,binds) { _raw_select(sql, options) }
366
+ end
367
+
368
+ def _raw_select(sql, options={})
369
+ begin
370
+ handle = raw_connection_run(sql)
371
+ handle_to_names_and_values(handle, options)
372
+ ensure
373
+ finish_statement_handle(handle)
317
374
  end
318
375
  end
319
376
 
320
377
  def raw_connection_run(sql)
321
- with_auto_reconnect do
378
+ with_sqlserver_error_handling do
322
379
  case @connection_options[:mode]
323
380
  when :dblib
324
381
  @connection.execute(sql)
@@ -3,6 +3,9 @@ module ActiveRecord
3
3
  class LostConnection < WrappedDatabaseException
4
4
  end
5
5
 
6
+ class DeadlockVictim < WrappedDatabaseException
7
+ end
8
+
6
9
  module ConnectionAdapters
7
10
  module Sqlserver
8
11
  module Errors
@@ -193,7 +193,7 @@ module ActiveRecord
193
193
  ELSE NULL
194
194
  END AS [is_nullable],
195
195
  CASE
196
- WHEN CCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
196
+ WHEN KCU.COLUMN_NAME IS NOT NULL AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY' THEN 1
197
197
  ELSE NULL
198
198
  END AS [is_primary],
199
199
  CASE
@@ -201,12 +201,17 @@ module ActiveRecord
201
201
  ELSE NULL
202
202
  END AS [is_identity]
203
203
  FROM #{db_name_with_period}INFORMATION_SCHEMA.COLUMNS columns
204
- LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.TABLE_NAME = columns.TABLE_NAME AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
205
- LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CCU ON TC.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME AND CCU.COLUMN_NAME = columns.COLUMN_NAME
204
+ LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
205
+ ON TC.TABLE_NAME = columns.TABLE_NAME
206
+ AND TC.CONSTRAINT_TYPE = N'PRIMARY KEY'
207
+ LEFT OUTER JOIN #{db_name_with_period}INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU
208
+ ON KCU.COLUMN_NAME = columns.COLUMN_NAME
209
+ AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
210
+ AND KCU.CONSTRAINT_CATALOG = TC.CONSTRAINT_CATALOG
211
+ AND KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
206
212
  WHERE columns.TABLE_NAME = @0
207
213
  AND columns.TABLE_SCHEMA = #{table_schema.blank? ? "schema_name()" : "@1"}
208
214
  ORDER BY columns.ordinal_position
209
-
210
215
  }.gsub(/[ \t\r\n]+/,' ')
211
216
  binds = [['table_name', table_name]]
212
217
  binds << ['table_schema',table_schema] unless table_schema.blank?
@@ -3,7 +3,7 @@ module ActiveRecord
3
3
  module Sqlserver
4
4
  module Version
5
5
 
6
- VERSION = '3.1.3'.freeze
6
+ VERSION = '3.1.4'
7
7
 
8
8
  end
9
9
  end
@@ -2,6 +2,7 @@ require 'arel/visitors/sqlserver'
2
2
  require 'active_record'
3
3
  require 'active_record/connection_adapters/abstract_adapter'
4
4
  require 'active_record/connection_adapters/sqlserver/core_ext/active_record'
5
+ require 'active_record/connection_adapters/sqlserver/core_ext/database_statements'
5
6
  require 'active_record/connection_adapters/sqlserver/database_limits'
6
7
  require 'active_record/connection_adapters/sqlserver/database_statements'
7
8
  require 'active_record/connection_adapters/sqlserver/errors'
@@ -176,10 +177,10 @@ module ActiveRecord
176
177
  DATABASE_VERSION_REGEXP = /Microsoft SQL Server\s+"?(\d{4}|\w+)"?/
177
178
  SUPPORTED_VERSIONS = [2005,2008,2010,2011].freeze
178
179
 
179
- attr_reader :database_version, :database_year
180
+ attr_reader :database_version, :database_year, :spid, :product_level, :product_version, :edition
180
181
 
181
182
  cattr_accessor :native_text_database_type, :native_binary_database_type, :native_string_database_type,
182
- :log_info_schema_queries, :enable_default_unicode_types, :auto_connect,
183
+ :log_info_schema_queries, :enable_default_unicode_types, :auto_connect, :retry_deadlock_victim,
183
184
  :cs_equality_operator, :lowercase_schema_reflection, :auto_connect_duration
184
185
 
185
186
  self.enable_default_unicode_types = true
@@ -208,6 +209,9 @@ module ActiveRecord
208
209
  rescue
209
210
  0
210
211
  end
212
+ @product_level = info_schema_query { select_value("SELECT CAST(SERVERPROPERTY('productlevel') AS VARCHAR(128))") }
213
+ @product_version = info_schema_query { select_value("SELECT CAST(SERVERPROPERTY('productversion') AS VARCHAR(128))") }
214
+ @edition = info_schema_query { select_value("SELECT CAST(SERVERPROPERTY('edition') AS VARCHAR(128))") }
211
215
  initialize_dateformatter
212
216
  initialize_sqlserver_caches
213
217
  use_database
@@ -269,6 +273,7 @@ module ActiveRecord
269
273
  end
270
274
 
271
275
  def disconnect!
276
+ @spid = nil
272
277
  case @connection_options[:mode]
273
278
  when :dblib
274
279
  @connection.close rescue nil
@@ -323,7 +328,7 @@ module ActiveRecord
323
328
  end
324
329
 
325
330
  def inspect
326
- "#<#{self.class} version: #{version}, year: #{@database_year}, connection_options: #{@connection_options.inspect}>"
331
+ "#<#{self.class} version: #{version}, year: #{@database_year}, product_level: #{@product_level.inspect}, product_version: #{@product_version.inspect}, edition: #{@edition.inspect}, connection_options: #{@connection_options.inspect}>"
327
332
  end
328
333
 
329
334
  def auto_connect
@@ -334,6 +339,11 @@ module ActiveRecord
334
339
  @@auto_connect_duration ||= 10
335
340
  end
336
341
 
342
+ def retry_deadlock_victim
343
+ @@retry_deadlock_victim.is_a?(FalseClass) ? false : true
344
+ end
345
+ alias :retry_deadlock_victim? :retry_deadlock_victim
346
+
337
347
  def native_string_database_type
338
348
  @@native_string_database_type || (enable_default_unicode_types ? 'nvarchar' : 'varchar')
339
349
  end
@@ -358,7 +368,6 @@ module ActiveRecord
358
368
  @@cs_equality_operator || 'COLLATE Latin1_General_CS_AS_WS'
359
369
  end
360
370
 
361
-
362
371
  protected
363
372
 
364
373
  # === Abstract Adapter (Misc Support) =========================== #
@@ -369,6 +378,8 @@ module ActiveRecord
369
378
  RecordNotUnique.new(message,e)
370
379
  when /conflicted with the foreign key constraint/i
371
380
  InvalidForeignKey.new(message,e)
381
+ when /has been chosen as the deadlock victim/i
382
+ DeadlockVictim.new(message,e)
372
383
  when *lost_connection_messages
373
384
  LostConnection.new(message,e)
374
385
  else
@@ -431,6 +442,7 @@ module ActiveRecord
431
442
  end
432
443
  end
433
444
  end
445
+ @spid = _raw_select("SELECT @@SPID", :fetch => :rows).first.first
434
446
  configure_connection
435
447
  rescue
436
448
  raise unless @auto_connecting
@@ -468,15 +480,25 @@ module ActiveRecord
468
480
  end if block_given?
469
481
  end
470
482
 
471
- def with_auto_reconnect
483
+ def with_sqlserver_error_handling
472
484
  begin
473
485
  yield
474
486
  rescue Exception => e
475
- retry if translate_exception(e,e.message).is_a?(LostConnection) && auto_reconnected?
487
+ case translate_exception(e,e.message)
488
+ when LostConnection; retry if auto_reconnected?
489
+ when DeadlockVictim; retry if retry_deadlock_victim? && open_transactions == 0
490
+ end
476
491
  raise
477
492
  end
478
493
  end
479
494
 
495
+ def disable_auto_reconnect
496
+ old_auto_connect, self.class.auto_connect = self.class.auto_connect, false
497
+ yield
498
+ ensure
499
+ self.class.auto_connect = old_auto_connect
500
+ end
501
+
480
502
  def auto_reconnected?
481
503
  return false unless auto_connect
482
504
  @auto_connecting = true
@@ -138,9 +138,11 @@ module Arel
138
138
  orders = o.orders.uniq
139
139
  if windowed
140
140
  projections = function_select_statement?(o) ? projections : projections.map { |x| projection_without_expression(x) }
141
+ groups = projections.map { |x| projection_without_expression(x) } if windowed_single_distinct_select_statement?(o) && groups.empty?
142
+ groups += orders.map { |x| Arel.sql(x.expr) } if windowed_single_distinct_select_statement?(o)
141
143
  elsif eager_limiting_select_statement?(o)
142
- groups = projections.map { |x| projection_without_expression(x) }
143
144
  projections = projections.map { |x| projection_without_expression(x) }
145
+ groups = projections.map { |x| projection_without_expression(x) }
144
146
  orders = orders.map do |x|
145
147
  expr = Arel.sql projection_without_expression(x.expr)
146
148
  x.descending? ? Arel::Nodes::Max.new([expr]) : Arel::Nodes::Min.new([expr])
@@ -162,7 +164,7 @@ module Arel
162
164
  def visit_Arel_Nodes_SelectStatementWithOffset(o)
163
165
  orders = rowtable_orders(o)
164
166
  [ "SELECT",
165
- (visit(o.limit) if o.limit && !single_distinct_select_statement?(o)),
167
+ (visit(o.limit) if o.limit && !windowed_single_distinct_select_statement?(o)),
166
168
  (rowtable_projections(o).map{ |x| visit(x) }.join(', ')),
167
169
  "FROM (",
168
170
  "SELECT ROW_NUMBER() OVER (ORDER BY #{orders.map{ |x| visit(x) }.join(', ')}) AS [__rn],",
@@ -238,6 +240,10 @@ module Arel
238
240
  p1.respond_to?(:include?) && p1.include?('DISTINCT'))
239
241
  end
240
242
 
243
+ def windowed_single_distinct_select_statement?(o)
244
+ o.limit && o.offset && single_distinct_select_statement?(o)
245
+ end
246
+
241
247
  def single_distinct_select_everything_statement?(o)
242
248
  single_distinct_select_statement?(o) && visit(o.cores.first.projections.first).ends_with?(".*")
243
249
  end
@@ -316,7 +322,17 @@ module Arel
316
322
 
317
323
  def rowtable_projections(o)
318
324
  core = o.cores.first
319
- if single_distinct_select_statement?(o)
325
+ if windowed_single_distinct_select_statement?(o) && core.groups.blank?
326
+ tn = table_from_select_statement(o).name
327
+ core.projections.map do |x|
328
+ x.dup.tap do |p|
329
+ p.sub! 'DISTINCT', ''
330
+ p.insert 0, visit(o.limit) if o.limit
331
+ p.gsub! /\[?#{tn}\]?\./, '[__rnt].'
332
+ p.strip!
333
+ end
334
+ end
335
+ elsif single_distinct_select_statement?(o)
320
336
  tn = table_from_select_statement(o).name
321
337
  core.projections.map do |x|
322
338
  x.dup.tap do |p|
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
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 1
9
- - 3
10
- version: 3.1.3
9
+ - 4
10
+ version: 3.1.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ken Collins
@@ -19,8 +19,7 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2011-10-28 00:00:00 -04:00
23
- default_executable:
22
+ date: 2011-11-30 00:00:00 Z
24
23
  dependencies:
25
24
  - !ruby/object:Gem::Dependency
26
25
  name: activerecord
@@ -50,6 +49,7 @@ files:
50
49
  - CHANGELOG
51
50
  - MIT-LICENSE
52
51
  - lib/active_record/connection_adapters/sqlserver/core_ext/active_record.rb
52
+ - lib/active_record/connection_adapters/sqlserver/core_ext/database_statements.rb
53
53
  - lib/active_record/connection_adapters/sqlserver/core_ext/odbc.rb
54
54
  - lib/active_record/connection_adapters/sqlserver/database_limits.rb
55
55
  - lib/active_record/connection_adapters/sqlserver/database_statements.rb
@@ -60,7 +60,6 @@ files:
60
60
  - lib/active_record/connection_adapters/sqlserver_adapter.rb
61
61
  - lib/activerecord-sqlserver-adapter.rb
62
62
  - lib/arel/visitors/sqlserver.rb
63
- has_rdoc: true
64
63
  homepage: http://github.com/rails-sqlserver/activerecord-sqlserver-adapter
65
64
  licenses: []
66
65
 
@@ -90,7 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
89
  requirements: []
91
90
 
92
91
  rubyforge_project: activerecord-sqlserver-adapter
93
- rubygems_version: 1.6.2
92
+ rubygems_version: 1.8.8
94
93
  signing_key:
95
94
  specification_version: 3
96
95
  summary: SQL Server 2005 and 2008 Adapter For ActiveRecord.