1 package DBIx::Class::Storage::DBI::Sybase;
7 use base qw/DBIx::Class::Storage::DBI/;
9 use Carp::Clan qw/^DBIx::Class/;
14 if (ref($self) eq 'DBIx::Class::Storage::DBI::Sybase') {
16 @{$self->dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2]
21 my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}";
23 if (!$exception && $dbtype && $self->load_optional_class($subclass)) {
24 bless $self, $subclass;
28 if (not $self->dbh->{syb_dynamic_supported}) {
29 bless $self, 'DBIx::Class::Storage:DBI::Sybase::NoBindVars';
32 $self->connect_call_datetime_setup;
33 $self->connect_call_blob_setup;
40 $self->next::method(@_);
41 $self->connect_call_datetime_setup;
42 $self->connect_call_blob_setup;
46 =head2 connect_call_blob_setup
50 on_connect_call => 'blob_setup'
52 Does C<< $dbh->{syb_binary_images} = 1; >> to return C<IMAGE> data as raw binary
53 instead of as a hex string.
59 sub connect_call_blob_setup {
61 my $dbh = $self->_dbh;
62 $dbh->{syb_binary_images} = 1;
66 my $old_dbd_warned = 0;
68 =head2 connect_call_datetime_setup
72 on_connect_call => 'datetime_setup'
74 In L<DBIx::Class::Storage::DBI/connect_info> to set:
76 $dbh->syb_date_fmt('ISO_strict'); # output fmt: 2004-08-21T14:36:48.080Z
77 $dbh->do('set dateformat mdy'); # input fmt: 08/13/1979 18:08:55.080
79 On connection for use with L<DBIx::Class::InflateColumn::DateTime>, using
80 L<DateTime::Format::Sybase>, which you will need to install.
82 This works for both C<DATETIME> and C<SMALLDATETIME> columns, although
83 C<SMALLDATETIME> columns only have minute precision.
87 sub connect_call_datetime_setup {
89 my $dbh = $self->_dbh;
91 if ($dbh->can('syb_date_fmt')) {
92 $dbh->syb_date_fmt('ISO_strict');
93 } elsif (not $old_dbd_warned) {
94 carp "Your DBD::Sybase is too old to support ".
95 "DBIx::Class::InflateColumn::DateTime, please upgrade!";
99 $dbh->do('set dateformat mdy');
105 sub datetime_parser_type { "DateTime::Format::Sybase" }
107 sub _dbh_last_insert_id {
108 my ($self, $dbh, $source, $col) = @_;
110 # sorry, there's no other way!
111 my $sth = $dbh->prepare_cached("select max($col) from ".$source->from);
112 return ($dbh->selectrow_array($sth))[0];
117 Counts for limited queries are emulated by executing select queries and
118 returning the number of successful executions minus the offset.
120 This is necessary due to the limitations of Sybase.
126 my ($source, $attrs) = @_;
128 if (not exists $attrs->{rows}) {
129 return $self->next::method(@_);
132 my $offset = $attrs->{offset} || 0;
133 my $total = $attrs->{rows} + $offset;
135 my $new_attrs = $self->_copy_attributes_for_count($source, $attrs);
137 my $first_pk = ($source->primary_columns)[0];
139 $new_attrs->{select} = $first_pk ? "me.$first_pk" : 1;
141 my $tmp_rs = $source->resultset_class->new($source, $new_attrs);
143 $self->dbh->{syb_rowcount} = $total;
146 $count++ while $tmp_rs->cursor->next;
148 $self->dbh->{syb_rowcount} = 0;
150 return $count - $offset;
157 DBIx::Class::Storage::DBI::Sybase - Storage::DBI subclass for Sybase
161 This subclass supports L<DBD::Sybase> for real Sybase databases. If you are
162 using an MSSQL database via L<DBD::Sybase>, your storage will be reblessed to
163 L<DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server>.
167 If your version of Sybase does not support placeholders, then your storage
168 will be reblessed to L<DBIx::Class::Storage::DBI::Sybase::NoBindVars>. You can
169 also enable that driver explicitly, see the documentation for more details.
171 With this driver there is unfortunately no way to get the C<last_insert_id>
172 without doing a C<select max(col)>.
174 But your queries will be cached.
176 A recommended L<DBIx::Class::Storage::DBI/connect_info> setting:
178 on_connect_call => [qw/datetime_setup blob_setup/]
182 See L</connect_call_datetime_setup> to setup date formats
183 for L<DBIx::Class::InflateColumn::DateTime>.
185 =head1 IMAGE AND TEXT COLUMNS
187 See L</connect_call_blob_setup> for a L<DBIx::Class::Storage::DBI/connect_info>
188 setting you need to work with C<IMAGE> columns.
190 Due to limitations in L<DBD::Sybase> and this driver, it is only possible to
191 select one C<TEXT> or C<IMAGE> column at a time, and it must be at the end of
192 your C<select> list (one way to insure that is to define the column last in your
197 See L<DBIx::Class/CONTRIBUTORS>.
201 You may distribute this code under the same terms as Perl itself.