Changeset 160

Show
Ignore:
Timestamp:
02/10/09 00:06:49 (10 months ago)
Author:
swistow
Message:

Merge in branch which allows passing in of existing driver.

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/TheSchwartz.pm

    r152 r160  
    6161    my($list) = @_; 
    6262    for my $ref (@$list) { 
    63         my $full = join '|', map { $ref->{$_} || '' } qw( dsn user pass ); 
     63        my $var; 
     64        my @parts; 
     65        if ($ref->{driver}) { 
     66            my $dbh  = tied(%{$ref->{driver}->dbh}); 
     67            my $dsn  = "dbd:".$dbh->{Driver}->{Name}.":".$dbh->{Name}; 
     68            my $user = $dbh->{Username} || '';  
     69            @parts   = ($dsn, $user);    
     70        } else { 
     71            @parts   = map { $ref->{$_} || '' } qw(dsn user); 
     72        } 
     73        my $full = join '|', @parts; 
    6474        $client->{databases}{ md5_hex($full) } = $ref; 
    6575    } 
     
    7787        my $db = $client->{databases}{$hashdsn} 
    7888            or croak "Ouch, I don't know about a database whose hash is $hashdsn"; 
    79         $driver = Data::ObjectDriver::Driver::DBI->new( 
    80                 dsn      => $db->{dsn}, 
    81                 username => $db->{user}, 
    82                 password => $db->{pass}, 
    83                 ($db->{prefix} ? (prefix   => $db->{prefix}) : ()), 
    84         ); 
     89        if ($db->{driver}) { 
     90            $driver = $db->{driver}; 
     91        } else { 
     92            $driver = Data::ObjectDriver::Driver::DBI->new( 
     93                        dsn      => $db->{dsn}, 
     94                        username => $db->{user}, 
     95                        password => $db->{pass}, 
     96                      ); 
     97        } 
     98        $driver->prefix($db->{prefix}) if exists $db->{prefix}; 
     99 
    85100        if ($cache_duration) { 
    86101            $client->{cached_drivers}{$hashdsn}{driver} = $driver; 
     
    828843appropriate jobs in the other databases automatically. 
    829844 
    830 Each member of the C<databases> value should be a hashref containing: 
     845Each member of the C<databases> value should be a hashref containing either: 
    831846 
    832847=over 4 
     
    843858 
    844859The password to use when connecting to this database. 
     860 
     861=back 
     862 
     863or 
     864 
     865=over 4 
     866 
     867=item * C<driver> 
     868 
     869A C<Data::ObjectDriver::Driver::DBI> object. 
     870 
     871See note below. 
    845872 
    846873=back 
     
    10461073out of scope) 
    10471074 
     1075=head1 PASSING IN AN EXISTING DRIVER 
     1076 
     1077You can pass in a existing C<Data::Object::Driver::DBI> object which also allows you 
     1078to reuse exist Database handles like so: 
     1079 
     1080        my $dbh = DBI->connect( $dsn, "root", "", { 
     1081                RaiseError => 1, 
     1082                PrintError => 0, 
     1083                AutoCommit => 1, 
     1084            } ) or die $DBI::errstr; 
     1085        my $driver = Data::ObjectDriver::Driver::DBI->new( dbh => $dbh); 
     1086        return TheSchwartz->new(databases => [{ driver => $driver }]); 
     1087 
     1088B<Note>: it's important that the C<RaiseError> and C<AutoCommit> flags are  
     1089set on the handle for various bits of functionality to work. 
     1090 
    10481091=head1 COPYRIGHT, LICENSE & WARRANTY 
    10491092 
  • trunk/t/lib/db-common.pl

    r91 r160  
    5353    } 
    5454 
    55     return TheSchwartz->new(databases => [ 
     55    if ($ENV{USE_DBH_FOR_TEST}) { 
     56        my @tmp; 
     57        for (@$dbs) { eval { 
     58            my $dsn    = dsn_for($_);   
     59            my $dbh    = DBI->connect( $dsn, "root", "", { 
     60                RaiseError => 1, 
     61                PrintError => 0, 
     62                AutoCommit => 1, 
     63            } ) or die $DBI::errstr; 
     64            my $driver =  Data::ObjectDriver::Driver::DBI->new( dbh => $dbh);  
     65            push @tmp, { driver => $driver, prefix => $pfx }; 
     66        } } 
     67        return TheSchwartz->new(databases => [@tmp]);  
     68    } else { 
     69        return TheSchwartz->new(databases => [ 
    5670                                          map { { 
    5771                                              dsn  => dsn_for($_), 
     
    6175                                          } } @$dbs 
    6276                                          ]); 
     77    } 
    6378} 
    6479 
  • trunk/t/scoreboard.t

    r151 r160  
    1010use TheSchwartz; 
    1111use File::Spec qw(); 
     12use File::Temp qw(tempdir); 
    1213# create a tmp directory with a unique name.  This stops 
    1314# us conflicting with any other runs of this process and means 
     
    2122    setup_dbs({prefix => $pfx}, $dbs); 
    2223 
    23     my $client = TheSchwartz->new(scoreboard => $tmpdir, 
     24    my $client = TheSchwartz->new(scoreboard => $tempdir, 
    2425                                  databases => [ 
    2526                                          map { {