activerecord-bogacs 0.4.0 → 0.4.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1f7c9f5688cb27fb4c84bea3a516d1d2d014fb1c
4
- data.tar.gz: 17a6269479cb432bda7d027c0d89586c6cecaa19
3
+ metadata.gz: b0aec44c1b08bd47f913dcce2eba41e1d30b1fa0
4
+ data.tar.gz: a506eb318972490b316604732aded93e5079e5d7
5
5
  SHA512:
6
- metadata.gz: 1ad54c3ab7af8f4edbc2fea17cba7f1d32d784d4107ba8fe186e58fed676dd30f61b91bef610d3912b9f0bc1022286b39366b8b605228ba9e2c38939f155910b
7
- data.tar.gz: 8dffdfc6857d604ab66931b0a30eca0d6e5b5d9fd148ec1dcb73721dd29cf338de3744730974581cb4f624e1cf402e2c1790357201310904e8cdef8787be7d54
6
+ metadata.gz: dc20088b6faeba8de52781af835d3cc078017bfcb7139b14e96d9f503fc3019340bbbe5fc0ae1ce8a000fb42a620a1fc3fda114b2dbe057f36d5e974ed892b28
7
+ data.tar.gz: 4600c5ed962dfb2682cc9f5911292442ac90951af19c3511d069b97175a5114f4c4f05de46bbfad25f5ed821c44388946b6336b84c4b636f08b498f57fae68b7
@@ -22,7 +22,7 @@ script:
22
22
  env:
23
23
  - JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.3.12"
24
24
  - JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=postgresql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.3.2-java6"
25
- - JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.0.1-java6"
25
+ - JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.11" HIKARI_VERSION="2.0.1-java6"
26
26
  - JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=postgresql AR_VERSION="~> 3.2.18" HIKARI_VERSION="1.4.0"
27
27
  - JRUBY_OPTS="--1.8 $JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 3.2.18" HIKARI_VERSION="2.2.5-java6"
28
28
  matrix:
@@ -36,15 +36,28 @@ matrix:
36
36
  env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=postgresql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.3.2-java6"
37
37
  jdk: oraclejdk8
38
38
  - rvm: jruby-1.7.22
39
- env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.0.1-java6"
39
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.13" HIKARI_VERSION="2.0.1-java6"
40
40
  jdk: oraclejdk8
41
41
  - rvm: jruby-1.7.22
42
42
  env: JRUBY_OPTS="--1.8 $JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 3.2.18" HIKARI_VERSION="2.2.5-java6"
43
43
  jdk: oraclejdk8
44
44
  include:
45
45
  - rvm: jruby-9.0.1.0
46
- env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.9" HIKARI_VERSION="2.2.5-java6"
46
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.13" HIKARI_VERSION="2.2.5-java6"
47
47
  jdk: oraclejdk7
48
48
  - rvm: jruby-9.0.1.0
49
49
  env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 3.2.18" HIKARI_VERSION="2.3.9"
50
- jdk: oraclejdk8
50
+ jdk: oraclejdk8
51
+ # AR 4.2
52
+ - rvm: jruby-1.7.22
53
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.1.13" HIKARI_VERSION="2.2.5-java6"
54
+ jdk: oraclejdk7
55
+ - rvm: jruby-9.0.1.0
56
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=mysql AR_VERSION="~> 4.2.4" HIKARI_VERSION="2.3.12"
57
+ jdk: oraclejdk8
58
+ - rvm: jruby-1.7.22
59
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=postgresql AR_VERSION="~> 4.2.4" HIKARI_VERSION="2.2.5-java6"
60
+ jdk: oraclejdk8
61
+ - rvm: jruby-9.0.1.0
62
+ env: JRUBY_OPTS="$JRUBY_OPTS" AR_ADAPTER=postgresql AR_VERSION="~> 4.1.13" HIKARI_VERSION="2.3.12"
63
+ jdk: oraclejdk7
@@ -33,14 +33,16 @@ module ActiveRecord
33
33
  # There are several connection-pooling-related options that you can add to
34
34
  # your database connection configuration:
35
35
  #
36
- # * +pool+: number indicating size of connection pool (default 5)
37
- # * +checkout_timeout+: number of seconds to block and wait for a connection
36
+ # * **pool**: number indicating size of connection pool (default 5)
37
+ # * **checkout_timeout**: number of seconds to block and wait for a connection
38
38
  # before giving up and raising a timeout error (default 5 seconds).
39
- # * +reaping_frequency+: frequency in seconds to periodically run the
40
- # Reaper, which attempts to find and close dead connections, which can
41
- # occur if a programmer forgets to close a connection at the end of a
42
- # thread or a thread dies unexpectedly. (Default nil, which means don't
43
- # run the Reaper - reaping will still happen occasionally).
39
+ # * **pool_initial**: number of connections to pre-initialize when the pool
40
+ # is created (default 0).
41
+ # * **reaping_frequency**: frequency in seconds to periodically run a reaper,
42
+ # which attempts to find and close "dead" connections (can occur if a caller
43
+ # forgets to close a connection at the end of a thread or a thread dies unexpectedly)
44
+ # Default is `nil`, which means don't run the periodical Reaper at all (reaping
45
+ # will still happen occasionally).
44
46
  class DefaultPool
45
47
  # Threadsafe, fair, FIFO queue. Meant to be used by ConnectionPool
46
48
  # with which it shares a Monitor. But could be a generic Queue.
@@ -158,7 +160,7 @@ module ActiveRecord
158
160
 
159
161
  yield if block_given?
160
162
 
161
- loop do
163
+ while true
162
164
  @cond.wait(timeout - elapsed)
163
165
 
164
166
  return remove if any?
@@ -227,8 +229,8 @@ module ActiveRecord
227
229
  if spec.config[:pool]
228
230
  @size = spec.config[:pool].to_i
229
231
  else
230
- if defined? Rails.env && Rails.env.production?
231
- logger && logger.debug("pool: option not set, using a default = 5")
232
+ if defined? Rails.env && ( (! Rails.env.development? && ! Rails.env.test?) rescue nil )
233
+ logger && logger.debug("pool: option not set, using default size: 5")
232
234
  end
233
235
  @size = 5
234
236
  end
@@ -253,6 +255,8 @@ module ActiveRecord
253
255
  #
254
256
  # #connection can be called any number of times; the connection is
255
257
  # held in a hash keyed by the thread id.
258
+ #
259
+ # @return [ActiveRecord::ConnectionAdapters::AbstractAdapter]
256
260
  def connection
257
261
  connection_id = current_connection_id
258
262
  unless conn = @reserved_connections.fetch(connection_id, nil)
@@ -264,6 +268,8 @@ module ActiveRecord
264
268
  end
265
269
 
266
270
  # Is there an open connection that is being used for the current thread?
271
+ #
272
+ # @return [true, false]
267
273
  def active_connection?
268
274
  connection_id = current_connection_id
269
275
  if conn = @reserved_connections.fetch(connection_id, nil)
@@ -286,6 +292,8 @@ module ActiveRecord
286
292
  # If a connection already exists yield it to the block. If no connection
287
293
  # exists checkout a connection, yield it to the block, and checkin the
288
294
  # connection when finished.
295
+ #
296
+ # @yield [ActiveRecord::ConnectionAdapters::AbstractAdapter]
289
297
  def with_connection
290
298
  connection_id = current_connection_id
291
299
  fresh_connection = true unless active_connection?
@@ -295,6 +303,8 @@ module ActiveRecord
295
303
  end
296
304
 
297
305
  # Returns true if a connection has already been opened.
306
+ #
307
+ # @return [true, false]
298
308
  def connected?
299
309
  @connections.size > 0 # synchronize { @connections.any? }
300
310
  end
@@ -344,6 +354,7 @@ module ActiveRecord
344
354
 
345
355
  # Return any checked-out connections back to the pool by threads that
346
356
  # are no longer alive.
357
+ # @private AR 3.2 compatibility
347
358
  def clear_stale_cached_connections!
348
359
  keys = Thread.list.find_all { |t| t.alive? }.map(&:object_id)
349
360
  keys = @reserved_connections.keys - keys
@@ -354,60 +365,58 @@ module ActiveRecord
354
365
  end
355
366
  end if ActiveRecord::VERSION::MAJOR < 4
356
367
 
357
- # Check-out a database connection from the pool, indicating that you want
358
- # to use it. You should call #checkin when you no longer need this.
368
+ # Check-out a database connection from the pool, callers are expected to
369
+ # call #checkin when the connection is no longer needed, so that others
370
+ # can use it.
359
371
  #
360
372
  # This is done by either returning and leasing existing connection, or by
361
373
  # creating a new connection and leasing it.
362
374
  #
363
- # If all connections are leased and the pool is at capacity (meaning the
364
- # number of currently leased connections is greater than or equal to the
365
- # size limit set), an ActiveRecord::ConnectionTimeoutError exception will be raised.
366
- #
367
- # Returns: an AbstractAdapter object.
368
- #
369
- # Raises:
370
- # - ConnectionTimeoutError: no connection can be obtained from the pool.
375
+ # @return [ActiveRecord::ConnectionAdapters::AbstractAdapter]
376
+ # @raise [ActiveRecord::ConnectionTimeoutError] if all connections are leased
377
+ # and the pool is at capacity (meaning the number of currently leased
378
+ # connections is greater than or equal to the size limit set)
371
379
  def checkout
380
+ conn = nil
372
381
  synchronize do
373
382
  conn = acquire_connection
374
383
  conn.lease
375
- checkout_and_verify(conn)
376
384
  end
385
+ checkout_and_verify(conn)
377
386
  end
378
387
 
379
- # Check-in a database connection back into the pool, indicating that you
380
- # no longer need this connection.
388
+ # Check-in a database connection back into the pool.
381
389
  #
382
- # +conn+: an AbstractAdapter object, which was obtained by earlier by
383
- # calling +checkout+ on this pool.
390
+ # @param [ActiveRecord::ConnectionAdapters::AbstractAdapter] connection
391
+ # object, which was obtained earlier by calling #checkout on this pool
392
+ # @see #checkout
384
393
  def checkin(conn, released = nil)
385
394
  synchronize do
386
- conn.run_callbacks :checkin do
387
- conn.expire
388
- end
395
+ _run_checkin_callbacks(conn)
389
396
 
390
- release conn.owner unless released
397
+ release conn, conn.owner unless released
391
398
 
392
399
  @available.add conn
393
400
  end
394
401
  end
395
402
 
396
- # Remove a connection from the connection pool. The connection will
397
- # remain open and active but will no longer be managed by this pool.
403
+ # Remove a connection from the connection pool. The returned connection
404
+ # will remain open and active but will no longer be managed by this pool.
405
+ #
406
+ # @return [ActiveRecord::ConnectionAdapters::AbstractAdapter]
398
407
  def remove(conn)
399
408
  synchronize do
400
409
  @connections.delete conn
401
410
  @available.delete conn
402
411
 
403
- release conn.owner
412
+ release conn, conn.owner
404
413
 
405
414
  @available.add checkout_new_connection if @available.any_waiting?
406
415
  end
407
416
  end
408
417
 
409
418
  # Recover lost connections for the pool. A lost connection can occur if
410
- # a programmer forgets to checkin a connection at the end of a thread
419
+ # a caller forgets to #checkin a connection for a given thread when its done
411
420
  # or a thread dies unexpectedly.
412
421
  def reap
413
422
  stale_connections = synchronize do
@@ -449,25 +458,25 @@ module ActiveRecord
449
458
  end
450
459
  end
451
460
 
452
- def release(owner)
461
+ def release(conn, owner)
453
462
  thread_id = owner.object_id
454
- @reserved_connections.delete thread_id
463
+ if @reserved_connections[thread_id] == conn
464
+ @reserved_connections.delete thread_id
465
+ end
455
466
  end
456
467
 
457
468
  def checkout_new_connection
458
469
  raise ConnectionNotEstablished unless @automatic_reconnect
459
470
 
460
- c = new_connection
461
- c.pool = self
462
- @connections << c
463
- c
471
+ conn = new_connection
472
+ conn.pool = self
473
+ @connections << conn
474
+ conn
464
475
  end
465
476
 
466
- def checkout_and_verify(c)
467
- c.run_callbacks :checkout do
468
- c.verify!
469
- end
470
- c
477
+ def checkout_and_verify(conn)
478
+ _run_checkout_callbacks(conn)
479
+ conn
471
480
  end
472
481
 
473
482
  def prefill_initial_connections
@@ -481,189 +490,11 @@ module ActiveRecord
481
490
  conns
482
491
  end
483
492
 
484
- def logger
485
- ActiveRecord::Base.logger
486
- end
487
-
488
- end
489
-
490
- =begin
491
-
492
- # ConnectionHandler is a collection of ConnectionPool objects. It is used
493
- # for keeping separate connection pools for Active Record models that connect
494
- # to different databases.
495
- #
496
- # For example, suppose that you have 5 models, with the following hierarchy:
497
- #
498
- # |
499
- # +-- Book
500
- # | |
501
- # | +-- ScaryBook
502
- # | +-- GoodBook
503
- # +-- Author
504
- # +-- BankAccount
505
- #
506
- # Suppose that Book is to connect to a separate database (i.e. one other
507
- # than the default database). Then Book, ScaryBook and GoodBook will all use
508
- # the same connection pool. Likewise, Author and BankAccount will use the
509
- # same connection pool. However, the connection pool used by Author/BankAccount
510
- # is not the same as the one used by Book/ScaryBook/GoodBook.
511
- #
512
- # Normally there is only a single ConnectionHandler instance, accessible via
513
- # ActiveRecord::Base.connection_handler. Active Record models use this to
514
- # determine the connection pool that they should use.
515
- class ConnectionHandler
516
- def initialize
517
- # These caches are keyed by klass.name, NOT klass. Keying them by klass
518
- # alone would lead to memory leaks in development mode as all previous
519
- # instances of the class would stay in memory.
520
- @owner_to_pool = ThreadSafe::Cache.new(:initial_capacity => 2) do |h,k|
521
- h[k] = ThreadSafe::Cache.new(:initial_capacity => 2)
522
- end
523
- @class_to_pool = ThreadSafe::Cache.new(:initial_capacity => 2) do |h,k|
524
- h[k] = ThreadSafe::Cache.new
525
- end
526
- end
527
-
528
- def connection_pool_list
529
- owner_to_pool.values.compact
530
- end
531
-
532
- def connection_pools
533
- ActiveSupport::Deprecation.warn(
534
- "In the next release, this will return the same as #connection_pool_list. " \
535
- "(An array of pools, rather than a hash mapping specs to pools.)"
536
- )
537
- Hash[connection_pool_list.map { |pool| [pool.spec, pool] }]
538
- end
539
-
540
- def establish_connection(owner, spec)
541
- @class_to_pool.clear
542
- raise RuntimeError, "Anonymous class is not allowed." unless owner.name
543
- owner_to_pool[owner.name] = ConnectionAdapters::ConnectionPool.new(spec)
544
- end
545
-
546
- # Returns true if there are any active connections among the connection
547
- # pools that the ConnectionHandler is managing.
548
- def active_connections?
549
- connection_pool_list.any?(&:active_connection?)
550
- end
551
-
552
- # Returns any connections in use by the current thread back to the pool,
553
- # and also returns connections to the pool cached by threads that are no
554
- # longer alive.
555
- def clear_active_connections!
556
- connection_pool_list.each(&:release_connection)
557
- end
558
-
559
- # Clears the cache which maps classes.
560
- def clear_reloadable_connections!
561
- connection_pool_list.each(&:clear_reloadable_connections!)
562
- end
563
-
564
- def clear_all_connections!
565
- connection_pool_list.each(&:disconnect!)
566
- end
493
+ #@@logger = nil
494
+ def logger; ::ActiveRecord::Base.logger end
495
+ #def logger=(logger); @@logger = logger end
567
496
 
568
- # Locate the connection of the nearest super class. This can be an
569
- # active or defined connection: if it is the latter, it will be
570
- # opened and set as the active connection for the class it was defined
571
- # for (not necessarily the current class).
572
- def retrieve_connection(klass) #:nodoc:
573
- pool = retrieve_connection_pool(klass)
574
- (pool && pool.connection) or raise ConnectionNotEstablished
575
- end
576
-
577
- # Returns true if a connection that's accessible to this class has
578
- # already been opened.
579
- def connected?(klass)
580
- conn = retrieve_connection_pool(klass)
581
- conn && conn.connected?
582
- end
583
-
584
- # Remove the connection for this class. This will close the active
585
- # connection and the defined connection (if they exist). The result
586
- # can be used as an argument for establish_connection, for easily
587
- # re-establishing the connection.
588
- def remove_connection(owner)
589
- if pool = owner_to_pool.delete(owner.name)
590
- @class_to_pool.clear
591
- pool.automatic_reconnect = false
592
- pool.disconnect!
593
- pool.spec.config
594
- end
595
- end
596
-
597
- # Retrieving the connection pool happens a lot so we cache it in @class_to_pool.
598
- # This makes retrieving the connection pool O(1) once the process is warm.
599
- # When a connection is established or removed, we invalidate the cache.
600
- #
601
- # Ideally we would use #fetch here, as class_to_pool[klass] may sometimes be nil.
602
- # However, benchmarking (https://gist.github.com/jonleighton/3552829) showed that
603
- # #fetch is significantly slower than #[]. So in the nil case, no caching will
604
- # take place, but that's ok since the nil case is not the common one that we wish
605
- # to optimise for.
606
- def retrieve_connection_pool(klass)
607
- class_to_pool[klass.name] ||= begin
608
- until pool = pool_for(klass)
609
- klass = klass.superclass
610
- break unless klass <= Base
611
- end
612
-
613
- class_to_pool[klass.name] = pool
614
- end
615
- end
616
-
617
- private
618
-
619
- def owner_to_pool
620
- @owner_to_pool[Process.pid]
621
- end
622
-
623
- def class_to_pool
624
- @class_to_pool[Process.pid]
625
- end
626
-
627
- def pool_for(owner)
628
- owner_to_pool.fetch(owner.name) {
629
- if ancestor_pool = pool_from_any_process_for(owner)
630
- # A connection was established in an ancestor process that must have
631
- # subsequently forked. We can't reuse the connection, but we can copy
632
- # the specification and establish a new connection with it.
633
- establish_connection owner, ancestor_pool.spec
634
- else
635
- owner_to_pool[owner.name] = nil
636
- end
637
- }
638
- end
639
-
640
- def pool_from_any_process_for(owner)
641
- owner_to_pool = @owner_to_pool.values.find { |v| v[owner.name] }
642
- owner_to_pool && owner_to_pool[owner.name]
643
- end
644
497
  end
645
498
 
646
- class ConnectionManagement
647
- def initialize(app)
648
- @app = app
649
- end
650
-
651
- def call(env)
652
- testing = env.key?('rack.test')
653
-
654
- response = @app.call(env)
655
- response[2] = ::Rack::BodyProxy.new(response[2]) do
656
- ActiveRecord::Base.clear_active_connections! unless testing
657
- end
658
-
659
- response
660
- rescue Exception
661
- ActiveRecord::Base.clear_active_connections! unless testing
662
- raise
663
- end
664
- end
665
-
666
- =end
667
-
668
499
  end
669
500
  end
@@ -144,7 +144,7 @@ module ActiveRecord
144
144
  #synchronize do
145
145
  conn = checkout_new_connection # acquire_connection
146
146
  conn.lease
147
- conn.run_callbacks(:checkout) { conn.verify! } # checkout_and_verify(conn)
147
+ _run_checkout_callbacks(conn) # checkout_and_verify(conn)
148
148
  conn
149
149
  #end
150
150
  end
@@ -157,7 +157,7 @@ module ActiveRecord
157
157
  def checkin(conn, do_release = true)
158
158
  release(conn) if do_release
159
159
  #synchronize do
160
- conn.run_callbacks(:checkin) { conn.expire }
160
+ _run_checkin_callbacks(conn)
161
161
  #release conn
162
162
  #@available.add conn
163
163
  #end
@@ -36,6 +36,50 @@ module ActiveRecord
36
36
  end
37
37
  end if ActiveRecord::VERSION::MAJOR < 4
38
38
 
39
+ private
40
+
41
+ if ActiveRecord::VERSION::STRING > '4.2'
42
+
43
+ def _run_checkin_callbacks(conn)
44
+ if conn.respond_to?(:_run_checkin_callbacks)
45
+ conn._run_checkin_callbacks do
46
+ conn.expire
47
+ end
48
+ else
49
+ conn.run_callbacks :checkin do
50
+ conn.expire
51
+ end
52
+ end
53
+ end
54
+
55
+ def _run_checkout_callbacks(conn)
56
+ if conn.respond_to?(:_run_checkout_callbacks)
57
+ conn._run_checkout_callbacks do
58
+ conn.verify!
59
+ end
60
+ else
61
+ conn.run_callbacks :checkout do
62
+ conn.verify!
63
+ end
64
+ end
65
+ end
66
+
67
+ else
68
+
69
+ def _run_checkin_callbacks(conn)
70
+ conn.run_callbacks :checkin do
71
+ conn.expire
72
+ end
73
+ end
74
+
75
+ def _run_checkout_callbacks(conn)
76
+ conn.run_callbacks :checkout do
77
+ conn.verify!
78
+ end
79
+ end
80
+
81
+ end
82
+
39
83
  end
40
84
  end
41
85
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Bogacs
3
- VERSION = '0.4.0'
3
+ VERSION = '0.4.1'
4
4
  end
5
5
  end
@@ -29,6 +29,8 @@ module ActiveRecord
29
29
  assert_equal 0, @pool.connections.size
30
30
  end
31
31
 
32
+ def self.startup; puts "running with ActiveRecord: #{ActiveRecord::VERSION::STRING}" end
33
+
32
34
  end
33
35
  end
34
36
  end
@@ -12,8 +12,6 @@ module ActiveRecord
12
12
  # extend Bogacs::TestHelper
13
13
  extend Bogacs::JndiTestHelper
14
14
 
15
- @@data_source = nil
16
-
17
15
  def self.startup
18
16
  return if self == TestBase
19
17
 
@@ -25,7 +23,11 @@ module ActiveRecord
25
23
  def self.shutdown
26
24
  return if self == TestBase
27
25
 
28
- close_data_source
26
+ begin
27
+ close_data_source
28
+ ensure
29
+ @@data_source = nil
30
+ end
29
31
 
30
32
  ActiveRecord::Base.connection_pool.disconnect!
31
33
  ConnectionAdapters::ConnectionHandler.connection_pool_class = ConnectionAdapters::ConnectionPool
@@ -46,6 +48,8 @@ module ActiveRecord
46
48
  end
47
49
  end
48
50
 
51
+ @@data_source = nil
52
+
49
53
  def self.init_data_source
50
54
  setup_jdbc_context
51
55
  bind_data_source @@data_source = build_data_source(raw_config)
@@ -343,9 +347,6 @@ module ActiveRecord
343
347
  com.zaxxer.hikari.HikariDataSource.class_eval do
344
348
  field_reader :pool unless method_defined? :pool
345
349
  end
346
- com.zaxxer.hikari.pool.HikariPool.class_eval do
347
- field_reader :isShutdown unless method_defined? :isShutdown
348
- end
349
350
 
350
351
  data_source
351
352
  end
@@ -329,6 +329,52 @@ module ActiveRecord
329
329
  # assert_raises { handler.establish_connection anonymous, nil }
330
330
  #end
331
331
 
332
+ def test_pooled_connection_remove
333
+ # ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :checkout_timeout => 0.5}))
334
+ @pool.instance_variable_set(:@size, 2)
335
+ # old_connection = ActiveRecord::Base.connection
336
+ old_connection = @pool.connection
337
+ # extra_connection = ActiveRecord::Base.connection_pool.checkout
338
+ extra_connection = @pool.checkout
339
+ # ActiveRecord::Base.connection_pool.remove(extra_connection)
340
+ @pool.remove(extra_connection)
341
+ # assert_equal ActiveRecord::Base.connection, old_connection
342
+ assert_equal @pool.connection, old_connection
343
+ end
344
+
345
+ def test_pooled_connection_checkin_two
346
+ checkout_checkin_connections_loop 2, 3
347
+ assert_equal 3, @connection_count
348
+ assert_equal 0, @timed_out
349
+ # assert_equal 2, ActiveRecord::Base.connection_pool.connections.size
350
+ assert_equal 2, @pool.connections.size
351
+ end
352
+
353
+ protected
354
+
355
+ def checkout_checkin_connections_loop(pool_size, loops)
356
+ # ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
357
+ @pool.instance_variable_set(:@size, pool_size)
358
+ @pool.instance_variable_set(:@checkout_timeout, 0.5)
359
+
360
+ @connection_count = 0; @timed_out = 0
361
+ loops.times do
362
+ begin
363
+ # conn = ActiveRecord::Base.connection_pool.checkout
364
+ conn = @pool.checkout
365
+ # ActiveRecord::Base.connection_pool.checkin conn
366
+ @pool.checkin conn
367
+
368
+ @connection_count += 1
369
+
370
+ # ActiveRecord::Base.connection.tables
371
+ @pool.connection.tables
372
+ rescue ActiveRecord::ConnectionTimeoutError
373
+ @timed_out += 1
374
+ end
375
+ end
376
+ end
377
+
332
378
  private
333
379
 
334
380
  def active_connections(pool = self.pool)
@@ -349,7 +349,7 @@ module ActiveRecord
349
349
 
350
350
  if ar_jdbc_config[:properties]
351
351
  properties = java.util.Properties.new
352
- properties.putAll ar_jdbc_config[:properties]
352
+ ar_jdbc_config[:properties].each { |key, val| properties.put key.to_s, val.to_s }
353
353
  data_source.setProperties properties
354
354
  end
355
355
  # JDBC pool tunings (some mapped from AR configuration) :
@@ -371,7 +371,15 @@ module ActiveRecord
371
371
 
372
372
 
373
373
  def build_hikari_data_source(ar_jdbc_config = AR_CONFIG)
374
- Dir.glob('test/jars/{javassist,slf4j,HikariCP}*.jar').each { |jar| load jar }
374
+ unless hikari_jar = Dir.glob('test/jars/HikariCP*.jar').last
375
+ raise 'HikariCP jar not found in test/jars directory'
376
+ end
377
+ if ( version = File.basename(hikari_jar, '.jar').match(/\-([\w\.\-]$)/) ) && version[1] < '2.3.9'
378
+ Dir.glob('test/jars/{javassist,slf4j}*.jar').each { |jar| require jar }
379
+ else
380
+ Dir.glob('test/jars/{slf4j}*.jar').each { |jar| require jar }
381
+ end
382
+ require hikari_jar
375
383
 
376
384
  configure_hikari_data_source(ar_jdbc_config)
377
385
  end
@@ -400,7 +408,7 @@ module ActiveRecord
400
408
  hikari_config.setDataSourceClassName 'org.postgresql.ds.PGSimpleDataSource'
401
409
  hikari_config.addDataSourceProperty 'serverName', ar_jdbc_config[:host] || 'localhost'
402
410
  hikari_config.addDataSourceProperty 'databaseName', ar_jdbc_config[:database]
403
- hikari_config.addDataSourceProperty 'port', ar_jdbc_config[:port] if ar_jdbc_config[:port]
411
+ hikari_config.addDataSourceProperty 'portNumber', ar_jdbc_config[:port] if ar_jdbc_config[:port]
404
412
  if ar_jdbc_config[:username]
405
413
  hikari_config.addDataSourceProperty 'user', ar_jdbc_config[:username]
406
414
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-bogacs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karol Bucek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-22 00:00:00.000000000 Z
11
+ date: 2015-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby