Changeset 479
- Timestamp:
- 05/15/08 17:22:31 (6 months ago)
- Files:
-
- trunk/lib/Data/ObjectDriver/Driver/BaseCache.pm (modified) (7 diffs)
- trunk/lib/Data/ObjectDriver/Driver/DBI.pm (modified) (3 diffs)
- trunk/lib/Data/ObjectDriver/Driver/Partition.pm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/lib/Data/ObjectDriver/Driver/BaseCache.pm
r478 r479 10 10 use Carp (); 11 11 12 __PACKAGE__->mk_accessors(qw( cache fallback txn_active txn_buffer));12 __PACKAGE__->mk_accessors(qw( cache fallback )); 13 13 __PACKAGE__->mk_classdata(qw( Disabled )); 14 14 … … 30 30 $driver->fallback($param{fallback}) 31 31 or Carp::croak("fallback is required"); 32 $driver->txn_active(0);33 $driver->txn_buffer([]);34 32 $driver; 35 }36 37 sub begin_work {38 my $driver = shift;39 40 my $rv = $driver->fallback->begin_work(@_);41 $driver->txn_active(1);42 return $rv;43 }44 45 sub commit {46 my $driver = shift;47 my $rv = $driver->fallback->commit(@_);48 49 while (my $cb = shift @{$driver->txn_buffer}) {50 $cb->();51 }52 $driver->txn_active(0);53 54 return $rv;55 }56 57 sub rollback {58 my $driver = shift;59 my $rv = $driver->fallback->rollback(@_);60 61 $driver->txn_buffer([]);62 $driver->txn_active(0);63 64 return $rv;65 33 } 66 34 … … 73 41 ## all layers below this, as well. 74 42 unless (exists $obj->{__cached} && $obj->{__cached}{ref $driver}) { 75 $driver->modify_cache(sub { 76 $driver->add_to_cache( 43 $driver->add_to_cache( 77 44 $driver->cache_key(ref($obj), $obj->primary_key), 78 45 $driver->deflate($obj) 79 46 ); 80 });81 47 $driver->fallback->cache_object($obj); 82 48 } … … 201 167 my $ret = $driver->fallback->update($obj); 202 168 my $key = $driver->cache_key(ref($obj), $obj->primary_key); 203 $driver->modify_cache(sub { 204 $driver->update_cache($key, $driver->deflate($obj)); 205 }); 169 $driver->update_cache($key, $driver->deflate($obj)); 206 170 return $ret; 207 171 } … … 218 182 if ($has_pk) { 219 183 my $key = $driver->cache_key(ref($obj), $obj->primary_key); 220 $driver->modify_cache(sub { 221 $driver->update_cache($key, $driver->deflate($obj)); 222 }); 184 $driver->update_cache($key, $driver->deflate($obj)); 223 185 } 224 186 return $ret; … … 247 209 my($obj) = @_; 248 210 my $key = $driver->cache_key(ref($obj), $obj->primary_key); 249 return $driver->modify_cache(sub { 250 delete $obj->{__cached}; 251 $driver->remove_from_cache($key); 252 $driver->fallback->uncache_object($obj); 253 }); 211 delete $obj->{__cached}; 212 $driver->remove_from_cache($key); 213 $driver->fallback->uncache_object($obj); 214 return; 254 215 } 255 216 … … 265 226 } 266 227 return $key; 267 }268 269 # if we're operating within a transaction then we need to buffer CRUD270 # and only commit to the cache upon commit271 sub modify_cache {272 my ($driver, $cb) = @_;273 unless ($driver->txn_active) {274 return $cb->();275 }276 push @{$driver->txn_buffer} => $cb;277 228 } 278 229 trunk/lib/Data/ObjectDriver/Driver/DBI.pm
r478 r479 525 525 my $driver = shift; 526 526 my $dbh = $driver->dbh; 527 528 527 unless ($dbh) { 529 528 $driver->{__delete_dbh_after_txn} = 1; … … 531 530 $driver->dbh($dbh); 532 531 } 533 return unless $dbh->{AutoCommit};534 535 532 eval { 536 533 $dbh->begin_work; 537 534 }; 538 if ( my $err =$@) {535 if ($@) { 539 536 $driver->rollback; 540 Carp::croak("Begin work failed for driver $driver: $ err");537 Carp::croak("Begin work failed for driver $driver: $@"); 541 538 } 542 539 } … … 548 545 my $driver = shift; 549 546 my($action) = @_; 550 551 547 my $dbh = $driver->dbh 552 548 or Carp::croak("$action called without a stored handle--begin_work?"); 553 554 return if $dbh->{AutoCommit};555 556 549 eval { $dbh->$action() }; 557 550 if ($@) { trunk/lib/Data/ObjectDriver/Driver/Partition.pm
r478 r479 27 27 my($class, $ids) = @_; 28 28 $driver->get_driver->($ids->[0])->lookup_multi($class, $ids); 29 }30 31 sub begin_work {32 my $driver = shift;33 $driver->_do_txn('begin_work', @_);34 }35 36 sub commit {37 my $driver = shift;38 $driver->_do_txn('commit', @_);39 }40 41 sub rollback {42 my $driver = shift;43 $driver->_do_txn('rollback', @_);44 }45 46 sub _do_txn {47 my ($driver, $method, $pk_cb) = @_;48 croak("Partition->$method requires a PK callback")49 unless ref $pk_cb eq 'CODE';50 51 my $id = $pk_cb->();52 $driver->get_driver->($id)->$method;53 54 29 } 55 30
