File Coverage

blib/lib/DBIx/Lite.pm
Criterion Covered Total %
statement 61 89 68.5
branch 14 38 36.8
condition 5 8 62.5
subroutine 16 22 72.7
pod 6 8 75.0
total 102 165 61.8


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