sequel-schema-sharding 0.0.4 → 0.2.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72d8c926196bde281cfb5dba3a6227639c1c3cdb
4
- data.tar.gz: 51db28a22be25d6796a4287c7c3886e50d8f92df
3
+ metadata.gz: 9259594ee38417f3162a7b250722bb2f6d784b4b
4
+ data.tar.gz: 7ab7c107c400e6ec46d3cd612bda9097c82e8243
5
5
  SHA512:
6
- metadata.gz: 9b39019d3b9ff7f93cf9c1810ea87a2835b89e44c0d7bd279f931ace4600b296cb26a2ab88ec73acb1a2f1536f9a96c930f64cfeb6206f09806ca9228bb2e590
7
- data.tar.gz: 813908ccaa7724a9cf5974c51047060dd585a04f8beefe80ef0c28e9d7c5e569d9249334197f874a0b4f5891a2c2da9ec5b9ed2346458696a76ff9c9c3a99578
6
+ metadata.gz: e1c5b3345a5ce05accb17231d8981a61b077cfe30f653992dbcfefb71c52689b31c1d9248ac831a2d857fb30fa326bbf383535b2ae5615600e7cc0e734316e2b
7
+ data.tar.gz: 47367a85fe138b51f66a8a60368ef2faf960d4c539117cc972abfc32770562cbab770a29b07cf697892d61d9d3eb07f48c3c422eca68975fa90a021bb6e61b9b
@@ -7,6 +7,7 @@ require 'sequel/schema-sharding/finder'
7
7
  require 'sequel/schema-sharding/sequel_ext'
8
8
  require 'sequel/schema-sharding/model'
9
9
  require 'logger'
10
+ require 'sequel/schema-sharding/logger_proxy'
10
11
 
11
12
  module Sequel
12
13
  module SchemaSharding
@@ -19,7 +20,7 @@ module Sequel
19
20
  end
20
21
 
21
22
  def self.logger
22
- @logger ||= Logger.new($stdout)
23
+ @logger ||= Logger.new(StringIO.new)
23
24
  end
24
25
 
25
26
  def self.logger=(logger)
@@ -11,11 +11,11 @@ module Sequel
11
11
 
12
12
  def [](name)
13
13
  config = db_config_for(name)
14
- @connections[name.to_s] ||= Sequel.postgres(:user => config['username'],
15
- :password => config['password'],
16
- :host => config['host'],
17
- :database => config['database'],
18
- :port => config['port'])
14
+ @connections[name.to_s] ||= Sequel.postgres(master_config_for(config).merge!(replica_hash_for(config)))
15
+ end
16
+
17
+ def master(name)
18
+ @connections["master_#{name}"] ||= Sequel.postgres(master_config_for(db_config_for(name)))
19
19
  end
20
20
 
21
21
  def disconnect
@@ -37,6 +37,27 @@ module Sequel
37
37
 
38
38
  private
39
39
 
40
+ def master_config_for(config)
41
+ {
42
+ :user => config['username'],
43
+ :password => config['password'],
44
+ :host => config['host'],
45
+ :database => config['database'],
46
+ :port => config['port'],
47
+ :single_threaded => true,
48
+ :loggers => [Sequel::SchemaSharding::LoggerProxy.new]
49
+ }
50
+ end
51
+
52
+ def replica_hash_for(config)
53
+ return {} if config['replicas'].nil?
54
+ {
55
+ :servers => {
56
+ :read_only => ->(db) { {:host => config['replicas'].sample} }
57
+ }
58
+ }
59
+ end
60
+
40
61
  def db_config_for(name)
41
62
  config.physical_shard_configs[name]
42
63
  end
@@ -59,7 +59,7 @@ module Sequel
59
59
  config.logical_shard_configs(table_name).each_pair do |shard_number, physical_shard|
60
60
  schema_name = connection_manager.schema_for(table_name, env, shard_number)
61
61
  Sequel::SchemaSharding.logger.info "Creating schema #{schema_name} on #{physical_shard}.."
62
- connection = connection_manager[physical_shard]
62
+ connection = connection_manager.master(physical_shard)
63
63
 
64
64
  begin
65
65
  connection.run("CREATE SCHEMA #{schema_name}")
@@ -0,0 +1,14 @@
1
+ require 'logger'
2
+
3
+ module Sequel
4
+ module SchemaSharding
5
+ class LoggerProxy < ::Logger
6
+ def initialize
7
+ end
8
+
9
+ def add(severity, message = nil, progname = nil, &block)
10
+ Sequel::SchemaSharding.logger.add(severity, message, progname, &block)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -19,6 +19,7 @@ module Sequel
19
19
  klass = Sequel::Model(Sequel::SchemaSharding.connection_manager.default_dataset_for(source))
20
20
 
21
21
  klass.include(SchemaSharding::ShardedModel)
22
+ klass.send(:simple_table=, false)
22
23
 
23
24
  klass
24
25
  end
@@ -85,7 +86,6 @@ module Sequel
85
86
  def _insert_dataset
86
87
  this_server
87
88
  end
88
-
89
89
  end
90
90
  end
91
91
  end
@@ -1,5 +1,5 @@
1
1
  module Sequel
2
2
  module SchemaSharding
3
- VERSION = "0.0.4"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -17,6 +17,8 @@ test:
17
17
  shard2:
18
18
  host: 127.0.0.1
19
19
  database: sequel_test_shard2
20
+ replicas:
21
+ - 127.0.0.1
20
22
  common:
21
23
  username: postgres
22
24
  password: boomboomkaboom
@@ -39,6 +41,8 @@ boom:
39
41
  shard2:
40
42
  host: 127.0.0.1
41
43
  database: sequel_boom_shard2
44
+ replicas:
45
+ - 127.0.0.1
42
46
  common:
43
47
  username: postgres
44
48
  password: boomboomkaboom
@@ -34,6 +34,7 @@ describe Sequel::SchemaSharding::Configuration do
34
34
  expect(value['username']).to eq('postgres')
35
35
  expect(value['password']).to eq('boomboomkaboom')
36
36
  expect(value['port']).to eq(5432)
37
+ expect(value['replicas']).to eq(['127.0.0.1']) if key == 'shard2'
37
38
 
38
39
  i += 1
39
40
  end
@@ -2,22 +2,40 @@ require 'spec_helper'
2
2
  require 'sequel/schema-sharding/connection_manager'
3
3
 
4
4
  describe Sequel::SchemaSharding::ConnectionManager do
5
- let(:config) { Sequel::SchemaSharding::Configuration.new('boom', 'spec/fixtures/test_db_config.yml') }
5
+ let(:config) { Sequel::SchemaSharding::Configuration.new('test', 'spec/fixtures/test_db_config.yml') }
6
6
 
7
7
  subject { Sequel::SchemaSharding::ConnectionManager.new }
8
8
 
9
9
  before { subject.stubs(:config).returns(config) }
10
+ after do
11
+ subject.disconnect
12
+ end
10
13
 
11
14
  describe '#[]' do
12
15
  it 'returns a valid connection instance for the specified physical shard' do
13
16
  expect(subject['shard1']).to be_a(Sequel::Postgres::Database)
17
+ subject['shard1'].execute("SELECT 1")
14
18
  expect(subject['shard2']).to be_a(Sequel::Postgres::Database)
15
19
  end
20
+
21
+ context 'read/write splitting' do
22
+ it 'has a replica for shard2' do
23
+ expect(subject['shard2'].servers).to include(:read_only)
24
+ expect(subject['shard1'].servers).to_not include(:read_only)
25
+ end
26
+
27
+ #it 'executes a select against a replica' do
28
+ # shard = subject['shard2']
29
+ # Sequel::ShardedThreadedConnectionPool.any_instance.expects(:hold).with(:read_only).at_least_once
30
+ # Sequel::ShardedThreadedConnectionPool.any_instance.expects(:hold).with(:default).at_least_once
31
+ # shard[:"sequel_explosions_boof_pickles_3__artists"].first
32
+ #end
33
+ end
16
34
  end
17
35
 
18
36
  describe "#schema_for" do
19
37
  it "returns the schema name based on env and shard number" do
20
- subject.schema_for('boof', 'pickles', 3).should eq 'sequel_explosions_boof_pickles_3'
38
+ subject.schema_for('boof', 'pickles', 3).should eq 'sequel_logical_boof_pickles_3'
21
39
  end
22
40
  end
23
41
 
@@ -27,7 +45,7 @@ describe Sequel::SchemaSharding::ConnectionManager do
27
45
  # This should be deconstructed to allow for injection of a mock config for testing.
28
46
  dataset = subject.default_dataset_for("artists")
29
47
  expect(dataset).to be_a(Sequel::Dataset)
30
- expect(dataset.first_source_table).to eql(:'sequel_explosions_artists_test_1__artists')
48
+ expect(dataset.first_source_table).to eql(:'sequel_logical_artists_test_1__artists')
31
49
  end
32
50
  end
33
51
  end
@@ -16,6 +16,12 @@ describe Sequel::SchemaSharding, 'Model' do
16
16
  'artists'
17
17
  end
18
18
  end
19
+
20
+ klass.class_eval do
21
+ def this
22
+ @this ||= model.by_id(artist_id).limit(1)
23
+ end
24
+ end
19
25
  klass
20
26
  end
21
27
 
@@ -26,6 +32,9 @@ describe Sequel::SchemaSharding, 'Model' do
26
32
  read_back_artist = model.by_id(14).first
27
33
  expect(read_back_artist).to be_a(model)
28
34
  expect(read_back_artist.name).to eql('Paul')
35
+ read_back_artist.destroy
36
+ read_back_artist = model.by_id(14).first
37
+ expect(read_back_artist).to be_nil
29
38
  end
30
39
  end
31
40
 
@@ -34,6 +43,7 @@ describe Sequel::SchemaSharding, 'Model' do
34
43
  artist = model.create(artist_id: 234, name: 'Paul')
35
44
  expect(artist).to be_a(model)
36
45
  expect(artist.name).to eql('Paul')
46
+ artist.destroy
37
47
  end
38
48
  end
39
49
 
data/spec/spec_helper.rb CHANGED
@@ -27,7 +27,7 @@ RSpec.configure do |config|
27
27
  Sequel::SchemaSharding.migration_path = "spec/fixtures/db/migrate"
28
28
  end
29
29
 
30
- config.around :each do |ex|
30
+ config.around :each, type: :transactional do |ex|
31
31
  #Sequel::SchemaSharding.config = Sequel::SchemaSharding::Configuration.new('boom', 'spec/fixtures/test_db_config.yml')
32
32
 
33
33
  # Start transactions in each connection to the physical shards
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel-schema-sharding
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paul Henry
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-09-26 00:00:00.000000000 Z
13
+ date: 2013-09-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: sequel
@@ -94,6 +94,7 @@ files:
94
94
  - lib/sequel/schema-sharding/connection_manager.rb
95
95
  - lib/sequel/schema-sharding/database_manager.rb
96
96
  - lib/sequel/schema-sharding/finder.rb
97
+ - lib/sequel/schema-sharding/logger_proxy.rb
97
98
  - lib/sequel/schema-sharding/model.rb
98
99
  - lib/sequel/schema-sharding/ring.rb
99
100
  - lib/sequel/schema-sharding/sequel_ext.rb
@@ -131,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
131
132
  version: '0'
132
133
  requirements: []
133
134
  rubyforge_project:
134
- rubygems_version: 2.0.3
135
+ rubygems_version: 2.0.7
135
136
  signing_key:
136
137
  specification_version: 4
137
138
  summary: Create horizontally sharded Sequel models with Postgres