db-charmer 1.5.3 → 1.5.4

Sign up to get free protection for your applications and to get access to all the features.
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