File Coverage

blib/lib/Data/Model/Transaction.pm
Criterion Covered Total %
statement 44 45 97.7
branch 11 14 78.5
condition 2 3 66.6
subroutine 9 9 100.0
pod 0 3 0.0
total 66 74 89.1


line stmt bran cond sub pod time code
1             package Data::Model::Transaction;
2 74     233   369 use strict;
  74         131  
  74         2272  
3              
4 74     74   359 use Carp ();
  74         132  
  74         20291  
5             $Carp::Internal{(__PACKAGE__)}++;
6              
7             sub new {
8 33     33 0 219 my($class, $model) = @_;
9 33         211 $model->txn_begin;
10 33         1419 bless [ 0, $model, ], $class;
11             }
12              
13             sub rollback {
14 10 50   10 0 2957 return if $_[0]->[0];
15 10         95 $_[0]->[1]->txn_rollback;
16 10         85 $_[0]->[0] = 1;
17             }
18              
19             sub commit {
20 11 50   11 0 2270 return if $_[0]->[0];
21 11         108 $_[0]->[1]->txn_commit;
22 11         453 $_[0]->[0] = 1;
23             }
24              
25             sub DESTROY {
26 33     33   15163 my($dismiss, $model) = @{ $_[0] };
  33         108  
27 33 100       210 return if $dismiss;
28              
29             {
30 12         25 local $@;
  12         24  
31 12         25 eval { $model->txn_rollback };
  12         78  
32 12         31 my $rollback_exception = $@;
33 12 50       82 if($rollback_exception) {
34 0         0 Carp::croak "Rollback failed: ${rollback_exception}";
35             }
36             }
37             }
38              
39             # handle of Data::Model model methods
40             my @model_methods = qw/
41             lookup lookup_multi get get_multi
42             set set_multi replace update update_direct
43             delete delete_direct delete_multi
44             /;
45             for my $method (@model_methods) {
46 74     74   396 no strict 'refs';
  74         148  
  74         2883  
47             *{$method} = sub {
48 74     74   385 use strict;
  74         121  
  74         16923  
49 107     107   52049 my $self = shift;
50              
51             # check the on transaction
52 107 100       8981 Carp::croak "You cannot use $method method, Because you leave the transaction scope." if $self->[0];
53              
54             # check driver
55 59         124 my $datamodel = $self->[1];
56 59         110 my $model = $_[0];
57 59         80 my $driver;
58 59 100 66     455 if (ref($model) && $model->isa('Data::Model::Row')) {
59 8         80 my $schema = $datamodel->_get_schema_by_row($model);
60 8         51 $model = $schema->model;
61 8         37 $driver = $schema->driver;
62             } else {
63 51         302 $driver = $datamodel->get_schema($model)->driver;
64             }
65 59 100       271 unless (($datamodel->get_base_driver)+0 == $driver+0) {
66 2         482 Carp::croak "'$model' has driver is not same base_driver";
67             }
68              
69 57         217 local $datamodel->{active_transaction} = 0;
70 57         384 $datamodel->$method(@_);
71             };
72             }
73              
74             1;
75              
76             __END__