Module: DbCharmer::ActiveRecord::Sharding

Defined in:
lib/db_charmer/active_record/sharding.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(model) ⇒ Object



5
6
7
# File 'lib/db_charmer/active_record/sharding.rb', line 5

def self.extended(model)
  model.cattr_accessor(:sharded_connection)
end

Instance Method Details

#create_with_allocated_shard(key_field = :id, &block) ⇒ Object

The block passed to this function should return an object responding to key_field



16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/db_charmer/active_record/sharding.rb', line 16

def create_with_allocated_shard(key_field = :id, &block)
  sharder = sharded_connection.sharder
  old_conn = self.db_charmer_allocated_shard_connection
  self.db_charmer_allocated_shard_connection ||= begin
      group = sharder.least_loaded_group
      shard_info = sharder.shard_info_by_group_id(group.id)
      {:group => group, :shard_info => shard_info, :config => sharder.shard_connection_config(shard_info, group.id)}
  end
  # Set global shard connection obj
  key_obj = on_db(self.db_charmer_allocated_shard_connection[:config], nil, &block)
  sharder.allocate_new_block_for_key_on_group(key_obj.send(key_field), self.db_charmer_allocated_shard_connection[:group]) if old_conn.nil?
  self.db_charmer_allocated_shard_connection = old_conn
  key_obj
end

#on_default_shard(proxy_target = nil, &block) ⇒ Object

Run on default shard (if supported by the sharding method)

Raises:

  • (ArgumentError)


32
33
34
35
36
37
38
39
40
# File 'lib/db_charmer/active_record/sharding.rb', line 32

def on_default_shard(proxy_target = nil, &block)
  raise ArgumentError, "No sharded connection configured!" unless sharded_connection

  if sharded_connection.support_default_shard?
    shard_for(:default, proxy_target, &block)
  else
    raise ArgumentError, "This model's sharding method does not support default shard"
  end
end

#on_each_shard(proxy_target = nil, &block) ⇒ Object

Enumerate shards

Raises:

  • (ArgumentError)


43
44
45
46
47
48
49
50
51
52
# File 'lib/db_charmer/active_record/sharding.rb', line 43

def on_each_shard(proxy_target = nil, &block)
  raise ArgumentError, "No sharded connection configured!" unless sharded_connection

  conns = sharded_connection.shard_connections
  raise ArgumentError, "This model's sharding method does not support shards enumeration" unless conns

  conns.each do |conn|
    on_db(conn, proxy_target, &block)
  end
end

#shard_for(key, proxy_target = nil, &block) ⇒ Object

Raises:

  • (ArgumentError)


9
10
11
12
13
# File 'lib/db_charmer/active_record/sharding.rb', line 9

def shard_for(key, proxy_target = nil, &block)
  raise ArgumentError, "No sharded connection configured!" unless sharded_connection
  conn = sharded_connection.sharder.shard_for_key(key)
  on_db(conn, proxy_target, &block)
end