acts_as_partitionable 0.0.2 → 0.0.3
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/lib/acts_as_partitionable.rb +21 -15
- data/lib/connection_pool.rb +49 -17
- metadata +2 -2
@@ -45,22 +45,28 @@ module Acts
|
|
45
45
|
raise ::ActiveRecord::ConfigurationError.new
|
46
46
|
end
|
47
47
|
end
|
48
|
-
|
49
|
-
partition_db_klass ||= eval <<-TOS
|
50
|
-
class #{self.name}Partitionable#{partition_name} < #{self.name}
|
51
|
-
# setting abstract_class to true so that ActiveRecord doesn't look
|
52
|
-
# for a db table for this base model class
|
53
|
-
self.abstract_class = true
|
54
|
-
def self.find_every(options)
|
55
|
-
(options ||= {})[:readonly] = true if #{partition_db_klass_readonly}
|
56
|
-
super(options)
|
57
|
-
end
|
58
|
-
def self.readonly?; #{partition_db_klass_readonly}; end
|
59
|
-
end
|
60
|
-
#{self.name}Partitionable#{partition_name}
|
61
|
-
TOS
|
62
|
-
partition_db_klass.establish_connection(db_config)
|
63
48
|
|
49
|
+
self_name = (self.name.include?('::') ? '' : '::') + self.name
|
50
|
+
partition_db_klass = ("#{self_name}Partitionable#{partition_name}".constantize rescue nil)
|
51
|
+
|
52
|
+
if partition_db_klass.nil?
|
53
|
+
partition_db_klass ||= eval <<-TOS
|
54
|
+
class #{self_name}Partitionable#{partition_name} < #{self_name}
|
55
|
+
# setting abstract_class to true so that ActiveRecord doesn't look
|
56
|
+
# for a db table for this base model class
|
57
|
+
self.abstract_class = true
|
58
|
+
def self.find_every(options)
|
59
|
+
(options ||= {})[:readonly] = true if #{partition_db_klass_readonly}
|
60
|
+
super(options)
|
61
|
+
end
|
62
|
+
def self.readonly?; #{partition_db_klass_readonly}; end
|
63
|
+
end
|
64
|
+
#{self_name}Partitionable#{partition_name}
|
65
|
+
TOS
|
66
|
+
|
67
|
+
partition_db_klass.establish_connection(db_config)
|
68
|
+
end
|
69
|
+
|
64
70
|
class_eval <<-PART_PROC_END
|
65
71
|
def self.#{partition_name}(&block)
|
66
72
|
return #{partition_db_klass}.module_eval(&block) if block_given?
|
data/lib/connection_pool.rb
CHANGED
@@ -1,20 +1,24 @@
|
|
1
1
|
# CONFIDENTIAL AND PROPRIETARY. © 2007 Revolution Health Group LLC. All rights reserved.
|
2
|
+
|
2
3
|
module ActiveRecord
|
3
4
|
class Base
|
4
5
|
class << self
|
5
6
|
alias_method :no_cp_remove_connection, :remove_connection
|
6
7
|
alias_method :no_cp_establish_connection, :establish_connection
|
8
|
+
alias_method :no_cp_clear_active_connections!, :clear_active_connections!
|
7
9
|
|
8
10
|
@@pooled_connections ||= {}
|
9
11
|
def pooled_connections
|
10
12
|
@@pooled_connections[Thread.current.object_id] ||= {}
|
11
13
|
end
|
12
14
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
def clear_active_connections!
|
16
|
+
active_connections.each do |name, conn|
|
17
|
+
conn_key = nil
|
18
|
+
pooled_connections.each { |key, value| conn_key = key if value != nil && value[:connection] == conn }
|
19
|
+
pooled_connections.delete(conn_key) if not conn_key.nil?
|
17
20
|
end
|
21
|
+
no_cp_clear_active_connections!
|
18
22
|
end
|
19
23
|
|
20
24
|
def remove_connection(klass=self)
|
@@ -34,15 +38,38 @@ module ActiveRecord
|
|
34
38
|
no_cp_remove_connection(klass)
|
35
39
|
end # remove_connection
|
36
40
|
|
37
|
-
def establish_connection(spec = nil)
|
38
|
-
if spec != nil and spec.kind_of?(ActiveRecord::Base::ConnectionSpecification)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
41
|
+
def establish_connection(spec = nil)
|
42
|
+
pool_connection(spec) if spec != nil and spec.kind_of?(ActiveRecord::Base::ConnectionSpecification)
|
43
|
+
no_cp_establish_connection(spec)
|
44
|
+
end # establish_connection
|
45
|
+
|
46
|
+
|
47
|
+
# closing all is pretty final, you don't want to do this unless you are really all done
|
48
|
+
def close_all_connections
|
49
|
+
ar_konn = nil
|
50
|
+
pooled_connections.each do | key, value |
|
51
|
+
pooled_connections.delete(key)
|
52
|
+
active_connections.select do |klass, konn|
|
53
|
+
if konn == value[:connection]
|
54
|
+
result = no_cp_remove_connection(klass.constantize)
|
55
|
+
ar_konn = result if klass.constantize == ActiveRecord::Base
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
ar_konn
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
def pool_connection(spec)
|
64
|
+
@partitionable_adapter_methods ||= []
|
65
|
+
|
66
|
+
if not @partitionable_adapter_methods.include?(spec.adapter_method.to_s)
|
67
|
+
@partitionable_adapter_methods << (spec.adapter_method.to_s)
|
68
|
+
|
69
|
+
if not ActiveRecord::Base.methods.include?("ar_#{spec.adapter_method}")
|
70
|
+
ActiveRecord::Base.class_eval <<-REUSE_END
|
44
71
|
class << self
|
45
|
-
alias_method :ar_#{spec.adapter_method}, :#{spec.adapter_method}
|
72
|
+
alias_method :ar_#{spec.adapter_method}, :#{spec.adapter_method}
|
46
73
|
end
|
47
74
|
def self.#{spec.adapter_method}(config)
|
48
75
|
conn_key = config.to_s
|
@@ -54,11 +81,16 @@ module ActiveRecord
|
|
54
81
|
pooled_connections[conn_key][:connection] rescue nil
|
55
82
|
end
|
56
83
|
REUSE_END
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
|
84
|
+
end # if not method included
|
85
|
+
end # if not adapter included
|
86
|
+
end # pool_connection
|
87
|
+
|
88
|
+
|
89
|
+
def reset_ref_counts
|
90
|
+
ActiveRecord::Base.pooled_connections.each {| key, value | value[:count] = 1 }
|
91
|
+
end # reset_ref_counts
|
92
|
+
|
93
|
+
end # self
|
62
94
|
end # Pool
|
63
95
|
end # Connection
|
64
96
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: acts_as_partitionable
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-04-
|
6
|
+
version: 0.0.3
|
7
|
+
date: 2007-04-24 00:00:00 -04:00
|
8
8
|
summary: acts_as_partitionable allows one to use multiple DBs to partition data for models
|
9
9
|
require_paths:
|
10
10
|
- lib
|