File Coverage

blib/lib/SQL/Preproc/ExceptContainer.pm
Criterion Covered Total %
statement 28 53 52.8
branch 0 10 0.0
condition 0 3 0.0
subroutine 5 9 55.5
pod 0 4 0.0
total 33 79 41.7


line stmt bran cond sub pod time code
1             #
2             # SQL::Preproc::ExceptContainer - a container for exception
3             # objects so scope gets cleaned up properly
4             #
5             package SQL::Preproc::ExceptContainer;
6              
7 7     7   19848 use SQL::Preproc::Exception;
  7         16  
  7         212  
8 7     7   42 use strict;
  7         15  
  7         4915  
9             our $VERSION = '0.10';
10              
11             sub new_SQLERROR {
12             #
13             # use an array, since we're pretty final
14             # and it uses much less memory
15             #
16 0     0 0 0 my $obj = [];
17 0         0 bless $obj, shift;
18 0         0 $obj->[0] = shift; # sqlpp_ctxt
19 0         0 $obj->[1] = SQL::Preproc::Exception->new($obj->[0], @_);
20 0         0 push @{$obj->[0]->{SQLERROR}}, $obj->[1];
  0         0  
21 0         0 return $obj;
22             }
23              
24             sub new_NOTFOUND {
25             #
26             # use an array, since we're pretty final
27             # and it uses much less memory
28             #
29 0     0 0 0 my $obj = [];
30 0         0 bless $obj, shift;
31 0         0 $obj->[0] = shift; # sqlpp_ctxt
32 0         0 $obj->[1] = SQL::Preproc::Exception->new($obj->[0], @_);
33 0         0 push @{$obj->[0]->{NOTFOUND}}, $obj->[1];
  0         0  
34 0         0 return $obj;
35             }
36              
37             sub DESTROY {
38 14     14   31 my $obj = shift;
39             #
40             # remove the Exception object from us *and*
41             # from the sqlpp_ctxt
42             #
43 14         30 my $ctxt = $obj->[0];
44 14         27 my $except = $obj->[1];
45 14         25 $obj->[0] = undef;
46 14         29 $obj->[1] = undef;
47             #
48             # in theory we should be at the top of the stack, but
49             # to be safe, we'll splice anyway
50             # also note that we don't permit the base handler to
51             # be destroyed
52             #
53 14         27 foreach (1..$#{$ctxt->{SQLERROR}}) {
  14         58  
54 0 0       0 splice (@{$ctxt->{SQLERROR}}, $_, 1),
  0         0  
55             return 1
56             if ($ctxt->{SQLERROR}[$_] eq $except);
57             }
58            
59 14         28 foreach (1..$#{$ctxt->{NOTFOUND}}) {
  14         44  
60 0 0       0 splice (@{$ctxt->{NOTFOUND}}, $_, 1),
  0         0  
61             return 1
62             if ($ctxt->{NOTFOUND}[$_] eq $except);
63             }
64             #
65             # the exception will be destroyed now
66             #
67 14         75 1;
68             }
69             #
70             # default handlers
71             # SQLERROR: die
72             # NOTFOUND: silently ignore
73             #
74             sub default_SQLERROR {
75 7     7 0 197 my $obj = [];
76 7         27 bless $obj, shift;
77 7         49 $obj->[0] = shift; # sqlpp_ctxt
78             $obj->[1] = SQL::Preproc::Exception->new($obj->[0],
79             sub {
80 0     0   0 my ($obj, $err, $state, $errstr) = @_;
81 0 0       0 $err = '(Unknown error)' unless defined($err);
82 0 0 0     0 $state = '(Unknown state)' unless (defined($state) && ($state ne ''));
83 0 0       0 $errstr = '(No error message)' unless defined($errstr);
84 0         0 my ($pkg, $subr, $line) = caller(1);
85            
86 0         0 die "Error $err (SQLSTATE $state): $errstr
87             at $pkg\:\:$subr: $line";
88 7         135 });
89 7         27 $obj->[0]{SQLERROR}[0] = $obj->[1];
90 7         42 return $obj;
91             }
92              
93             sub default_NOTFOUND {
94 7     7 0 20 my $obj = [];
95 7         22 bless $obj, shift;
96 7         23 $obj->[0] = shift; # sqlpp_ctxt
97             $obj->[1] = SQL::Preproc::Exception->new($obj->[0],
98 7     0   80 sub { return 1; });
  0         0  
99 7         27 $obj->[0]{NOTFOUND}[0] = $obj->[1];
100 7         26 return $obj;
101             }
102              
103             1;