Changeset 559

Show
Ignore:
Timestamp:
01/24/09 00:30:59 (10 months ago)
Author:
ykerherve
Message:

- Added a new (experimental) GearmanDBI Driver that transports sql to a worker

using Gearman

- Refactored ObjectDriver::Driver::DBI a bit to allow the above

Location:
trunk/lib/Data/ObjectDriver/Driver
Files:
1 added
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/Data/ObjectDriver/Driver/DBI.pm

    r552 r559  
    119119} 
    120120 
    121 sub fetch { 
    122     my $driver = shift; 
    123     my($rec, $class, $orig_terms, $orig_args) = @_; 
     121sub prepare_fetch { 
     122    my $driver = shift; 
     123    my($class, $orig_terms, $orig_args) = @_; 
    124124 
    125125    ## Use (shallow) duplicates so the pre_search trigger can modify them. 
     
    130130    my $stmt = $driver->prepare_statement($class, $terms, $args); 
    131131 
     132    my $sql = $stmt->as_sql; 
     133    $sql .= "\nFOR UPDATE" if $orig_args->{for_update}; 
     134    return ($sql, $stmt->{bind}, $stmt) 
     135} 
     136 
     137sub fetch { 
     138    my $driver = shift; 
     139    my($rec, $class, $orig_terms, $orig_args) = @_; 
     140 
     141    my ($sql, $bind, $stmt) = $driver->prepare_fetch($class, $orig_terms, $orig_args); 
     142 
    132143    my @bind; 
    133144    my $map = $stmt->select_map; 
     
    136147    } 
    137148 
    138     my $sql = $stmt->as_sql; 
    139     $sql .= "\nFOR UPDATE" if $orig_args->{for_update}; 
    140149    my $dbh = $driver->r_handle($class->properties->{db}); 
    141150    $driver->start_query($sql, $stmt->{bind}); 
     151 
    142152    my $sth = $orig_args->{no_cached_prepare} ? $dbh->prepare($sql) : $driver->_prepare_cached($dbh, $sql); 
    143153    $sth->execute(@{ $stmt->{bind} }); 
     
    145155 
    146156    # need to slurp 'offset' rows for DBs that cannot do it themselves 
    147     if (!$driver->dbd->offset_implemented && $args->{offset}) { 
    148         for (1..$args->{offset}) { 
     157    if (!$driver->dbd->offset_implemented && $orig_args->{offset}) { 
     158        for (1..$orig_args->{offset}) { 
    149159            $sth->fetch; 
    150160        } 
     
    152162 
    153163    return $sth; 
     164} 
     165 
     166sub load_object_from_rec { 
     167    my $driver = shift; 
     168    my ($class, $rec, $no_triggers) = @_; 
     169 
     170    my $obj = $class->new; 
     171    $obj->set_values_internal($rec); 
     172    ## Don't need a duplicate as there's no previous version in memory 
     173    ## to preserve. 
     174    $obj->{__is_stored} = 1; 
     175    $obj->call_trigger('post_load') unless $no_triggers; 
     176    return $obj; 
    154177} 
    155178 
     
    172195            return; 
    173196        } 
    174         my $obj; 
    175         $obj = $class->new; 
    176         $obj->set_values_internal($rec); 
    177         ## Don't need a duplicate as there's no previous version in memory 
    178         ## to preserve. 
    179         $obj->{__is_stored} = 1; 
    180         $obj->call_trigger('post_load') unless $args->{no_triggers}; 
    181         $obj; 
     197        return $driver->load_object_from_rec($class, $rec, $args->{no_triggers}); 
    182198    }; 
    183199