root/lang/perl/DBIx-ShardManager/trunk/lib/DBIx/ShardManager.pm @ 35171

Revision 35171, 2.1 kB (checked in by kazuho, 4 years ago)
Line 
1package DBIx::ShardManager;
2
3use strict;
4use warnings;
5
6use 5.008;
7use Carp;
8use Class::Accessor::Lite;
9
10our $VERSION = 0.01;
11
12our %Defaults = (
13    definition      => undef,
14    # hash of connector->to_conn_id->(\%conn_info) => $dbh
15    _handles        => undef,
16    connector       => undef,
17    _slave_sel_seed => int(rand 0x40000000),
18);
19
20Class::Accessor::Lite->mk_accessors(keys %Defaults);
21
22sub new {
23    my $klass = shift;
24    my $self = bless {
25        %Defaults,
26        @_ == 1 ? %{$_[0]} : @_,
27        _handles => {},
28    }, $klass;
29    confess 'mandatory parameter "definition" is missing'
30        unless $self->definition;
31    $self->definition->manager($self);
32    confess 'mandatory parameter "connector" is missing'
33        unless $self->connector;
34    $self->connector->manager($self);
35    $self;
36}
37
38sub flush {
39    my $self = shift;
40    $self->_handles({});
41}
42
43sub rw_handle {
44    my ($self, $key) = @_;
45    my $conn_info = $self->definition->get_conn_info($key);
46    $conn_info = $conn_info->[0]
47        if ref $conn_info eq 'ARRAY';
48    $self->_handle_for($conn_info);
49}
50
51sub read_handle {
52    my ($self, $key) = @_;
53    my $conn_info = $self->definition->get_conn_info($key);
54    if (ref $conn_info eq 'ARRAY' && @$conn_info > 2) {
55        $conn_info
56            = $conn_info->[1 + $self->_slave_sel_seed % (@$conn_info - 1)];
57    }
58    $self->_handle_for($conn_info);
59}
60
61sub _handle_for {
62    my ($self, $conn_info) = @_;
63    my $ident = $self->connector->to_ident($conn_info);
64    $self->_handles->{$ident} ||= $self->connector->connect($conn_info);
65}
66
671;
68__END__
69
70=head1 NAME
71
72DBIx::ShardManager
73
74=head1 SYNOPSIS
75
76  use DBIx::ShardManager;
77 
78  my $sm = DBIx::ShardManager->new(
79      definition => DBIx::ShardManager::Definition::JSON->new(
80          file        => 'shard_def.json',
81          auto_reload => 1,
82      ),
83      connector  => DBIx::ShardManager::Connector::DBI->new(
84          driver   => 'mysql',
85          dbname   => '...',
86          username => 'db_user',
87          password => 'db_pass',
88          attr     => { mysql_enable_utf8 => 1 },
89      ),
90  );
91 
92  $sm->handle_for($shard_key)->do(
93      'INSERT INTO ...',
94  );
95 
96=cut
Note: See TracBrowser for help on using the browser.