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.32';
3             # ABSTRACT: Chained and minimal ORM
4 3     3   213770 use strict;
  3         25  
  3         91  
5 3     3   15 use warnings;
  3         14  
  3         107  
6              
7 3     3   18 use Carp qw(croak);
  3         5  
  3         166  
8 3     3   1610 use DBIx::Connector;
  3         76064  
  3         126  
9 3     3   1735 use DBIx::Lite::ResultSet;
  3         11  
  3         116  
10 3     3   1529 use DBIx::Lite::Row;
  3         26  
  3         107  
11 3     3   1258 use DBIx::Lite::Schema;
  3         9  
  3         90  
12 3     3   2026 use SQL::Abstract::More;
  3         127419  
  3         2625  
13              
14             $Carp::Internal{$_}++ for __PACKAGE__, qw(DBIx::Connector);
15              
16             sub new {
17 3     3 1 20930 my $class = shift;
18 3         12 my (%params) = @_;
19            
20             my $self = {
21             schema => delete $params{schema} || DBIx::Lite::Schema->new,
22             abstract => SQL::Abstract::More->new(
23 3 50       36 %{ delete $params{abstract} || {} },
24             ),
25             connector => delete $params{connector},
26             dbh => delete $params{dbh},
27 3   33     34 };
28            
29 3 50       1023 !%params
30             or croak "Unknown options: " . join(', ', keys %params);
31            
32 3 50       19 ref $self->{schema} eq 'DBIx::Lite::Schema'
33             or croak "schema must be a DBIx::Lite::Schema object";
34            
35 3         8 bless $self, $class;
36 3         10 $self;
37             }
38              
39             sub connect {
40 2     2 1 12 my $class = shift;
41 2 50       9 my $self = ref $class ? $class : $class->new;
42            
43 2         16 $self->{connector} = DBIx::Connector->new(@_);
44 2         38 $self->{dbh} = undef;
45 2 50       17 $self->dbh(1) or return undef;
46 2     0   36 $self->dbh->{HandleError} = sub { croak $_[0] };
  0         0  
47            
48 2         9 $self;
49             }
50              
51             sub schema {
52 31     31 1 1214 my $self = shift;
53 31 50       92 if (ref $_[0] eq 'DBIx::Lite::Schema') {
54 0         0 $self->{schema} = $_[0];
55 0         0 return $self;
56             }
57 31         140 $self->{schema};
58             }
59              
60             sub table {
61 24     24 1 7048 my $self = shift;
62 24 50       72 my $table_name = shift or croak "Table name missing";
63            
64 24         66 my $table = $self->schema->table($table_name);
65 24   100     72 my $package = $table->resultset_class || 'DBIx::Lite::ResultSet';
66 24         108 $package->_new(
67             dbix_lite => $self,
68             table => $table,
69             );
70             }
71              
72             sub dbh {
73 63     63 1 111 my $self = shift;
74 63         117 my ($dont_die) = @_;
75            
76             my $dbh = $self->{dbh} ? $self->{dbh}
77             : $self->{connector} ? $self->{connector}->dbh
78 63 50       272 : undef;
    50          
79 63 0       30404 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 38 my $self = shift;
86 23         37 my $code = shift;
87            
88 23 50       53 if ($self->{connector}) {
89 23         78 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 43 my $self = shift;
115            
116 30         53 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   8 my $self = shift;
138            
139 4         17 return $self->{abstract}->_quote(@_);
140             }
141              
142             1;
143              
144             __END__