active_shard 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,9 @@
1
+ require 'active_record'
1
2
  require 'active_record/connection_adapters/abstract/connection_pool'
2
3
 
3
4
  module ActiveShard
4
5
  module ActiveRecord
5
6
 
6
- autoload :SchemaConnectionPool, 'active_shard/active_record/schema_connection_pool'
7
-
8
7
  class ConnectionHandler < ::ActiveRecord::ConnectionAdapters::ConnectionHandler
9
8
 
10
9
  # Used to look up shard names
@@ -15,54 +14,110 @@ module ActiveShard
15
14
  #
16
15
  # @param [Array<ShardDefinition>] shard_definitions
17
16
  # @param [Hash] options
18
- # @option options [ShardLookupHandler] :shard_lookup
17
+ # @option options [ShardLookupHandler, #lookup_active_shard] :shard_lookup
19
18
  #
20
- def initialize( shard_definitions, options={} )
19
+ def initialize( options={} )
21
20
  @shard_lookup = options[ :shard_lookup ]
22
21
 
22
+ @shard_definitions = []
23
23
  @connection_pools = {}
24
24
  @schema_pools = {}
25
+ end
25
26
 
26
- initialize_shard_definitions( shard_definitions )
27
+ # @api ShardObserver
28
+ def add_shards( shard_definitions )
29
+ shard_definitions.each( &method(:add_shard) )
27
30
  end
28
31
 
29
- def initialize_shard_definitions( definitions )
30
- definitions.each do |definition|
31
- schema_pools[ definition.schema.to_sym ] ||= SchemaConnectionPool.new(
32
- ::ActiveRecord::Base::ConnectionSpecification.new( definition.connection_spec, definition.adapter_method )
33
- )
32
+ # @api ShardObserver
33
+ def add_shard( shard_definition )
34
+ connection_pools[ connection_pool_id( shard_definition ) ] = new_connection_pool( shard_definition )
35
+ shard_definitions << shard_definition
36
+
37
+ self
38
+ end
34
39
 
40
+ # @api ShardObserver
41
+ def remove_shard( shard_definition )
42
+ schema_name = shard_definition.schema
35
43
 
36
- connection_pools[ connection_pool_id( definition.schema, definition.name ) ] =
37
- ::ActiveRecord::ConnectionAdapters::ConnectionPool.new(
38
- ::ActiveRecord::Base::ConnectionSpecification.new( definition.connection_spec, definition.adapter_method )
39
- )
44
+ # Remove SchemaPool if it's based on this shard
45
+ #
46
+ if ( schema_pools[ schema_name ] && schema_pools[ schema_name ].shard_definition == shard_definition )
47
+ schema_pools[ schema_name ].disconnect!
48
+ schema_pools.delete( schema_name )
40
49
  end
50
+
51
+ pool_id = connection_pool_id( shard_definition )
52
+
53
+ # Remove connection pool
54
+ connection_pools[ pool_id ].disconnect!
55
+ connection_pools.delete( pool_id )
56
+
57
+ shard_definitions.delete( shard_definition )
58
+
59
+ self
60
+ end
61
+
62
+ # @api ShardObserver
63
+ def remove_all_shards!
64
+ defs = shard_definitions.dup
65
+
66
+ defs.each( &method(:remove_shard) )
41
67
  end
42
68
 
69
+ # I want to put this in here, but it seems to cause problems that I haven't yet tracked down. [BLS]
70
+ #
43
71
  #def establish_connection( *args )
44
72
  # raise NoMethodError, "Sharded models do not support establish_connection"
45
73
  #end
46
74
 
47
75
  # Retrieve connection pool for class
48
76
  #
77
+ # @param [#schema_name] klass An object which responds to #schema_name
78
+ # @return [ConnectionPool,SchemaConnectionPool] connection pool
79
+ #
49
80
  def retrieve_connection_pool( klass )
50
- schema_name = klass.schema_name
81
+ schema_name = ( sn = klass.schema_name ).nil? ? nil : sn.to_sym
51
82
 
52
83
  active_shard_name = shard_lookup.lookup_active_shard( schema_name )
53
-
54
- Rails.logger.debug( "RetrieveConnectionPool for #{klass.name}, schema_name #{schema_name}, active_shard #{active_shard_name}")
55
84
 
56
85
  ( active_shard_name.nil? ?
57
- schema_pools[ schema_name.to_sym ] :
86
+ get_schema_pool_for( schema_name ) :
58
87
  connection_pools[ connection_pool_id( schema_name, active_shard_name ) ] )
59
88
  end
60
89
 
61
90
  private
62
91
 
63
92
  attr_reader :schema_pools
93
+ attr_reader :shard_definitions
94
+
95
+ def get_schema_pool_for( schema_name )
96
+ schema_name = schema_name.nil? ? nil : schema_name.to_sym
97
+
98
+ schema_pools[ schema_name ] ||= new_schema_pool( shard_definitions_for_schema( schema_name ).first )
99
+ end
100
+
101
+ def new_schema_pool( definition )
102
+ ConnectionProxyPool.new( definition, :proxy_class => SchemaConnectionProxy )
103
+ end
104
+
105
+ def new_connection_pool( definition )
106
+ ConnectionProxyPool.new( definition )
107
+ end
108
+
109
+ def shard_definitions_for_schema( schema_name )
110
+ shard_definitions.find_all { |sd| sd.belongs_to_schema?( schema_name ) }
111
+ end
112
+
113
+ # args are either a ShardDefinition or a schema and shard name.
114
+ #
115
+ def connection_pool_id( *args )
116
+ definition = args.first.is_a?( ShardDefinition ) ? args.shift : nil
117
+
118
+ schema_name = definition.nil? ? args.shift : definition.schema
119
+ shard_name = definition.nil? ? args.shift : definition.name
64
120
 
65
- def connection_pool_id( schema_name, shard_name )
66
121
  "#{schema_name.to_s}+#{shard_name.to_s}".to_sym
67
122
  end
68
123
 
@@ -0,0 +1,37 @@
1
+ require 'active_record'
2
+ require 'active_record/connection_adapters/abstract/connection_pool'
3
+
4
+ require 'active_shard/active_record/connection_specification_adapter'
5
+
6
+ module ActiveShard
7
+ module ActiveRecord
8
+
9
+ # ConnectionPool designed to return connection proxies of configurable types
10
+ #
11
+ class ConnectionProxyPool < ::ActiveRecord::ConnectionAdapters::ConnectionPool
12
+
13
+ attr_reader :shard_definition
14
+
15
+ # @param [ShardDefinition] definition
16
+ # @param [Hash] options
17
+ # @option options [Class] :proxy_class
18
+ #
19
+ def initialize( definition, options={} )
20
+ super( ConnectionSpecificationAdapter.new( definition ) )
21
+
22
+ @shard_definition = definition
23
+ @proxy_class = options[:proxy_class]
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :proxy_class
29
+
30
+ def new_connection
31
+ proxy_class.nil? ? super : proxy_class.new( super )
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,27 @@
1
+ module ActiveShard
2
+ module ActiveRecord
3
+
4
+ class ConnectionSpecificationAdapter
5
+
6
+ # @param [ShardDefinition] shard_definition
7
+ #
8
+ def initialize( shard_definition )
9
+ @shard_definition = shard_definition
10
+ end
11
+
12
+ def adapter_method
13
+ "#{shard_definition.connection_spec[:adapter]}_connection"
14
+ end
15
+
16
+ def config
17
+ shard_definition.connection_spec
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :shard_definition
23
+
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ require 'active_support/core_ext/module/delegation'
2
+ require 'active_shard/exceptions'
3
+
4
+ module ActiveShard
5
+ module ActiveRecord
6
+
7
+ # SchemaConnectionProxy holds a Connection object and restricts messages passed
8
+ # to it. Only schema-ish messages are allowed.
9
+ #
10
+ class SchemaConnectionProxy
11
+
12
+ delegate :columns,
13
+ :verify,
14
+ :verify!,
15
+ :run_callbacks,
16
+ :_run_checkin_callbacks,
17
+ :quote_table_name,
18
+ :quote_value,
19
+ :disconnect!,
20
+ :quote, :to => :target
21
+
22
+ def initialize( target )
23
+ @target = target
24
+ end
25
+
26
+ def method_missing( sym, *args, &block )
27
+ raise ::ActiveShard::NoActiveShardError
28
+ end
29
+
30
+ private
31
+ def target
32
+ @target
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,5 @@
1
+ require 'active_record'
2
+
1
3
  module ActiveShard
2
4
 
3
5
  # The ActiveShard::ActiveRecord module contains the code necessary for ActiveRecord
@@ -6,10 +8,16 @@ module ActiveShard
6
8
  # -- Need to add explanation of ShardedBase VS ShardSupport --
7
9
  #
8
10
  module ActiveRecord
9
-
10
- autoload :ConnectionHandler, 'active_shard/active_record/connection_handler'
11
- autoload :ShardSupport, 'active_shard/active_record/shard_support'
12
- autoload :ShardedBase, 'active_shard/active_record/sharded_base'
11
+ extend ActiveSupport::Autoload
12
+
13
+ eager_autoload do
14
+ autoload :ConnectionHandler
15
+ autoload :ConnectionProxyPool
16
+ autoload :ConnectionSpecificationAdapter
17
+ autoload :SchemaConnectionProxy
18
+ autoload :ShardSupport
19
+ autoload :ShardedBase
20
+ end
13
21
 
14
22
  end
15
23
  end
@@ -1,50 +1,46 @@
1
+ require 'active_shard/shard_collection'
2
+
1
3
  module ActiveShard
2
- autoload :ShardDefinition, 'active_shard/shard_definition'
3
- autoload :ShardCollection, 'active_shard/shard_collection'
4
4
 
5
5
  class Config
6
6
 
7
- # Returns a filtered list of shards that belong to
8
- # the specified schema
9
- #
10
- # @return [Array] shards belonging to schema
11
- #
12
- def shards_by_schema( schema_name )
13
- shard_collection.by_schema( schema_name )
7
+ def shard_configuration=( configuration )
8
+ shard_collections.clear
9
+
10
+ configuration.each_pair do |environment, shard_definitions|
11
+ shard_collection( environment.to_sym ).add_shards( shard_definitions )
12
+ end
14
13
  end
15
14
 
16
- # Returns the name of a shard usable for schema definition
17
- # connections
18
- #
19
- def schema_shard_name_by_schema( schema_name )
20
- shard_def = shard_definitions_by_schema( schema_name ).first
21
-
22
- shard_def.nil? ? nil : shard_def.name.to_sym
15
+ def shards_by_schema( environment, schema )
16
+ shard_collection( environment ).by_schema( schema )
23
17
  end
24
18
 
25
- # Returns a Shard Definition by the shard name
26
- #
27
- # @return [ShardDefinition]
28
- #
29
- def shard( name )
30
- shard_collection.shard( name )
19
+ def add_shard( environment, shard_definition )
20
+ shard_collection( environment ).add_shard( shard_definition )
31
21
  end
32
22
 
33
- def add_shard( *args )
34
- shard_collection.add_shard( *args )
23
+ def shard_definitions( environment )
24
+ shard_collection( environment )
35
25
  end
36
26
 
37
- def shard_definitions
38
- shard_collection.shard_definitions
27
+ def remove_shard( environment, shard_name )
28
+ shard_collection( environment ).remove_shard( shard_name )
39
29
  end
40
30
 
41
- def remove_shard( shard_name )
42
- shard_collection.remove_shard( shard_name )
31
+ def shard( environment, shard_name )
32
+ shard_collection( environment ).shard( shard_name )
43
33
  end
44
34
 
45
35
  private
46
- def shard_collection
47
- @shard_collection ||= ShardCollection.new
36
+ def shard_collection( enviro )
37
+ enviro = enviro.nil? ? nil : enviro.to_sym
38
+
39
+ shard_collections[ enviro ] ||= ShardCollection.new
40
+ end
41
+
42
+ def shard_collections
43
+ @shard_collections ||= {}
48
44
  end
49
45
 
50
46
  end
@@ -6,11 +6,12 @@ module ActiveShard
6
6
  # than nesting.
7
7
  #
8
8
 
9
+ # Base exception for all ActiveShard errors
10
+ #
9
11
  class ActiveShardError < StandardError; end
10
12
 
11
13
  class DefinitionError < ActiveShardError; end
12
14
  class NameNotUniqueError < DefinitionError; end
13
-
14
15
  class NoActiveShardError < ActiveShardError; end
15
16
 
16
17
  end
@@ -0,0 +1,64 @@
1
+ require "active_shard"
2
+
3
+ module ActiveShard
4
+ class Railtie < Rails::Railtie
5
+
6
+ config.active_shard = ActiveSupport::OrderedOptions.new
7
+
8
+ rake_tasks do
9
+ load "active_shard/rails/database.rake"
10
+ end
11
+
12
+ initializer "active_shard.logger" do
13
+ ActiveSupport.on_load(:active_shard) { self.logger ||= ::Rails.logger }
14
+ end
15
+
16
+ initializer "active_shard.set_configs" do |app|
17
+ ActiveSupport.on_load(:active_shard) do
18
+ app.config.active_shard.each do |k,v|
19
+ send "#{k}=", v
20
+ end
21
+ end
22
+ end
23
+
24
+ initializer "active_shard.initialize_framework" do |app|
25
+ ActiveSupport.on_load(:active_shard) do
26
+
27
+ # TODO: Should anyone build code to plug ActiveShard into other ORMs, this
28
+ # Railtie could support that by respecting a configuration option.
29
+ #
30
+ # something like 'active_shard/data_mapper', 'active_shard/sequel'
31
+ #
32
+ require "active_shard/active_record"
33
+
34
+ ::ActiveRecord::Base.send( :include, ActiveShard::ActiveRecord::ShardSupport )
35
+ ::ActiveRecord::Base.schema_name( self.base_schema_name ) if self.base_schema_name
36
+
37
+ handler =
38
+ ActiveShard::ActiveRecord::ConnectionHandler.new(
39
+ :shard_lookup => ActiveShard::ShardLookupHandler.new( :scope => ActiveShard.scope )
40
+ )
41
+
42
+ self.shard_observers << handler
43
+
44
+ ::ActiveRecord::Base.connection_handler = handler
45
+ end
46
+ end
47
+
48
+ initializer "active_shard.initialize_shard_configuration" do |app|
49
+ ActiveSupport.on_load(:active_shard) do
50
+ unless app.config.active_shard.shard_configuration
51
+ self.shard_configuration =
52
+ ActiveShard::ShardDefinition.from_yaml_file( Rails.root.join( "config", "shards.yml" ) )
53
+ end
54
+ end
55
+ end
56
+
57
+ initializer "active_shard.set_environment" do |app|
58
+ ActiveSupport.on_load(:active_shard) do
59
+ ActiveShard.environment = Rails.env.to_s
60
+ end
61
+ end
62
+
63
+ end
64
+ end
@@ -52,6 +52,9 @@ module ActiveShard
52
52
 
53
53
  # Remove the last scope from the stack
54
54
  #
55
+ # FIXME: Symbols (for AnySchema) may not roll back properly if multiple
56
+ # the same symbol is on the stack several times
57
+ #
55
58
  def pop( pop_until=nil )
56
59
  if pop_until.nil?
57
60
  scope_crumbs.pop
@@ -17,7 +17,7 @@ module ActiveShard
17
17
  # scope instances
18
18
  #
19
19
  def initialize( options={} )
20
- @scope_class = options[:scope_class] if options[:scope_class]
20
+ self.scope_class = options[:scope_class] if options[:scope_class]
21
21
  end
22
22
 
23
23
  # @see ActiveShard::Scope#push
@@ -11,6 +11,7 @@ module ActiveShard
11
11
  # in most situations.
12
12
  #
13
13
  class ShardCollection
14
+ include Enumerable
14
15
 
15
16
  # Initializes a shard group
16
17
  #
@@ -84,6 +85,10 @@ module ActiveShard
84
85
  self.class.new( definitions_by_schema( schema_name ) )
85
86
  end
86
87
 
88
+ def schemas
89
+ definitions.map { |d| d.schema }.uniq.compact
90
+ end
91
+
87
92
  # Removes a shard definition from the collection based on the
88
93
  # provided shard name.
89
94
  #
@@ -118,6 +123,18 @@ module ActiveShard
118
123
  def any_shard
119
124
  definitions[ rand( definitions.size ) ].name
120
125
  end
126
+
127
+ def each( &block )
128
+ definitions.each( &block )
129
+ end
130
+
131
+ def length
132
+ definitions.length
133
+ end
134
+
135
+ def size
136
+ length
137
+ end
121
138
 
122
139
  private
123
140
 
@@ -1,9 +1,10 @@
1
+ require 'active_support/hash_with_indifferent_access'
2
+
1
3
  module ActiveShard
2
4
 
3
5
  class ShardDefinition
4
6
  attr_accessor :schema
5
7
  attr_accessor :name
6
- attr_writer :connection_spec
7
8
 
8
9
  class << self
9
10
 
@@ -15,9 +16,31 @@ module ActiveShard
15
16
  # @return [Hash] hash of environments and lists of Definitions
16
17
  #
17
18
  def from_yaml_file( file_name )
18
- definitions = {}
19
+ from_yaml( File.open( file_name ).read() )
20
+ end
19
21
 
20
- hash = YAML.load( ERB.new( File.open( file_name ).read() ).result )
22
+ # Returns a hash with environments as the hash keys and
23
+ # a list of ShardDefinitions as the hash values
24
+ #
25
+ # @param [String] yaml YAML string to parse
26
+ #
27
+ # @return [Hash] hash of environments and lists of Definitions
28
+ #
29
+ def from_yaml( yaml )
30
+ hash = YAML.load( ERB.new( yaml ).result )
31
+
32
+ from_hash( hash )
33
+ end
34
+
35
+ # Returns a hash with environments as the hash keys and
36
+ # a list of ShardDefinitions as the hash values
37
+ #
38
+ # @param [Hash] hash raw hash in YAML-format
39
+ #
40
+ # @return [Hash] hash of environments and lists of Definitions
41
+ #
42
+ def from_hash( hash )
43
+ definitions = {}
21
44
 
22
45
  hash.each_pair do |environment, schemas|
23
46
  schemas.each_pair do |schema, shards|
@@ -44,13 +67,21 @@ module ActiveShard
44
67
  def initialize( name, options={} )
45
68
  opts = options.dup
46
69
 
47
- @name = name
48
- @schema = opts.delete( :schema )
49
- @connection_spec = symbolize_keys( opts )
70
+ @name = name.to_sym
71
+ @schema = ( ( sch = opts.delete( :schema ) ).nil? ? nil : sch.to_sym )
72
+ self.connection_spec = opts
50
73
  end
51
74
 
52
- def adapter_method
53
- "#{connection_spec[:adapter]}_connection"
75
+ def connection_adapter
76
+ @connection_adapter ||= connection_spec[:adapter]
77
+ end
78
+
79
+ def connection_database
80
+ @connection_database ||= connection_spec[:database]
81
+ end
82
+
83
+ def connection_spec=(val)
84
+ @connection_spec = val.nil? ? nil : HashWithIndifferentAccess.new( val )
54
85
  end
55
86
 
56
87
  def connection_spec
@@ -70,6 +101,16 @@ module ActiveShard
70
101
  ( schema.to_sym == schema_name.to_sym )
71
102
  end
72
103
 
104
+ def ==( other )
105
+ eql?( other )
106
+ end
107
+
108
+ def eql?( other )
109
+ (self.name == other.name) &&
110
+ (self.schema == other.schema) &&
111
+ (self.connection_spec == other.connection_spec)
112
+ end
113
+
73
114
  private
74
115
 
75
116
  def symbolize_keys( hash )
@@ -1,28 +1,26 @@
1
1
  module ActiveShard
2
2
 
3
- # Handles current and schema shard resolution using the current
4
- # scope and
3
+ # Handles current shard resolution using the provided scope
4
+ #
5
5
  class ShardLookupHandler
6
6
 
7
7
  # Initializes a shard lookup handler
8
8
  #
9
9
  # @param [Hash] options
10
10
  # @option options [Scope,ScopeManager] :scope
11
- # @option options [Config] :config
12
- # scope instances
13
11
  #
14
12
  def initialize( options={} )
15
13
  @scope = options[:scope]
16
- @config = options[:config]
17
14
  end
18
15
 
16
+ # Returns the active shard for the provided schema, or nil if none.
17
+ #
18
+ # @param [Symbol] schema_name
19
+ # @return [Symbol, nil] shard name if any
20
+ #
19
21
  def lookup_active_shard( schema_name )
20
22
  @scope.active_shard_for_schema( schema_name )
21
23
  end
22
24
 
23
- def lookup_schema_shard( schema_name )
24
- @config.schema_shard_name_by_schema( schema_name )
25
- end
26
-
27
25
  end
28
26
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveShard
2
- VERSION = '0.1.1'
2
+ VERSION = '0.2.0'
3
3
  end
data/lib/active_shard.rb CHANGED
@@ -1,19 +1,45 @@
1
+ require 'active_support'
2
+
1
3
  module ActiveShard
4
+ extend ActiveSupport::Autoload
2
5
 
3
- autoload :Config, 'active_shard/config'
4
- autoload :ScopeManager, 'active_shard/scope_manager'
5
- autoload :ShardLookupHandler, 'active_shard/shard_lookup_handler'
6
- autoload :ShardCollection, 'active_shard/shard_collection'
6
+ autoload :Config
7
+ autoload :Scope
8
+ autoload :ScopeManager
9
+ autoload :ShardCollection
10
+ autoload :ShardDefinition
11
+ autoload :ShardLookupHandler
7
12
 
8
13
  class << self
9
14
 
15
+ def with_environment( val )
16
+ previous_environment = self.environment
17
+ self.environment = val
18
+
19
+ yield
20
+
21
+ self.environment = previous_environment
22
+ end
23
+
24
+ def environment=( val )
25
+ env_changed = !( @environment.to_s == val.to_s )
26
+
27
+ @environment = val.nil? ? nil : val.to_sym
28
+
29
+ reload_observer_shards! if env_changed
30
+ end
31
+
32
+ def environment
33
+ @environment
34
+ end
35
+
10
36
  # Returns the current Config object for ActiveShard.
11
37
  #
12
38
  # @yield [c] yields the current config object to the block for setup
13
39
  #
14
40
  # @return [Config] current config
15
41
  #
16
- def config()
42
+ def config
17
43
  @config ||= Config.new
18
44
 
19
45
  yield( @config ) if block_given?
@@ -21,6 +47,68 @@ module ActiveShard
21
47
  @config
22
48
  end
23
49
 
50
+ def base_schema_name=(val)
51
+ @base_schema_name = val.nil? ? nil : val.to_sym
52
+ end
53
+
54
+ def base_schema_name
55
+ @base_schema_name
56
+ end
57
+
58
+ def shard_configuration=( configuration )
59
+ config.shard_configuration=( configuration )
60
+
61
+ reload_observer_shards!
62
+ end
63
+
64
+ # Doesn't yet support anything other than ActiveRecord::Base
65
+ #
66
+ #def base_class=(val)
67
+ # @base_class = val
68
+ #end
69
+ #
70
+ #def base_class
71
+ # @base_class
72
+ #end
73
+
74
+ def notify_shard_observers( message, *args )
75
+ shard_observers.each do |observer|
76
+ observer.public_send( message, *args ) if observer.respond_to?( message )
77
+ end
78
+ end
79
+
80
+ def add_shard_observer( observer )
81
+ shard_observers << observer
82
+ end
83
+
84
+ def shard_observers
85
+ @shard_observers ||= []
86
+ end
87
+
88
+ def add_shard( *args )
89
+ definition = args.first.is_a?( ShardDefinition ) ? args.first : ShardDefinition.new( *args )
90
+
91
+ config.add_shard( environment, definition )
92
+
93
+ notify_shard_observers( :add_shard, definition )
94
+
95
+ definition
96
+ end
97
+
98
+ def remove_shard( shard_name )
99
+ config.remove_shard( environment, shard_name )
100
+
101
+ notify_shard_observers( :remove_shard, shard_name )
102
+ end
103
+
104
+ def shard_definitions
105
+ config.shard_definitions( environment )
106
+ end
107
+
108
+ def shard( shard_name )
109
+ config.shard( environment, shard_name )
110
+ end
111
+
24
112
  # Sets the current scope handling object.
25
113
  #
26
114
  # Scope handler must respond to the following methods:
@@ -92,6 +180,11 @@ module ActiveShard
92
180
  @logger = val
93
181
  end
94
182
 
183
+ def reload_observer_shards!
184
+ notify_shard_observers( :remove_all_shards! )
185
+ notify_shard_observers( :add_shards, shard_definitions )
186
+ end
187
+
95
188
  end
96
189
  end
97
190
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: active_shard
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.1.1
5
+ version: 0.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Brasten Sager
@@ -11,9 +11,19 @@ autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
13
 
14
- date: 2011-08-15 00:00:00 Z
15
- dependencies: []
16
-
14
+ date: 2011-08-19 00:00:00 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: activesupport
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 3.0.0
25
+ type: :runtime
26
+ version_requirements: *id001
17
27
  description: ActiveShard is a library that implements flexible sharding in ActiveRecord and Rails.
18
28
  email:
19
29
  - brasten@dashwire.com
@@ -25,17 +35,17 @@ extensions: []
25
35
  extra_rdoc_files: []
26
36
 
27
37
  files:
28
- - CHANGELOG
29
38
  - README.md
30
39
  - lib/active_shard/active_record/connection_handler.rb
31
- - lib/active_shard/active_record/railtie.rb
32
- - lib/active_shard/active_record/schema_connection_adapter.rb
33
- - lib/active_shard/active_record/schema_connection_pool.rb
40
+ - lib/active_shard/active_record/connection_proxy_pool.rb
41
+ - lib/active_shard/active_record/connection_specification_adapter.rb
42
+ - lib/active_shard/active_record/schema_connection_proxy.rb
34
43
  - lib/active_shard/active_record/shard_support.rb
35
44
  - lib/active_shard/active_record/sharded_base.rb
36
45
  - lib/active_shard/active_record.rb
37
46
  - lib/active_shard/config.rb
38
47
  - lib/active_shard/exceptions.rb
48
+ - lib/active_shard/railtie.rb
39
49
  - lib/active_shard/scope.rb
40
50
  - lib/active_shard/scope_manager.rb
41
51
  - lib/active_shard/shard_collection.rb
@@ -43,7 +53,7 @@ files:
43
53
  - lib/active_shard/shard_lookup_handler.rb
44
54
  - lib/active_shard/version.rb
45
55
  - lib/active_shard.rb
46
- homepage:
56
+ homepage: https://github.com/dashwire/active_shard
47
57
  licenses: []
48
58
 
49
59
  post_install_message:
data/CHANGELOG DELETED
@@ -1,11 +0,0 @@
1
- ## 0.1.1 ##
2
- - bug in Railtie prevented gem from working
3
-
4
- ## 0.1.0 ##
5
-
6
- - initial release of code and gem
7
- - includes working code base, missing completed railtie, better specs.
8
-
9
- ## 0.0.1 ##
10
-
11
- - stub gem while setting up git repo, etc.
@@ -1,56 +0,0 @@
1
- require "active_shard"
2
- require "rails"
3
-
4
- module ActiveShard
5
- module ActiveRecord
6
- class Railtie < Rails::Railtie
7
-
8
- config.active_shard = ActiveSupport::OrderedOptions.new
9
-
10
- rake_tasks do
11
- load "active_shard/active_record/rails/database.rake"
12
- end
13
-
14
- initializer "active_shard.logger" do
15
- ActiveSupport.on_load(:active_shard) { self.logger ||= ::Rails.logger }
16
- end
17
-
18
- initializer "active_shard.set_configs" do |app|
19
- ActiveSupport.on_load(:active_record) do
20
- app.config.active_record.each do |k,v|
21
- send "#{k}=", v
22
- end
23
- end
24
- end
25
-
26
- initializer "active_shard.initialize_database" do |app|
27
- ActiveSupport.on_load(:active_record) do
28
- self.configurations = app.config.database_configuration
29
- establish_connection
30
- end
31
- end
32
-
33
- # ActiveShard.config do |c|
34
- # definitions = ActiveShard::ShardDefinition.from_yaml_file( File.expand_path( '../shards.yml', __FILE__ ) )
35
- #
36
- # definitions[ Rails.env.to_sym ].each do |shard|
37
- # c.add_shard( shard )
38
- # end
39
- # end
40
- #
41
- # require 'active_shard/active_record'
42
- #
43
- # ActiveRecord::Base.send( :include, ActiveShard::ActiveRecord::ShardSupport )
44
- #
45
- # ActiveRecord::Base.connection_handler =
46
- # ActiveShard::ActiveRecord::ConnectionHandler.new(
47
- # ActiveShard.config.shard_definitions,
48
- # :shard_lookup => ActiveShard::ShardLookupHandler.new( :scope => ActiveShard.scope, :config => ActiveShard.config )
49
- # )
50
- #
51
- # ActiveRecord::Base.schema_name( :main )
52
-
53
-
54
- end
55
- end
56
- end
@@ -1,23 +0,0 @@
1
- require 'active_shard/exceptions'
2
-
3
- module ActiveShard
4
- module ActiveRecord
5
- class SchemaConnectionAdapter
6
-
7
- delegate :columns, :verify, :verify!, :run_callbacks, :quote_table_name, :quote_value, :quote, :to => :adapter
8
-
9
- def initialize( adapter )
10
- @adapter = adapter
11
- end
12
-
13
- def method_missing( sym, *args, &block )
14
- raise ::ActiveShard::NoActiveShardError
15
- end
16
-
17
- private
18
- def adapter
19
- @adapter
20
- end
21
- end
22
- end
23
- end
@@ -1,18 +0,0 @@
1
- require 'active_record/connection_adapters/abstract/connection_pool'
2
-
3
- module ActiveShard
4
- module ActiveRecord
5
-
6
- autoload :SchemaConnectionAdapter, 'active_shard/active_record/schema_connection_adapter'
7
-
8
- class SchemaConnectionPool < ::ActiveRecord::ConnectionAdapters::ConnectionPool
9
-
10
- private
11
- def new_connection
12
- SchemaConnectionAdapter.new( super )
13
- end
14
-
15
- end
16
-
17
- end
18
- end