File Coverage

blib/lib/DBIx/Class/Storage/DBI/Informix.pm
Criterion Covered Total %
statement 21 59 35.5
branch 0 4 0.0
condition 0 12 0.0
subroutine 7 20 35.0
pod 3 3 100.0
total 31 98 31.6


line stmt bran cond sub pod time code
1             package DBIx::Class::Storage::DBI::Informix;
2 3     3   1793 use strict;
  3         6  
  3         77  
3 3     3   10 use warnings;
  3         4  
  3         82  
4              
5 3     3   14 use base qw/DBIx::Class::Storage::DBI/;
  3         4  
  3         207  
6 3     3   16 use mro 'c3';
  3         3  
  3         13  
7              
8 3     3   479 use Scope::Guard ();
  3         419  
  3         44  
9 3     3   11 use Context::Preserve 'preserve_context';
  3         4  
  3         152  
10 3     3   48 use namespace::clean;
  3         3  
  3         17  
11              
12             __PACKAGE__->sql_limit_dialect ('SkipFirst');
13             __PACKAGE__->sql_quote_char ('"');
14             __PACKAGE__->datetime_parser_type (
15             'DBIx::Class::Storage::DBI::Informix::DateTime::Format'
16             );
17              
18              
19             __PACKAGE__->mk_group_accessors('simple' => '__last_insert_id');
20              
21             =head1 NAME
22              
23             DBIx::Class::Storage::DBI::Informix - Base Storage Class for Informix Support
24              
25             =head1 DESCRIPTION
26              
27             This class implements storage-specific support for the Informix RDBMS
28              
29             =head1 METHODS
30              
31             =cut
32              
33             sub _execute {
34 0     0     my $self = shift;
35 0           my ($rv, $sth, @rest) = $self->next::method(@_);
36              
37 0 0         $self->__last_insert_id($sth->{ix_sqlerrd}[1])
38             if $self->_perform_autoinc_retrieval;
39              
40 0 0         return (wantarray ? ($rv, $sth, @rest) : $rv);
41             }
42              
43             sub last_insert_id {
44 0     0 1   shift->__last_insert_id;
45             }
46              
47             sub _exec_svp_begin {
48 0     0     my ($self, $name) = @_;
49              
50 0           $self->_dbh->do("SAVEPOINT $name");
51             }
52              
53             # can't release savepoints
54 0     0     sub _exec_svp_release { 1 }
55              
56             sub _exec_svp_rollback {
57 0     0     my ($self, $name) = @_;
58              
59 0           $self->_dbh->do("ROLLBACK TO SAVEPOINT $name")
60             }
61              
62             sub with_deferred_fk_checks {
63 0     0 1   my ($self, $sub) = @_;
64              
65 0           my $txn_scope_guard = $self->txn_scope_guard;
66              
67 0           $self->_do_query('SET CONSTRAINTS ALL DEFERRED');
68              
69             my $sg = Scope::Guard->new(sub {
70 0     0     $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE');
71 0           });
72              
73 0     0     return preserve_context { $sub->() } after => sub { $txn_scope_guard->commit };
  0            
  0            
74             }
75              
76             =head2 connect_call_datetime_setup
77              
78             Used as:
79              
80             on_connect_call => 'datetime_setup'
81              
82             In L to set the C and
83             C formats.
84              
85             Sets the following environment variables:
86              
87             GL_DATE="%m/%d/%Y"
88             GL_DATETIME="%Y-%m-%d %H:%M:%S%F5"
89              
90             The C and C environment variables are cleared.
91              
92             B setting the C environment variable seems to have no effect
93             after the process has started, so the default format is used. The C
94             setting does take effect however.
95              
96             The C data type supports up to 5 digits after the decimal point for
97             second precision, depending on how you have declared your column. The full
98             possible precision is used.
99              
100             The column declaration for a C with maximum precision is:
101              
102             column_name DATETIME YEAR TO FRACTION(5)
103              
104             The C data type stores the date portion only, and it B be declared
105             with:
106              
107             data_type => 'date'
108              
109             in your Result class.
110              
111             You will need the L module for inflation to work.
112              
113             =cut
114              
115             sub connect_call_datetime_setup {
116 0     0 1   my $self = shift;
117              
118 0           delete @ENV{qw/DBDATE DBCENTURY/};
119              
120 0           $ENV{GL_DATE} = "%m/%d/%Y";
121 0           $ENV{GL_DATETIME} = "%Y-%m-%d %H:%M:%S%F5";
122             }
123              
124             package # hide from PAUSE
125             DBIx::Class::Storage::DBI::Informix::DateTime::Format;
126              
127             my $timestamp_format = '%Y-%m-%d %H:%M:%S.%5N'; # %F %T
128             my $date_format = '%m/%d/%Y';
129              
130             my ($timestamp_parser, $date_parser);
131              
132             sub parse_datetime {
133 0     0     shift;
134 0           require DateTime::Format::Strptime;
135 0   0       $timestamp_parser ||= DateTime::Format::Strptime->new(
136             pattern => $timestamp_format,
137             on_error => 'croak',
138             );
139 0           return $timestamp_parser->parse_datetime(shift);
140             }
141              
142             sub format_datetime {
143 0     0     shift;
144 0           require DateTime::Format::Strptime;
145 0   0       $timestamp_parser ||= DateTime::Format::Strptime->new(
146             pattern => $timestamp_format,
147             on_error => 'croak',
148             );
149 0           return $timestamp_parser->format_datetime(shift);
150             }
151              
152             sub parse_date {
153 0     0     shift;
154 0           require DateTime::Format::Strptime;
155 0   0       $date_parser ||= DateTime::Format::Strptime->new(
156             pattern => $date_format,
157             on_error => 'croak',
158             );
159 0           return $date_parser->parse_datetime(shift);
160             }
161              
162             sub format_date {
163 0     0     shift;
164 0           require DateTime::Format::Strptime;
165 0   0       $date_parser ||= DateTime::Format::Strptime->new(
166             pattern => $date_format,
167             on_error => 'croak',
168             );
169 0           return $date_parser->format_datetime(shift);
170             }
171              
172             =head1 FURTHER QUESTIONS?
173              
174             Check the list of L.
175              
176             =head1 COPYRIGHT AND LICENSE
177              
178             This module is free software L
179             by the L. You can
180             redistribute it and/or modify it under the same terms as the
181             L.
182              
183             =cut
184              
185             1;
186