Changeset 33708

Show
Ignore:
Timestamp:
06/01/09 20:52:56 (4 years ago)
Author:
yappo
Message:

add transaction support for Driver::DBI::MasterSlave?

Location:
lang/perl/Data-Model/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Data-Model/trunk/lib/Data/Model/Driver/DBI.pm

    r33707 r33708  
    435435sub txn_begin { 
    436436    my $self = shift; 
     437    $self->{active_transaction} = 1; 
    437438    my $dbh = $self->rw_handle; 
    438439    eval { $dbh->begin_work } or Carp::croak $@; 
     
    441442sub txn_rollback { 
    442443    my $self = shift; 
     444    return unless $self->{active_transaction}; 
    443445    my $dbh = $self->rw_handle; 
    444446    eval { $dbh->rollback } or Carp::croak $@; 
     
    447449sub txn_commit { 
    448450    my $self = shift; 
     451    return unless $self->{active_transaction}; 
    449452    my $dbh = $self->rw_handle; 
    450453    eval { $dbh->commit } or Carp::croak $@; 
    451454} 
    452455 
     456sub txn_end { 
     457    $_[0]->{active_transaction} = 0; 
     458} 
     459 
    4534601; 
  • lang/perl/Data-Model/trunk/lib/Data/Model/Driver/DBI/MasterSlave.pm

    r32089 r33708  
    2222 
    2323sub rw_handle { $_[0]->_get_dbh('master') }; 
    24 sub r_handle  { $_[0]->_get_dbh('slave') }; 
     24# トランザクション中は master のみを返す 
     25sub r_handle  { $_[0]->_get_dbh( $_[0]->{active_transaction} ? 'master' : 'slave' ) }; 
    2526 
    26271; 
  • lang/perl/Data-Model/trunk/t/030_dbi/master_slave.t

    r32089 r33708  
    2222    use Data::Model::Schema; 
    2323 
     24    base_driver $driver; 
    2425    install_model counter => schema { 
    25         driver $driver; 
    2626        key 'id'; 
    2727        column id 
     
    3333                default => 0, 
    3434            }; 
     35    }; 
     36 
     37    install_model user => schema { 
     38        key 'name'; 
     39 
     40        columns qw/ name nickname /; 
     41 
     42        schema_options create_sql_attributes => { 
     43            mysql => 'TYPE=InnoDB', 
     44        }; 
    3545    }; 
    3646} 
     
    8292        }; 
    8393    } 
     94 
     95    sub t_11_transaction : Tests(11) { 
     96        isnt($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle != r_handle'); 
     97         
     98        my $scope = $model->txn_scope; 
     99        is($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle == r_handle'); 
     100        $scope->rollback; 
     101        isnt($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle != r_handle'); 
     102 
     103        $model->txn_scope; 
     104        isnt($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle != r_handle'); 
     105 
     106        do { 
     107            my $scope = $model->txn_scope; 
     108            is($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle == r_handle'); 
     109        }; 
     110        isnt($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle != r_handle'); 
     111 
     112 
     113        $scope = $model->txn_scope; 
     114        $scope->set( user => { name => 'osawa', nickname => 'yappo' } ); 
     115        my($get) = $scope->get( user => 'osawa' ); 
     116        is($get->nickname, 'yappo', 'get from rw_handle'); 
     117        $scope->commit; 
     118        isnt($model->get_base_driver->rw_handle, $model->get_base_driver->r_handle, 'rw_handle != r_handle'); 
     119 
     120        ($get) = $model->get( user => 'osawa' ); 
     121        ok(!$get, 'get from r_handle'); 
     122 
     123        $scope = $model->txn_scope; 
     124        ($get) = $scope->get( user => 'osawa' ); 
     125        is($get->nickname, 'yappo', 'get from rw_handle'); 
     126        $scope->rollback; 
     127 
     128        ($get) = $model->get( user => 'osawa' ); 
     129        ok(!$get, 'get from r_handle'); 
     130    } 
    84131} 
    85132