File Coverage

blib/lib/DBIx/QuickORM/RowManager/Cached.pm
Criterion Covered Total %
statement 56 57 98.2
branch 9 12 75.0
condition 16 25 64.0
subroutine 13 13 100.0
pod 0 6 0.0
total 94 113 83.1


line stmt bran cond sub pod time code
1             package DBIx::QuickORM::RowManager::Cached;
2 23     23   179 use strict;
  23         64  
  23         1144  
3 23     23   153 use warnings;
  23         106  
  23         2233  
4              
5             our $VERSION = '0.000019';
6              
7 23     23   186 use Carp qw/croak/;
  23         55  
  23         2003  
8 23     23   163 use Scalar::Util qw/weaken/;
  23         47  
  23         1586  
9              
10 23     23   159 use DBIx::QuickORM::Affinity();
  23         55  
  23         720  
11              
12 23     23   153 use parent 'DBIx::QuickORM::RowManager';
  23         290  
  23         997  
13 23         356 use DBIx::QuickORM::Util::HashBase qw {
14             +cache
15 23     23   1754 };
  23         318  
16              
17 16     16 0 63 sub does_cache { 1 }
18              
19             sub init {
20 23     23 0 63 my $self = shift;
21 23         1058 $self->SUPER::init();
22 23   50     168 $self->{+CACHE} //= {};
23             }
24              
25             sub do_cache_lookup {
26 182     182 0 417 my $self = shift;
27 182         698 my ($source, $fetched, $old_pk, $new_pk, $row) = @_;
28              
29 182   100     1225 my $pk = $old_pk // $new_pk // return;
      100        
30 172 100       1198 my $scache = $self->{+CACHE}->{$source->source_orm_name} or return;
31              
32 148         678 my $cache_key = $self->cache_key($pk);
33              
34 148   100     1187 return $scache->{$cache_key} // undef;
35             }
36              
37             sub cache {
38 166     166 0 359 my $self = shift;
39 166         562 my ($source, $row, $old_pk, $new_pk) = @_;
40              
41 166   100     808 my $scache = $self->{+CACHE}->{$source->source_orm_name} //= {};
42              
43 166 100       627 delete $scache->{$self->cache_key($old_pk)} if $old_pk;
44              
45 166 100       715 return unless $source->primary_key;
46              
47 158   50     531 $new_pk //= [$row->primary_key_value_list];
48 158         552 my $new_key = $self->cache_key($new_pk);
49 158         618 $scache->{$new_key} = $row;
50 158         459 weaken($scache->{$new_key});
51 158         436 return $row;
52             }
53              
54             sub uncache {
55 8     8 0 21 my $self = shift;
56 8         27 my ($source, $row, $old_pk, $new_pk) = @_;
57              
58 8   66     70 my $pk = $old_pk // $new_pk;
59 8 50 33     60 if ($row && !$pk && $row->primary_key) {
      33        
60 0         0 $pk = $row->primary_key_hashref;
61             }
62              
63             # No pk, not a cachable row
64 8 50 33     51 return unless $pk && @$pk;
65              
66 8 50       39 my $scache = $self->{+CACHE}->{$source->source_orm_name} or return;
67              
68 8         25 my $row_key = $self->cache_key($pk);
69 8         35 return delete $scache->{$row_key};
70             }
71              
72             sub cache_key {
73 317     317 0 694 my $self = shift;
74 317         888 my ($pk) = @_;
75              
76 317         11743 my $sep = chr(31);
77 317         901 join $sep => map { my $x = $_; $x =~ s/\Q$sep\E/\\$sep/; $x } @$pk;
  317         603  
  317         6675  
  317         1882  
78             }
79              
80             1;