activerecord-jdbc-adapter 1.2.1 → 1.2.2

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 (53) hide show
  1. data/.travis.yml +3 -0
  2. data/Gemfile.lock +13 -15
  3. data/History.txt +19 -0
  4. data/README.rdoc +2 -0
  5. data/Rakefile +2 -1
  6. data/lib/arel/visitors/derby.rb +9 -2
  7. data/lib/arel/visitors/sql_server.rb +2 -0
  8. data/lib/arjdbc/db2/adapter.rb +3 -1
  9. data/lib/arjdbc/derby/adapter.rb +10 -3
  10. data/lib/arjdbc/jdbc/adapter.rb +5 -2
  11. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  12. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  13. data/lib/arjdbc/jdbc/connection.rb +5 -1
  14. data/lib/arjdbc/jdbc/missing_functionality_helper.rb +1 -0
  15. data/lib/arjdbc/mssql/adapter.rb +31 -28
  16. data/lib/arjdbc/mssql/lock_helpers.rb +72 -0
  17. data/lib/arjdbc/mysql/adapter.rb +110 -45
  18. data/lib/arjdbc/oracle/adapter.rb +7 -0
  19. data/lib/arjdbc/postgresql/adapter.rb +327 -153
  20. data/lib/arjdbc/sqlite3/adapter.rb +9 -4
  21. data/lib/arjdbc/version.rb +1 -1
  22. data/rakelib/db.rake +17 -5
  23. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +14 -4
  24. data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +25 -0
  25. data/test/db/jdbc.rb +4 -3
  26. data/test/db2_reset_column_information_test.rb +8 -0
  27. data/test/derby_reset_column_information_test.rb +8 -0
  28. data/test/derby_row_locking_test.rb +9 -0
  29. data/test/derby_simple_test.rb +40 -0
  30. data/test/h2_simple_test.rb +2 -2
  31. data/test/helper.rb +15 -2
  32. data/test/jdbc_common.rb +1 -0
  33. data/test/jndi_callbacks_test.rb +5 -9
  34. data/test/manualTestDatabase.rb +31 -31
  35. data/test/models/validates_uniqueness_of_string.rb +1 -1
  36. data/test/mssql_ignore_system_views_test.rb +27 -0
  37. data/test/mssql_null_test.rb +14 -0
  38. data/test/mssql_reset_column_information_test.rb +8 -0
  39. data/test/mssql_row_locking_sql_test.rb +159 -0
  40. data/test/mssql_row_locking_test.rb +9 -0
  41. data/test/mysql_reset_column_information_test.rb +8 -0
  42. data/test/mysql_simple_test.rb +69 -5
  43. data/test/oracle_reset_column_information_test.rb +8 -0
  44. data/test/oracle_specific_test.rb +1 -1
  45. data/test/postgres_nonseq_pkey_test.rb +1 -1
  46. data/test/postgres_reset_column_information_test.rb +8 -0
  47. data/test/postgres_simple_test.rb +72 -1
  48. data/test/row_locking.rb +90 -0
  49. data/test/simple.rb +82 -2
  50. data/test/sqlite3_reset_column_information_test.rb +8 -0
  51. data/test/sqlite3_simple_test.rb +47 -0
  52. data/test/sybase_reset_column_information_test.rb +8 -0
  53. metadata +33 -3
@@ -0,0 +1,90 @@
1
+ #! /usr/bin/env jruby
2
+
3
+ require 'thread'
4
+
5
+ module RowLockingTestMethods
6
+
7
+ def test_row_locking
8
+ row_locking_test_template
9
+ end
10
+
11
+ def test_row_locking_with_limit
12
+ row_locking_test_template(:limit => 1)
13
+ end
14
+
15
+ private
16
+
17
+ def row_locking_test_template(options={})
18
+ # Create two rows that we will work with
19
+ @row1_id = Entry.create!(:title => "row1").id
20
+ @row2_id = Entry.create!(:title => "row2").id
21
+
22
+ @result_queue = Queue.new
23
+ signal_queue = Queue.new
24
+ t1 = Thread.new { thread_helper { thread1_main(signal_queue, options) } }
25
+ t2 = Thread.new { thread_helper { thread2_main(signal_queue, options) } }
26
+ t1.join
27
+ t2.join
28
+
29
+ result = []
30
+ result << @result_queue.shift until @result_queue.empty? # Convert the queue into an array
31
+
32
+ expected = [
33
+ :t1_locking_row2,
34
+ :t1_locked_row2,
35
+
36
+ :t2_locking_row1,
37
+ :t2_locked_row1,
38
+
39
+ :t2_locking_row2, # thread 2 tries to lock row2 ...
40
+ :t1_committed,
41
+ :t2_locked_row2, # ... but it doesn't succeed until after thread 1 commits its transaction
42
+
43
+ :t2_committed,
44
+ ]
45
+
46
+ assert_equal expected, result, "thread2 should lock row1 immediately but wait for thread1 to commit before getting the lock on row2"
47
+ end
48
+
49
+ def thread1_main(signal_queue, options={})
50
+ Entry.transaction do
51
+ @result_queue << :t1_locking_row2
52
+ Entry.find(@row2_id, {:lock=>true}.merge(options)) # acquire a row lock on r2
53
+ @result_queue << :t1_locked_row2
54
+ signal_queue << :go # signal thread2 to start
55
+ sleep 2.0 # Wait for a few seconds, to allow the other thread to race with this thread.
56
+ @result_queue << :t1_committed
57
+ end
58
+ end
59
+
60
+ def thread2_main(signal_queue, options={})
61
+ Entry.transaction do
62
+ signal_queue.shift # wait until we get the signal from thread1
63
+ @result_queue << :t2_locking_row1
64
+ Entry.find(@row1_id, {:lock=>true}.merge(options)) # should return immediately
65
+ @result_queue << :t2_locked_row1
66
+ @result_queue << :t2_locking_row2
67
+ Entry.find(@row2_id, {:lock=>true}.merge(options)) # should block until thread1 commits its transaction
68
+ @result_queue << :t2_locked_row2
69
+ @result_queue << :t2_committed
70
+ end
71
+ end
72
+
73
+ def thread_helper
74
+ yield
75
+ rescue Exception => exc
76
+ # Output backtrace, since otherwise we won't see anything until the main thread joins this thread.
77
+ display_exception(exc)
78
+ raise
79
+ ensure
80
+ # This is needed. Otherwise, the database connections aren't returned to the pool and things break.
81
+ ActiveRecord::Base.connection_handler.clear_active_connections!
82
+ end
83
+
84
+ def display_exception(exception)
85
+ lines = []
86
+ lines << "#{exception.class.name}: #{exception.message}\n"
87
+ lines += exception.backtrace.map{|line| "\tfrom #{line}"}
88
+ $stderr.puts lines.join("\n")
89
+ end
90
+ end
@@ -98,6 +98,14 @@ end
98
98
  module SimpleTestMethods
99
99
  include FixtureSetup
100
100
 
101
+ def test_substitute_binds_has_no_side_effect_on_binds_parameter
102
+ binds = [[Entry.columns_hash['title'], 'test1']]
103
+ binds2 = binds.dup
104
+ sql = 'select * from entries where title = ?'
105
+ Entry.connection.substitute_binds(sql, binds)
106
+ assert_equal binds2, binds
107
+ end
108
+
101
109
  def test_entries_created
102
110
  assert ActiveRecord::Base.connection.tables.find{|t| t =~ /^entries$/i}, "entries not created"
103
111
  end
@@ -358,6 +366,19 @@ module SimpleTestMethods
358
366
  end
359
367
  end
360
368
 
369
+ def test_remove_nonexistent_index
370
+ assert_raise(ArgumentError, ActiveRecord::StatementInvalid, ActiveRecord::JDBCError) do
371
+ @connection.remove_index :entries, :nonexistent_index
372
+ end
373
+ end
374
+
375
+ def test_add_index_with_invalid_name_length
376
+ index_name = 'x' * (@connection.index_name_length + 1)
377
+ assert_raise(ArgumentError) do
378
+ @connection.add_index "entries", "title", :name => index_name
379
+ end
380
+ end
381
+
361
382
  def test_dumping_schema
362
383
  require 'active_record/schema_dumper'
363
384
  @connection.add_index :entries, :title
@@ -410,9 +431,9 @@ module SimpleTestMethods
410
431
 
411
432
  class Animal < ActiveRecord::Base; end
412
433
 
413
- # ENEBO: Is this really ar-jdbc-specific or a bug in our adapter?
414
434
  def test_fetching_columns_for_nonexistent_table_should_raise
415
- assert_raises(ActiveRecord::JDBCError) do
435
+ assert_raises(ActiveRecord::ActiveRecordError,
436
+ ActiveRecord::StatementInvalid, ActiveRecord::JDBCError) do
416
437
  Animal.columns
417
438
  end
418
439
  end
@@ -629,9 +650,68 @@ module ActiveRecord3TestMethods
629
650
  end
630
651
 
631
652
  module Tests
653
+ if ActiveRecord::VERSION::MINOR == 2
654
+ def test_visitor_accessor
655
+ adapter = Entry.connection
656
+ expected_visitors = adapter.config[:adapter_spec].
657
+ arel2_visitors(adapter).values
658
+ assert !adapter.visitor.nil?
659
+ assert expected_visitors.include?(adapter.visitor.class)
660
+ end
661
+ end
662
+
632
663
  def test_where
633
664
  entries = Entry.where(:title => @entry.title)
634
665
  assert_equal @entry, entries.first
635
666
  end
636
667
  end
637
668
  end
669
+
670
+ module ResetColumnInformationTestMethods
671
+ class Fhqwhgad < ActiveRecord::Base
672
+ end
673
+
674
+ def test_reset_column_information
675
+ drop_fhqwhgads_table!
676
+ create_fhqwhgads_table_1!
677
+ Fhqwhgad.reset_column_information
678
+ assert_equal ["id", "come_on"].sort, Fhqwhgad.columns.map{|c| c.name}.sort, "columns should be correct the first time"
679
+
680
+ drop_fhqwhgads_table!
681
+ create_fhqwhgads_table_2!
682
+ Fhqwhgad.reset_column_information
683
+ assert_equal ["id", "to_the_limit"].sort, Fhqwhgad.columns.map{|c| c.name}.sort, "columns should be correct the second time"
684
+ ensure
685
+ drop_fhqwhgads_table!
686
+ end
687
+
688
+ private
689
+
690
+ def drop_fhqwhgads_table!
691
+ ActiveRecord::Schema.define do
692
+ suppress_messages do
693
+ drop_table :fhqwhgads if table_exists? :fhqwhgads
694
+ end
695
+ end
696
+ end
697
+
698
+ def create_fhqwhgads_table_1!
699
+ ActiveRecord::Schema.define do
700
+ suppress_messages do
701
+ create_table :fhqwhgads do |t|
702
+ t.string :come_on
703
+ end
704
+ end
705
+ end
706
+ end
707
+
708
+ def create_fhqwhgads_table_2!
709
+ ActiveRecord::Schema.define do
710
+ suppress_messages do
711
+ create_table :fhqwhgads do |t|
712
+ t.string :to_the_limit, :null=>false, :default=>'everybody'
713
+ end
714
+ end
715
+ end
716
+ end
717
+ end
@@ -0,0 +1,8 @@
1
+ #! /usr/bin/env jruby
2
+
3
+ require 'jdbc_common'
4
+ require 'db/sqlite3'
5
+
6
+ class Sqlite3ResetColumnInformationTest < Test::Unit::TestCase
7
+ include ResetColumnInformationTestMethods
8
+ end
@@ -189,6 +189,53 @@ class SQLite3SimpleTest < Test::Unit::TestCase
189
189
  assert_equal col.type, :integer
190
190
  end
191
191
 
192
+ def test_change_column_with_new_precision_and_scale
193
+ Entry.delete_all
194
+ Entry.
195
+ connection.
196
+ change_column "entries", "rating", :decimal, :precision => 9, :scale => 7
197
+ Entry.reset_column_information
198
+ change_column = Entry.columns_hash["rating"]
199
+ assert_equal 9, change_column.precision
200
+ assert_equal 7, change_column.scale
201
+ end
202
+
203
+ def test_change_column_preserve_other_column_precision_and_scale
204
+ Entry.delete_all
205
+ Entry.
206
+ connection.
207
+ change_column "entries", "rating", :decimal, :precision => 9, :scale => 7
208
+ Entry.reset_column_information
209
+
210
+ rating_column = Entry.columns_hash["rating"]
211
+ assert_equal 9, rating_column.precision
212
+ assert_equal 7, rating_column.scale
213
+
214
+ Entry.
215
+ connection.
216
+ change_column "entries", "title", :string, :null => false
217
+ Entry.reset_column_information
218
+
219
+ rating_column = Entry.columns_hash["rating"]
220
+ assert_equal 9, rating_column.precision
221
+ assert_equal 7, rating_column.scale
222
+ end
223
+
224
+ def test_create_xml_column
225
+ assert_nothing_raised do
226
+ @connection.create_table :xml_testings do |t|
227
+ t.xml :xml_test
228
+ end
229
+ end
230
+
231
+ xml_test = @connection.columns(:xml_testings).detect do |c|
232
+ c.name == "xml_test"
233
+ end
234
+
235
+ assert_equal "text", xml_test.sql_type
236
+ ensure
237
+ @connection.drop_table :xml_testings rescue nil
238
+ end
192
239
  end
193
240
 
194
241
  # assert_raise ActiveRecord::RecordInvalid do
@@ -0,0 +1,8 @@
1
+ #! /usr/bin/env jruby
2
+
3
+ require 'jdbc_common'
4
+ require 'db/sybase'
5
+
6
+ class SybaseResetColumnInformationTest < Test::Unit::TestCase
7
+ include ResetColumnInformationTestMethods
8
+ end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.2.1
5
+ version: 1.2.2
6
6
  platform: ruby
7
7
  authors:
8
8
  - Nick Sieger, Ola Bini and JRuby contributors
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-11-23 00:00:00 Z
13
+ date: 2012-01-28 00:00:00 Z
14
14
  dependencies: []
15
15
 
16
16
  description: |-
@@ -89,6 +89,7 @@ files:
89
89
  - lib/arjdbc/jdbc.rb
90
90
  - lib/arjdbc/jdbc/adapter.rb
91
91
  - lib/arjdbc/jdbc/adapter_java.jar
92
+ - lib/arjdbc/jdbc/base_ext.rb
92
93
  - lib/arjdbc/jdbc/callbacks.rb
93
94
  - lib/arjdbc/jdbc/column.rb
94
95
  - lib/arjdbc/jdbc/compatibility.rb
@@ -112,6 +113,7 @@ files:
112
113
  - lib/arjdbc/mssql/adapter.rb
113
114
  - lib/arjdbc/mssql/connection_methods.rb
114
115
  - lib/arjdbc/mssql/limit_helpers.rb
116
+ - lib/arjdbc/mssql/lock_helpers.rb
115
117
  - lib/arjdbc/mssql/tsql_helper.rb
116
118
  - lib/arjdbc/mysql.rb
117
119
  - lib/arjdbc/mysql/adapter.rb
@@ -175,9 +177,12 @@ files:
175
177
  - test/db/oracle.rb
176
178
  - test/db/postgres.rb
177
179
  - test/db/sqlite3.rb
180
+ - test/db2_reset_column_information_test.rb
178
181
  - test/db2_simple_test.rb
179
182
  - test/derby_migration_test.rb
180
183
  - test/derby_multibyte_test.rb
184
+ - test/derby_reset_column_information_test.rb
185
+ - test/derby_row_locking_test.rb
181
186
  - test/derby_simple_test.rb
182
187
  - test/generic_jdbc_connection_test.rb
183
188
  - test/h2_change_column_test.rb
@@ -201,16 +206,23 @@ files:
201
206
  - test/models/validates_uniqueness_of_string.rb
202
207
  - test/mssql_db_create_test.rb
203
208
  - test/mssql_identity_insert_test.rb
209
+ - test/mssql_ignore_system_views_test.rb
204
210
  - test/mssql_legacy_types_test.rb
205
211
  - test/mssql_limit_offset_test.rb
206
212
  - test/mssql_multibyte_test.rb
213
+ - test/mssql_null_test.rb
214
+ - test/mssql_reset_column_information_test.rb
215
+ - test/mssql_row_locking_sql_test.rb
216
+ - test/mssql_row_locking_test.rb
207
217
  - test/mssql_simple_test.rb
208
218
  - test/mysql_db_create_test.rb
209
219
  - test/mysql_index_length_test.rb
210
220
  - test/mysql_info_test.rb
211
221
  - test/mysql_multibyte_test.rb
212
222
  - test/mysql_nonstandard_primary_key_test.rb
223
+ - test/mysql_reset_column_information_test.rb
213
224
  - test/mysql_simple_test.rb
225
+ - test/oracle_reset_column_information_test.rb
214
226
  - test/oracle_simple_test.rb
215
227
  - test/oracle_specific_test.rb
216
228
  - test/postgres_db_create_test.rb
@@ -220,13 +232,17 @@ files:
220
232
  - test/postgres_native_type_mapping_test.rb
221
233
  - test/postgres_nonseq_pkey_test.rb
222
234
  - test/postgres_reserved_test.rb
235
+ - test/postgres_reset_column_information_test.rb
223
236
  - test/postgres_schema_search_path_test.rb
224
237
  - test/postgres_simple_test.rb
225
238
  - test/postgres_table_alias_length_test.rb
226
239
  - test/postgres_type_conversion_test.rb
240
+ - test/row_locking.rb
227
241
  - test/simple.rb
242
+ - test/sqlite3_reset_column_information_test.rb
228
243
  - test/sqlite3_simple_test.rb
229
244
  - test/sybase_jtds_simple_test.rb
245
+ - test/sybase_reset_column_information_test.rb
230
246
  homepage: https://github.com/jruby/activerecord-jdbc-adapter
231
247
  licenses: []
232
248
 
@@ -257,7 +273,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
257
273
  requirements: []
258
274
 
259
275
  rubyforge_project: jruby-extras
260
- rubygems_version: 1.8.9
276
+ rubygems_version: 1.8.15
261
277
  signing_key:
262
278
  specification_version: 3
263
279
  summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
@@ -280,9 +296,12 @@ test_files:
280
296
  - test/db/oracle.rb
281
297
  - test/db/postgres.rb
282
298
  - test/db/sqlite3.rb
299
+ - test/db2_reset_column_information_test.rb
283
300
  - test/db2_simple_test.rb
284
301
  - test/derby_migration_test.rb
285
302
  - test/derby_multibyte_test.rb
303
+ - test/derby_reset_column_information_test.rb
304
+ - test/derby_row_locking_test.rb
286
305
  - test/derby_simple_test.rb
287
306
  - test/generic_jdbc_connection_test.rb
288
307
  - test/h2_change_column_test.rb
@@ -306,16 +325,23 @@ test_files:
306
325
  - test/models/validates_uniqueness_of_string.rb
307
326
  - test/mssql_db_create_test.rb
308
327
  - test/mssql_identity_insert_test.rb
328
+ - test/mssql_ignore_system_views_test.rb
309
329
  - test/mssql_legacy_types_test.rb
310
330
  - test/mssql_limit_offset_test.rb
311
331
  - test/mssql_multibyte_test.rb
332
+ - test/mssql_null_test.rb
333
+ - test/mssql_reset_column_information_test.rb
334
+ - test/mssql_row_locking_sql_test.rb
335
+ - test/mssql_row_locking_test.rb
312
336
  - test/mssql_simple_test.rb
313
337
  - test/mysql_db_create_test.rb
314
338
  - test/mysql_index_length_test.rb
315
339
  - test/mysql_info_test.rb
316
340
  - test/mysql_multibyte_test.rb
317
341
  - test/mysql_nonstandard_primary_key_test.rb
342
+ - test/mysql_reset_column_information_test.rb
318
343
  - test/mysql_simple_test.rb
344
+ - test/oracle_reset_column_information_test.rb
319
345
  - test/oracle_simple_test.rb
320
346
  - test/oracle_specific_test.rb
321
347
  - test/postgres_db_create_test.rb
@@ -325,10 +351,14 @@ test_files:
325
351
  - test/postgres_native_type_mapping_test.rb
326
352
  - test/postgres_nonseq_pkey_test.rb
327
353
  - test/postgres_reserved_test.rb
354
+ - test/postgres_reset_column_information_test.rb
328
355
  - test/postgres_schema_search_path_test.rb
329
356
  - test/postgres_simple_test.rb
330
357
  - test/postgres_table_alias_length_test.rb
331
358
  - test/postgres_type_conversion_test.rb
359
+ - test/row_locking.rb
332
360
  - test/simple.rb
361
+ - test/sqlite3_reset_column_information_test.rb
333
362
  - test/sqlite3_simple_test.rb
334
363
  - test/sybase_jtds_simple_test.rb
364
+ - test/sybase_reset_column_information_test.rb