File Coverage

blib/lib/DBIx/Class/Storage/DBI/ACCESS.pm
Criterion Covered Total %
statement 21 50 42.0
branch 0 10 0.0
condition 0 2 0.0
subroutine 7 15 46.6
pod 3 3 100.0
total 31 80 38.7


line stmt bran cond sub pod time code
1             package DBIx::Class::Storage::DBI::ACCESS;
2              
3 4     4   2099 use strict;
  4         10  
  4         116  
4 4     4   21 use warnings;
  4         6  
  4         111  
5 4     4   19 use base 'DBIx::Class::Storage::DBI::UniqueIdentifier';
  4         7  
  4         1473  
6 4     4   26 use mro 'c3';
  4         10  
  4         18  
7              
8 4     4   3491 use DBI ();
  4         35415  
  4         108  
9 4     4   34 use List::Util 'first';
  4         9  
  4         261  
10 4     4   24 use namespace::clean;
  4         8  
  4         27  
11              
12             __PACKAGE__->sql_limit_dialect ('Top');
13             __PACKAGE__->sql_maker_class('DBIx::Class::SQLMaker::ACCESS');
14             __PACKAGE__->sql_quote_char ([qw/[ ]/]);
15              
16 0     0 1   sub sqlt_type { 'ACCESS' }
17              
18             __PACKAGE__->new_guid(undef);
19              
20             =head1 NAME
21              
22             DBIx::Class::Storage::DBI::ACCESS - Support specific to MS Access
23              
24             =head1 DESCRIPTION
25              
26             This is the base class for Microsoft Access support.
27              
28             This driver supports L<last_insert_id|DBIx::Class::Storage::DBI/last_insert_id>,
29             empty inserts for tables with C<AUTOINCREMENT> columns, nested transactions via
30             L<auto_savepoint|DBIx::Class::Storage::DBI/auto_savepoint>, C<GUID> columns via
31             L<DBIx::Class::Storage::DBI::UniqueIdentifier>.
32              
33             =head1 SUPPORTED VERSIONS
34              
35             This module has currently only been tested on MS Access 2010.
36              
37             Information about how well it works on different version of MS Access is welcome
38             (write the mailing list, or submit a ticket to RT if you find bugs.)
39              
40             =head1 USING GUID COLUMNS
41              
42             If you have C<GUID> PKs or other C<GUID> columns with
43             L<auto_nextval|DBIx::Class::ResultSource/auto_nextval> you will need to set a
44             L<new_guid|DBIx::Class::Storage::DBI::UniqueIdentifier/new_guid> callback, like
45             so:
46              
47             $schema->storage->new_guid(sub { Data::GUID->new->as_string });
48              
49             Under L<Catalyst> you can use code similar to this in your
50             L<Catalyst::Model::DBIC::Schema> C<Model.pm>:
51              
52             after BUILD => sub {
53             my $self = shift;
54             $self->storage->new_guid(sub { Data::GUID->new->as_string });
55             };
56              
57             =cut
58              
59 0     0     sub _dbh_last_insert_id { $_[1]->selectrow_array('select @@identity') }
60              
61             # support empty insert
62             sub insert {
63 0     0 1   my $self = shift;
64 0           my ($source, $to_insert) = @_;
65              
66 0           my $columns_info = $source->columns_info;
67              
68 0 0         if (keys %$to_insert == 0) {
69             my $autoinc_col = first {
70             $columns_info->{$_}{is_auto_increment}
71 0     0     } keys %$columns_info;
  0            
72              
73 0 0         $self->throw_exception(
74             'empty insert only supported for tables with an autoincrement column'
75             ) unless $autoinc_col;
76              
77 0           my $table = $source->from;
78 0 0         $table = $$table if ref $table;
79              
80 0           $to_insert->{$autoinc_col} = \"dmax('${autoinc_col}', '${table}')+1";
81             }
82              
83 0           return $self->next::method(@_);
84             }
85              
86             sub bind_attribute_by_data_type {
87 0     0 1   my $self = shift;
88 0           my ($data_type) = @_;
89              
90 0   0       my $attributes = $self->next::method(@_) || {};
91              
92 0 0         if ($self->_is_text_lob_type($data_type)) {
    0          
93 0           $attributes->{TYPE} = DBI::SQL_LONGVARCHAR;
94             }
95             elsif ($self->_is_binary_lob_type($data_type)) {
96 0           $attributes->{TYPE} = DBI::SQL_LONGVARBINARY;
97             }
98              
99 0           return $attributes;
100             }
101              
102             # savepoints are not supported, but nested transactions are.
103             # Unfortunately DBI does not support nested transactions.
104             # WARNING: this code uses the undocumented 'BegunWork' DBI attribute.
105              
106             sub _exec_svp_begin {
107 0     0     my ($self, $name) = @_;
108              
109 0           local $self->_dbh->{AutoCommit} = 1;
110 0           local $self->_dbh->{BegunWork} = 0;
111 0           $self->_exec_txn_begin;
112             }
113              
114             # A new nested transaction on the same level releases the previous one.
115 0     0     sub _exec_svp_release { 1 }
116              
117             sub _exec_svp_rollback {
118 0     0     my ($self, $name) = @_;
119              
120 0           local $self->_dbh->{AutoCommit} = 0;
121 0           local $self->_dbh->{BegunWork} = 1;
122 0           $self->_exec_txn_rollback;
123             }
124              
125             =head1 FURTHER QUESTIONS?
126              
127             Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
128              
129             =head1 COPYRIGHT AND LICENSE
130              
131             This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
132             by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
133             redistribute it and/or modify it under the same terms as the
134             L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
135              
136             =cut
137              
138             1;
139              
140             # vim:sts=2 sw=2: