File Coverage

blib/lib/DBIx/Lite.pm
Criterion Covered Total %
statement 59 87 67.8
branch 11 34 32.3
condition 3 5 60.0
subroutine 16 22 72.7
pod 6 8 75.0
total 95 156 60.9


line stmt bran cond sub pod time code
1             package DBIx::Lite;
2             $DBIx::Lite::VERSION = '0.33';
3             # ABSTRACT: Chained and minimal ORM
4 3     3   226723 use strict;
  3         22  
  3         96  
5 3     3   18 use warnings;
  3         5  
  3         108  
6              
7 3     3   17 use Carp qw(croak);
  3         5  
  3         181  
8 3     3   1773 use DBIx::Connector;
  3         79125  
  3         102  
9 3     3   1683 use DBIx::Lite::ResultSet;
  3         8  
  3         103  
10 3     3   1451 use DBIx::Lite::Row;
  3         66  
  3         104  
11 3     3   1429 use DBIx::Lite::Schema;
  3         6  
  3         94  
12 3     3   2306 use SQL::Abstract::More;
  3         101758  
  3         13  
13              
14             $Carp::Internal{$_}++ for __PACKAGE__, qw(DBIx::Connector);
15              
16             sub new {
17 3     3 1 21528 my $class = shift;
18 3         9 my (%params) = @_;
19            
20             my $self = {
21             schema => delete $params{schema} || DBIx::Lite::Schema->new,
22             abstract => SQL::Abstract::More->new(
23 3 50       34 %{ delete $params{abstract} || {} },
24             ),
25             connector => delete $params{connector},
26             dbh => delete $params{dbh},
27 3   33     32 };
28            
29 3 50       1702 !%params
30             or croak "Unknown options: " . join(', ', keys %params);
31            
32 3 50       17 ref $self->{schema} eq 'DBIx::Lite::Schema'
33             or croak "schema must be a DBIx::Lite::Schema object";
34            
35 3         7 bless $self, $class;
36 3         11 $self;
37             }
38              
39             sub connect {
40 2     2 1 13 my $class = shift;
41 2 50       8 my $self = ref $class ? $class : $class->new;
42            
43 2         16 $self->{connector} = DBIx::Connector->new(@_);
44 2         40 $self->{dbh} = undef;
45 2 50       8 $self->dbh(1) or return undef;
46 2     0   15 $self->dbh->{HandleError} = sub { croak $_[0] };
  0         0  
47            
48 2         8 $self;
49             }
50              
51             sub schema {
52 31     31 1 1619 my $self = shift;
53 31 50       109 if (ref $_[0] eq 'DBIx::Lite::Schema') {
54 0         0 $self->{schema} = $_[0];
55 0         0 return $self;
56             }
57 31         195 $self->{schema};
58             }
59              
60             sub table {
61 24     24 1 8716 my $self = shift;
62 24 50       162 my $table_name = shift or croak "Table name missing";
63            
64 24         104 my $table = $self->schema->table($table_name);
65 24   100     129 my $package = $table->resultset_class || 'DBIx::Lite::ResultSet';
66 24         178 $package->_new(
67             dbix_lite => $self,
68             table => $table,
69             );
70             }
71              
72             sub dbh {
73 63     63 1 129 my $self = shift;
74 63         126 my ($dont_die) = @_;
75            
76             my $dbh = $self->{dbh} ? $self->{dbh}
77             : $self->{connector} ? $self->{connector}->dbh
78 63 50       347 : undef;
    50          
79 63 0       32194 return $dbh ? $dbh
    50          
80             : $dont_die ? undef
81             : croak "No database handle or DBIx::Connector object provided";
82             }
83              
84             sub dbh_do {
85 23     23 0 48 my $self = shift;
86 23         35 my $code = shift;
87            
88 23 50       88 if ($self->{connector}) {
89 23         112 return $self->{connector}->run($code);
90             } else {
91 0         0 $_ = $self->dbh;
92 0         0 return $code->();
93             }
94             }
95              
96             sub txn {
97 0     0 1 0 my $self = shift;
98 0         0 my $code = shift;
99            
100 0 0       0 if ($self->{connector}) {
101 0         0 return $self->{connector}->txn($code);
102             } else {
103 0         0 $self->dbh->begin_work;
104 0         0 eval { $code->() };
  0         0  
105 0 0       0 if (my $err = $@) {
106 0         0 eval { $self->dbh->rollback };
  0         0  
107 0         0 croak $err;
108             }
109 0         0 $self->dbh->commit;
110             }
111             }
112              
113             sub driver_name {
114 30     30 0 55 my $self = shift;
115            
116 30         81 return $self->dbh->{Driver}->{Name};
117             }
118              
119             sub _autopk {
120 0     0   0 my $self = shift;
121 0         0 my $table_name = shift;
122            
123 0         0 my $driver_name = $self->driver_name;
124            
125 0 0       0 if ($driver_name eq 'mysql') {
    0          
    0          
126 0     0   0 return $self->dbh_do(sub { +($_->selectrow_array('SELECT LAST_INSERT_ID()'))[0] });
  0         0  
127             } elsif ($driver_name eq 'SQLite') {
128 0     0   0 return $self->dbh_do(sub { +($_->selectrow_array('SELECT LAST_INSERT_ROWID()'))[0] });
  0         0  
129             } elsif ($driver_name eq 'Pg') {
130 0     0   0 return $self->dbh_do(sub { $_->last_insert_id( undef, undef, $table_name, undef ) });
  0         0  
131             } else {
132 0         0 croak "Autoincrementing ID is not supported on $driver_name";
133             }
134             }
135              
136             sub _quote {
137 4     4   12 my $self = shift;
138            
139 4         28 return $self->{abstract}->_quote(@_);
140             }
141              
142             1;
143              
144             __END__