Commit | Line | Data |
bbe552a3 |
1 | package DBIx::Class::Storage::DBI::ODBC::ACCESS;\r |
2 | use strict;\r |
3 | use warnings;\r |
4 | \r |
5 | use Data::Dump qw( dump );\r |
6 | \r |
cd6d847f |
7 | use DBI;\r |
bbe552a3 |
8 | use base qw/DBIx::Class::Storage::DBI/;\r |
9 | \r |
10 | my $ERR_MSG_START = __PACKAGE__ . ' failed: ';\r |
11 | \r |
12 | sub insert {\r |
13 | my $self = shift;\r |
14 | my ( $source, $to_insert ) = @_;\r |
15 | \r |
16 | my $bind_attributes = $self->source_bind_attributes( $source );\r |
17 | my ( undef, $sth ) = $self->_execute( 'insert' => [], $source, $bind_attributes, $to_insert );\r |
18 | \r |
19 | #store the identity here since @@IDENTITY is connection global and this prevents\r |
20 | #possibility that another insert to a different table overwrites it for this resultsource\r |
21 | my $identity = 'SELECT @@IDENTITY';\r |
22 | my $max_sth = $self->{ _dbh }->prepare( $identity )\r |
23 | or $self->throw_exception( $ERR_MSG_START . $self->{ _dbh }->errstr() );\r |
24 | $max_sth->execute() or $self->throw_exception( $ERR_MSG_START . $max_sth->errstr );\r |
25 | \r |
26 | my $row = $max_sth->fetchrow_arrayref()\r |
27 | or $self->throw_exception( $ERR_MSG_START . "$identity did not return any result." );\r |
28 | \r |
29 | $self->{ last_pk }->{ $source->name() } = $row;\r |
30 | \r |
31 | return $to_insert;\r |
32 | }\r |
33 | \r |
34 | sub last_insert_id {\r |
35 | my $self = shift;\r |
36 | my ( $result_source ) = @_;\r |
37 | \r |
38 | return @{ $self->{ last_pk }->{ $result_source->name() } };\r |
39 | }\r |
40 | \r |
cd6d847f |
41 | sub bind_attribute_by_data_type {\r |
42 | my $self = shift;\r |
43 | \r |
44 | my ( $data_type ) = @_;\r |
45 | \r |
46 | return { TYPE => $data_type } if $data_type == DBI::SQL_LONGVARCHAR;\r |
47 | \r |
48 | return;\r |
49 | }\r |
50 | \r |
bbe552a3 |
51 | sub sqlt_type { 'ACCESS' }\r |
52 | \r |
53 | 1;\r |
54 | \r |
55 | =head1 NAME\r |
56 | \r |
92bc2a19 |
57 | DBIx::Class::Storage::DBI::ODBC::ACCESS - Support specific to MS Access over ODBC\r |
bbe552a3 |
58 | \r |
59 | =head1 WARNING\r |
60 | \r |
61 | I am not a DBI, DBIx::Class or MS Access guru. Use this module with that in\r |
62 | mind.\r |
63 | \r |
64 | This module is currently considered alpha software and can change without notice.\r |
65 | \r |
66 | =head1 DESCRIPTION\r |
67 | \r |
cd6d847f |
68 | This class implements support specific to Microsoft Access over ODBC.\r |
bbe552a3 |
69 | \r |
70 | It is loaded automatically by by DBIx::Class::Storage::DBI::ODBC when it\r |
71 | detects a MS Access back-end.\r |
72 | \r |
73 | =head1 SUPPORTED VERSIONS\r |
74 | \r |
75 | This module have currently only been tested on MS Access 2003 using the Jet 4.0 engine.\r |
76 | \r |
77 | As far as my knowledge it should work on MS Access 2000 or later, but that have not been tested.\r |
78 | Information about support for different version of MS Access is welcome.\r |
79 | \r |
80 | =head1 IMPLEMENTATION NOTES\r |
81 | \r |
82 | MS Access supports the @@IDENTITY function for retriving the id of the latest inserted row.\r |
83 | @@IDENTITY is global to the connection, so to support the possibility of getting the last inserted\r |
84 | id for different tables, the insert() function stores the inserted id on a per table basis.\r |
85 | last_insert_id() then just returns the stored value.\r |
86 | \r |
cd6d847f |
87 | =head1 KNOWN ACCESS PROBLEMS\r |
88 | \r |
89 | =over\r |
90 | \r |
91 | =item Invalid precision value\r |
92 | \r |
93 | This error message is received when trying to store more than 255 characters in a MEMO field.\r |
94 | The problem is (to my knowledge) an error in the MS Access ODBC driver. The problem is fixed\r |
95 | by setting the C<data_type> of the column to C<SQL_LONGVARCHAR> in C<add_columns>. \r |
96 | C<SQL_LONGVARCHAR> is a constant in the C<DBI> module.\r |
97 | \r |
98 | =back\r |
99 | \r |
bbe552a3 |
100 | =head1 IMPLEMENTED FUNCTIONS\r |
101 | \r |
67f85a1f |
102 | =head2 bind_attribute_by_data_type\r |
cd6d847f |
103 | \r |
104 | This function currently supports the SQL_LONGVARCHAR column type.\r |
105 | \r |
bbe552a3 |
106 | =head2 insert\r |
107 | \r |
108 | =head2 last_insert_id\r |
109 | \r |
110 | =head2 sqlt_type\r |
111 | \r |
112 | =head1 BUGS\r |
113 | \r |
114 | Most likely. Bug reports are welcome.\r |
115 | \r |
116 | =head1 AUTHORS\r |
117 | \r |
118 | Øystein Torget C<< <oystein.torget@dnv.com> >>\r |
119 | \r |
120 | =head1 COPYRIGHT\r |
121 | \r |
122 | You may distribute this code under the same terms as Perl itself.\r |
123 | \r |
124 | Det Norske Veritas AS (DNV)\r |
125 | \r |
126 | http://www.dnv.com\r |
127 | \r |
bbe552a3 |
128 | =cut\r |
129 | \r |