db-charmer 1.6.16 → 1.6.17
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 +7 -0
- data/VERSION +1 -1
- data/db-charmer.gemspec +3 -3
- data/lib/db_charmer.rb +4 -1
- data/lib/db_charmer/connection_switch.rb +2 -2
- data/lib/db_charmer/db_magic.rb +7 -14
- data/lib/db_charmer/sharding/connection.rb +4 -0
- data/lib/db_charmer/sharding/stub_connection.rb +51 -0
- metadata +5 -5
- data/lib/db_charmer/stub_connection.rb +0 -32
data/CHANGES
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
1.6.15 (2011-04-25):
|
2
|
+
|
3
|
+
Bugfixes: Do not touch database for sharded models until we really need to. Before 1.6.15
|
4
|
+
if a database server was dead and there were any other connection issues, class loading
|
5
|
+
in Ruby would be broken and sharded model class would not be initialized.
|
6
|
+
|
7
|
+
----------------------------------------------------------------------------------------
|
1
8
|
1.6.14 (2011-01-09):
|
2
9
|
|
3
10
|
Bugfixes: We do not support Rails 3, and now we prohibit any versions but 2.2 and 2.3 from
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.17
|
data/db-charmer.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{db-charmer}
|
8
|
-
s.version = "1.6.
|
8
|
+
s.version = "1.6.17"
|
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{2011-
|
12
|
+
s.date = %q{2011-04-25}
|
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 = [
|
@@ -45,7 +45,7 @@ Gem::Specification.new do |s|
|
|
45
45
|
"lib/db_charmer/sharding/method/db_block_map.rb",
|
46
46
|
"lib/db_charmer/sharding/method/hash_map.rb",
|
47
47
|
"lib/db_charmer/sharding/method/range.rb",
|
48
|
-
"lib/db_charmer/stub_connection.rb",
|
48
|
+
"lib/db_charmer/sharding/stub_connection.rb",
|
49
49
|
"lib/tasks/databases.rake"
|
50
50
|
]
|
51
51
|
s.homepage = %q{http://github.com/kovyrin/db-charmer}
|
data/lib/db_charmer.rb
CHANGED
@@ -71,7 +71,6 @@ require 'db_charmer/core_extensions'
|
|
71
71
|
require 'db_charmer/connection_factory'
|
72
72
|
require 'db_charmer/connection_proxy'
|
73
73
|
require 'db_charmer/connection_switch'
|
74
|
-
require 'db_charmer/stub_connection'
|
75
74
|
require 'db_charmer/scope_proxy'
|
76
75
|
require 'db_charmer/multi_db_proxy'
|
77
76
|
|
@@ -121,6 +120,10 @@ require 'db_charmer/association_preload'
|
|
121
120
|
require 'db_charmer/multi_db_migrations'
|
122
121
|
require 'db_charmer/multi_db_proxy'
|
123
122
|
|
123
|
+
require 'db_charmer/sharding'
|
124
|
+
require 'db_charmer/sharding/connection'
|
125
|
+
require 'db_charmer/sharding/stub_connection'
|
126
|
+
|
124
127
|
# Enable multi-db migrations
|
125
128
|
ActiveRecord::Migration.extend(DbCharmer::MultiDbMigrations)
|
126
129
|
|
@@ -18,7 +18,7 @@ module DbCharmer
|
|
18
18
|
return conn.db_charmer_connection_proxy
|
19
19
|
end
|
20
20
|
|
21
|
-
if conn.kind_of?(ActiveRecord::ConnectionAdapters::AbstractAdapter) || conn.kind_of?(DbCharmer::StubConnection)
|
21
|
+
if conn.kind_of?(ActiveRecord::ConnectionAdapters::AbstractAdapter) || conn.kind_of?(DbCharmer::Sharding::StubConnection)
|
22
22
|
return conn
|
23
23
|
end
|
24
24
|
|
@@ -28,7 +28,7 @@ module DbCharmer
|
|
28
28
|
def switch_connection_to(conn, require_config_to_exist = true)
|
29
29
|
new_conn = coerce_to_connection_proxy(conn, require_config_to_exist)
|
30
30
|
|
31
|
-
if db_charmer_connection_proxy.is_a?(DbCharmer::StubConnection)
|
31
|
+
if db_charmer_connection_proxy.is_a?(DbCharmer::Sharding::StubConnection)
|
32
32
|
db_charmer_connection_proxy.set_real_connection(new_conn)
|
33
33
|
end
|
34
34
|
|
data/lib/db_charmer/db_magic.rb
CHANGED
@@ -23,20 +23,6 @@ module DbCharmer
|
|
23
23
|
if opt[:sharded]
|
24
24
|
raise ArgumentError, "Can't use sharding on a model with slaves!" if opt[:slaves].any?
|
25
25
|
setup_sharding_magic(opt[:sharded])
|
26
|
-
|
27
|
-
# If method supports shards enumeration, get the first shard
|
28
|
-
conns = sharded_connection.shard_connections || []
|
29
|
-
real_conn = conns.first
|
30
|
-
|
31
|
-
# If connection we do not have real connection yet, try to use the default one
|
32
|
-
real_conn ||= sharded_connection.sharder.shard_for_key(:default) if sharded_connection.support_default_shard?
|
33
|
-
|
34
|
-
# Create stub connection
|
35
|
-
real_conn = coerce_to_connection_proxy(real_conn, DbCharmer.connections_should_exist?) if real_conn
|
36
|
-
stub_conn = DbCharmer::StubConnection.new(real_conn)
|
37
|
-
|
38
|
-
# ... and set it as the default one for this model
|
39
|
-
setup_connection_magic(stub_conn)
|
40
26
|
end
|
41
27
|
end
|
42
28
|
|
@@ -52,9 +38,16 @@ module DbCharmer
|
|
52
38
|
end
|
53
39
|
|
54
40
|
def setup_sharding_magic(config)
|
41
|
+
# Add sharding-specific methods
|
55
42
|
self.extend(DbCharmer::Sharding::ClassMethods)
|
43
|
+
|
44
|
+
# Get configuration
|
56
45
|
name = config[:sharded_connection] or raise ArgumentError, "No :sharded_connection!"
|
46
|
+
# Assign sharded connection
|
57
47
|
self.sharded_connection = DbCharmer::Sharding.sharded_connection(name)
|
48
|
+
|
49
|
+
# Setup model default connection
|
50
|
+
setup_connection_magic(sharded_connection.default_connection)
|
58
51
|
end
|
59
52
|
|
60
53
|
def setup_connection_magic(conn, should_exist = true)
|
@@ -22,6 +22,10 @@ module DbCharmer
|
|
22
22
|
def support_default_shard?
|
23
23
|
sharder.respond_to?(:support_default_shard?) && sharder.support_default_shard?
|
24
24
|
end
|
25
|
+
|
26
|
+
def default_connection
|
27
|
+
@default_connection ||= DbCharmer::Sharding::StubConnection.new(self)
|
28
|
+
end
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# This is a simple proxy class used as a default connection on sharded models
|
2
|
+
#
|
3
|
+
# The idea is to proxy all utility method calls to a real connection (set by
|
4
|
+
# the +set_real_connection+ method when we switch shards) and fail on real
|
5
|
+
# database querying calls forcing users to switch shard connections.
|
6
|
+
#
|
7
|
+
module DbCharmer
|
8
|
+
module Sharding
|
9
|
+
class StubConnection
|
10
|
+
attr_accessor :sharded_connection
|
11
|
+
|
12
|
+
def initialize(sharded_connection)
|
13
|
+
@sharded_connection = sharded_connection
|
14
|
+
@real_conn = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
def set_real_connection(real_conn)
|
18
|
+
@real_conn = real_conn
|
19
|
+
end
|
20
|
+
|
21
|
+
def real_connection
|
22
|
+
# Return memoized real connection
|
23
|
+
return @real_conn if @real_conn
|
24
|
+
|
25
|
+
# If sharded connection supports shards enumeration, get the first shard
|
26
|
+
@real_conn = sharded_connection.shard_connections.try(:first)
|
27
|
+
|
28
|
+
# If we do not have real connection yet, try to use the default one (if it is supported by the sharder)
|
29
|
+
@real_conn ||= sharded_connection.sharder.shard_for_key(:default) if sharded_connection.support_default_shard?
|
30
|
+
|
31
|
+
# Get connection proxy for our real connection
|
32
|
+
@real_conn && coerce_to_connection_proxy(@real_conn, DbCharmer.connections_should_exist?)
|
33
|
+
end
|
34
|
+
|
35
|
+
def method_missing(meth, *args, &block)
|
36
|
+
# Fail on database statements
|
37
|
+
if ActiveRecord::ConnectionAdapters::DatabaseStatements.instance_methods.member?(meth.to_s)
|
38
|
+
raise ActiveRecord::ConnectionNotEstablished, "You have to switch connection on your model before using it!"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Fail if no connection has been established yet
|
42
|
+
unless @real_conn
|
43
|
+
raise ActiveRecord::ConnectionNotEstablished, "No real connection to proxy this method to!"
|
44
|
+
end
|
45
|
+
|
46
|
+
# Proxy the call to our real connection target
|
47
|
+
@real_conn.__send__(meth, *args, &block)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db-charmer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 45
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 1.6.
|
9
|
+
- 17
|
10
|
+
version: 1.6.17
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alexey Kovyrin
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-25 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -85,7 +85,7 @@ files:
|
|
85
85
|
- lib/db_charmer/sharding/method/db_block_map.rb
|
86
86
|
- lib/db_charmer/sharding/method/hash_map.rb
|
87
87
|
- lib/db_charmer/sharding/method/range.rb
|
88
|
-
- lib/db_charmer/stub_connection.rb
|
88
|
+
- lib/db_charmer/sharding/stub_connection.rb
|
89
89
|
- lib/tasks/databases.rake
|
90
90
|
has_rdoc: true
|
91
91
|
homepage: http://github.com/kovyrin/db-charmer
|
@@ -1,32 +0,0 @@
|
|
1
|
-
# This is a simple proxy class used as a default connection on sharded models
|
2
|
-
#
|
3
|
-
# The idea is to proxy all utility method calls to a real connection (set by
|
4
|
-
# the +set_real_connection+ method when we switch shards) and fail on real
|
5
|
-
# database querying calls forcing users to switch shard connections.
|
6
|
-
#
|
7
|
-
module DbCharmer
|
8
|
-
class StubConnection
|
9
|
-
def initialize(real_conn = nil)
|
10
|
-
@real_conn = real_conn
|
11
|
-
end
|
12
|
-
|
13
|
-
def set_real_connection(real_conn)
|
14
|
-
@real_conn = real_conn
|
15
|
-
end
|
16
|
-
|
17
|
-
def method_missing(meth, *args, &block)
|
18
|
-
# Fail on database statements
|
19
|
-
if ActiveRecord::ConnectionAdapters::DatabaseStatements.instance_methods.member?(meth.to_s)
|
20
|
-
raise ActiveRecord::ConnectionNotEstablished, "You have to switch connection on your model before using it!"
|
21
|
-
end
|
22
|
-
|
23
|
-
# Fail if no connection has been established yet
|
24
|
-
unless @real_conn
|
25
|
-
raise ActiveRecord::ConnectionNotEstablished, "No real connection to proxy this method to!"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Proxy the call to our real connection target
|
29
|
-
@real_conn.__send__(meth, *args, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|