test sybase SMALLDATETIME inflation
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase.pm
CommitLineData
3885cff6 1package DBIx::Class::Storage::DBI::Sybase;
2
3use strict;
4use warnings;
5
c5ce7cd6 6use base qw/DBIx::Class::Storage::DBI/;
3885cff6 7
6b1f5ef7 8use Carp::Clan qw/^DBIx::Class/;
9
47d9646a 10sub _rebless {
b50a5275 11 my $self = shift;
c5ce7cd6 12
13 if (ref($self) eq 'DBIx::Class::Storage::DBI::Sybase') {
14 my $dbtype = eval {
15 @{$self->dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2]
16 } || '';
17
18 my $exception = $@;
19 $dbtype =~ s/\W/_/gi;
20 my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}";
21
22 if (!$exception && $dbtype && $self->load_optional_class($subclass)) {
23 bless $self, $subclass;
24 $self->_rebless;
6b1f5ef7 25 } elsif (not $self->dbh->{syb_dynamic_supported}) {
6b1f5ef7 26 bless $self, 'DBIx::Class::Storage:DBI::Sybase::NoBindVars';
27 $self->_rebless;
47d9646a 28 }
c5ce7cd6 29 }
b50a5275 30}
31
6b1f5ef7 32{
33 my $old_dbd_warned = 0;
34
35 sub _populate_dbh {
36 my $self = shift;
37 $self->next::method(@_);
38 my $dbh = $self->_dbh;
39
40 if ($dbh->can('syb_date_fmt')) {
41 $dbh->syb_date_fmt('ISO_strict');
42 } elsif (not $old_dbd_warned) {
43 carp "Your DBD::Sybase is too old to support ".
44 "DBIx::Class::InflateColumn::DateTime, please upgrade!";
45 $old_dbd_warned = 1;
46 }
47
48 $dbh->do('set dateformat mdy');
c5ce7cd6 49
6b1f5ef7 50 1;
c5ce7cd6 51 }
6b1f5ef7 52}
53
54sub _dbh_last_insert_id {
55 my ($self, $dbh, $source, $col) = @_;
c5ce7cd6 56
57 # sorry, there's no other way!
58 my $sth = $dbh->prepare_cached("select max($col) from ".$source->from);
59 return ($dbh->selectrow_array($sth))[0];
a964a928 60}
61
c5ce7cd6 62sub datetime_parser_type { "DBIx::Class::Storage::DBI::Sybase::DateTime" }
63
3885cff6 641;
65
66=head1 NAME
67
68DBIx::Class::Storage::DBI::Sybase - Storage::DBI subclass for Sybase
69
70=head1 SYNOPSIS
71
81092e2d 72This subclass supports L<DBD::Sybase> for real Sybase databases. If
73you are using an MSSQL database via L<DBD::Sybase>, see
74L<DBIx::Class::Storage::DBI::Sybase::MSSQL>.
3885cff6 75
d4483998 76=head1 CAVEATS
77
c5ce7cd6 78If your version of Sybase does not support placeholders, then this storage
79driver uses L<DBIx::Class::Storage::DBI::NoBindVars> as a base,
80
81In which case, bind variables will be interpolated (properly quoted of course)
d4483998 82into the SQL query itself, without using bind placeholders.
83
84More importantly this means that caching of prepared statements is explicitly
85disabled, as the interpolation renders it useless.
86
c5ce7cd6 87If your version of Sybase B<DOES> support placeholders (check
88C<<$dbh->{syb_dynamic_supported}>> then unfortunately there's no way to get the
89C<last_insert_id> without doing a C<select max(col)>.
90
91But your queries will be cached.
92
93=head1 DATES
94
95On connection C<syb_date_fmt> is set to C<ISO_strict>, e.g.:
96C<2004-08-21T14:36:48.080Z> and C<dateformat> is set to C<mdy>, e.g.:
97C<08/13/1979>.
98
99You will need the L<DateTime::Format::Strptime> module if you are going to use
100L<DBIx::Class::InflateColumn::DateTime>.
101
3885cff6 102=head1 AUTHORS
103
104Brandon L Black <blblack@gmail.com>
105
47d9646a 106Justin Hunter <justin.d.hunter@gmail.com>
107
c5ce7cd6 108Rafael Kitover <rkitover@cpan.org>
109
3885cff6 110=head1 LICENSE
111
112You may distribute this code under the same terms as Perl itself.
113
114=cut
c5ce7cd6 115# vim:sts=2 sw=2: