db-charmer 1.5.3 → 1.5.4

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/CHANGES CHANGED
@@ -1,3 +1,11 @@
1
+ 1.5.3 -> 1.5.4:
2
+
3
+ Added DbCharmer.with_remapped_databases, so that you can change the connection for
4
+ many models simultaneously, and implicitly. Very useful for work where you want to use
5
+ a particular slave for a whole range of database access.
6
+
7
+ ----------------------------------------------------------------------------------------
8
+
1
9
  1.5.1 -> 1.5.3:
2
10
 
3
11
  Few changes:
@@ -232,6 +232,29 @@ and HABTM associations connection switching:
232
232
  @user.on_slave.posts
233
233
 
234
234
 
235
+ === Bulk Connection Management
236
+
237
+ Sometimes you want to run code where a large number of tables may be used, and you'd like
238
+ them all to use an alternate database. You can now do this:
239
+
240
+ DbCharmer.with_remapped_databases(:logs => :big_logs_slave) { ... }
241
+
242
+ Any model whose default database is +:logs+ (e.g., <tt>db_charmer :connection => :logs</tt>)
243
+ will now have its connection switched to +:big_logs_slave+ in that block. This is lower
244
+ precedence than any other +DbCharmer+ method, so <tt>Model.on_db(:foo).find(...)</tt> and
245
+ such things will still use the database they specify, not the one that model was remapped
246
+ to.
247
+
248
+ You can specify any number of remappings at once, and you can also use +:master+ as a database
249
+ name that matches any model that has not had its connection set by +DbCharmer+ at all.
250
+
251
+ *Note*: +DbCharmer+ works via +alias_method_chain+ in model classes. It is very careful
252
+ to only patch the models it needs to. However, if you use +with_remapped_databases+ and
253
+ remap the default database (+:master+), then it has no choice but to patch all subclasses
254
+ of +ActiveRecord::Base+. This should not cause any serious problems or any big performance
255
+ impact, but it is worth noting.
256
+
257
+
235
258
  === Named Scopes Support
236
259
 
237
260
  To make it easier for +DbCharmer+ users to use connections switching methods with named scopes,
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.3
1
+ 1.5.4
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{db-charmer}
8
- s.version = "1.5.3"
8
+ s.version = "1.5.4"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alexey Kovyrin"]
12
- s.date = %q{2010-03-10}
12
+ s.date = %q{2010-03-12}
13
13
  s.description = %q{ActiveRecord Connections Magic (slaves, multiple connections, etc)}
14
14
  s.email = %q{alexey@kovyrin.net}
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,37 @@ module DbCharmer
19
19
  return Rails.logger if defined?(Rails)
20
20
  @logger ||= Logger.new(STDERR)
21
21
  end
22
+
23
+ def self.with_remapped_databases(mappings, &proc)
24
+ old_mappings = ActiveRecord::Base.db_charmer_database_remappings
25
+ begin
26
+ ActiveRecord::Base.db_charmer_database_remappings = mappings
27
+ if mappings[:master] || mappings['master']
28
+ with_all_hijacked(&proc)
29
+ else
30
+ proc.call
31
+ end
32
+ ensure
33
+ ActiveRecord::Base.db_charmer_database_remappings = old_mappings
34
+ end
35
+ end
36
+
37
+ def self.hijack_new_classes?
38
+ @@hijack_new_classes
39
+ end
40
+
41
+ private
42
+ @@hijack_new_classes = false
43
+ def self.with_all_hijacked
44
+ old_hijack_new_classes = @@hijack_new_classes
45
+ begin
46
+ @@hijack_new_classes = true
47
+ ActiveRecord::Base.send(:subclasses).each { |s| s.hijack_connection! }
48
+ yield
49
+ ensure
50
+ @@hijack_new_classes = old_hijack_new_classes
51
+ end
52
+ end
22
53
  end
23
54
 
24
55
  class Object
@@ -101,3 +132,15 @@ ActiveRecord::Base.extend(DbCharmer::DbMagic::ClassMethods)
101
132
 
102
133
  # Setup association preload magic
103
134
  ActiveRecord::Base.extend(DbCharmer::AssociationPreload::ClassMethods)
135
+
136
+ class ActiveRecord::Base
137
+ class << self
138
+ def inherited_with_hijacking(subclass)
139
+ out = inherited_without_hijacking(subclass)
140
+ hijack_connection! if DbCharmer.hijack_new_classes?
141
+ out
142
+ end
143
+
144
+ alias_method_chain :inherited, :hijacking
145
+ end
146
+ end
@@ -63,12 +63,32 @@ module DbCharmer
63
63
  db_charmer_connection_level.zero?
64
64
  end
65
65
 
66
+ #-----------------------------------------------------------------------------
67
+ @@db_charmer_database_remappings = Hash.new
68
+ def db_charmer_remapped_connection
69
+ return nil if (db_charmer_connection_level || 0) > 0
70
+ name = db_charmer_connection_proxy.db_charmer_connection_name if db_charmer_connection_proxy
71
+ name = (name || :master).to_sym
72
+
73
+ remapped = @@db_charmer_database_remappings[name]
74
+ return DbCharmer::ConnectionFactory.connect(remapped, true) if remapped
75
+ end
76
+
77
+ def db_charmer_database_remappings
78
+ @@db_charmer_database_remappings
79
+ end
80
+
81
+ def db_charmer_database_remappings=(mappings)
82
+ raise "Mappings must be nil or respond to []" if mappings && (! mappings.respond_to?(:[]))
83
+ @@db_charmer_database_remappings = mappings || { }
84
+ end
85
+
66
86
  #-----------------------------------------------------------------------------
67
87
  def hijack_connection!
68
88
  return if self.respond_to?(:connection_with_magic)
69
89
  class << self
70
90
  def connection_with_magic
71
- db_charmer_connection_proxy || connection_without_magic
91
+ db_charmer_remapped_connection || db_charmer_connection_proxy || connection_without_magic
72
92
  end
73
93
  alias_method_chain :connection, :magic
74
94
  end
@@ -21,7 +21,7 @@ module DbCharmer
21
21
  # Establish connection with a specified name
22
22
  def self.establish_connection(db_name, should_exist = false)
23
23
  abstract_class = generate_abstract_class(db_name, should_exist)
24
- DbCharmer::ConnectionProxy.new(abstract_class)
24
+ DbCharmer::ConnectionProxy.new(abstract_class, db_name)
25
25
  end
26
26
 
27
27
  # Generate an abstract AR class with specified connection established
@@ -1,7 +1,12 @@
1
1
  module DbCharmer
2
2
  class ConnectionProxy < BlankSlate
3
- def initialize(abstract_class)
3
+ def initialize(abstract_class, db_name)
4
4
  @abstract_connection_class = abstract_class
5
+ @db_name = db_name
6
+ end
7
+
8
+ def db_charmer_connection_name
9
+ @db_name
5
10
  end
6
11
 
7
12
  def method_missing(meth, *args, &block)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 1
7
7
  - 5
8
- - 3
9
- version: 1.5.3
8
+ - 4
9
+ version: 1.5.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alexey Kovyrin
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-10 00:00:00 -05:00
17
+ date: 2010-03-12 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency