minor changes
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Sybase.pm
index b0aef93..d92a60e 100644 (file)
@@ -23,19 +23,69 @@ sub _rebless {
     if (!$exception && $dbtype && $self->load_optional_class($subclass)) {
       bless $self, $subclass;
       $self->_rebless;
-    } elsif (not $self->dbh->{syb_dynamic_supported}) {
-      bless $self, 'DBIx::Class::Storage:DBI::Sybase::NoBindVars';
-      $self->_rebless;
+    } else {
+      # real Sybase
+      if (not $self->dbh->{syb_dynamic_supported}) {
+        bless $self, 'DBIx::Class::Storage:DBI::Sybase::NoBindVars';
+        $self->_rebless;
+      }
+      $self->connect_call_datetime_setup;
+      $self->connect_call_blob_setup;
     }
   }
 }
 
+sub _populate_dbh {
+  my $self = shift;
+  $self->next::method(@_);
+  $self->connect_call_datetime_setup;
+  $self->connect_call_blob_setup;
+  1;
+}
+
+=head2 connect_call_blob_setup
+
+Used as:
+
+  on_connect_call => 'blob_setup'
+
+Does C<< $dbh->{syb_binary_images} = 1; >> to return C<IMAGE> data as raw binary
+instead of as a hex string.
+
+Recommended.
+
+=cut
+
+sub connect_call_blob_setup {
+  my $self = shift;
+  my $dbh = $self->_dbh;
+  $dbh->{syb_binary_images} = 1;
+}
+
+=head2 connect_call_datetime_setup
+
+Used as:
+
+  on_connect_call => 'datetime_setup'
+
+In L<DBIx::Class::Storage::DBI/connect_info> to set:
+
+  $dbh->syb_date_fmt('ISO_strict'); # output fmt: 2004-08-21T14:36:48.080Z
+  $dbh->do('set dateformat mdy');   # input fmt:  08/13/1979 18:08:55.080
+
+On connection for use with L<DBIx::Class::InflateColumn::DateTime>, using
+L<DateTime::Format::Sybase>, which you will need to install.
+
+This works for both C<DATETIME> and C<SMALLDATETIME> columns, although
+C<SMALLDATETIME> columns only have minute precision.
+
+=cut
+
 {
   my $old_dbd_warned = 0;
 
-  sub _populate_dbh {
+  sub connect_call_datetime_setup {
     my $self = shift;
-    $self->next::method(@_);
     my $dbh = $self->_dbh;
 
     if ($dbh->can('syb_date_fmt')) {
@@ -52,6 +102,8 @@ sub _rebless {
   }
 }
 
+sub datetime_parser_type { "DateTime::Format::Sybase" }
+
 sub _dbh_last_insert_id {
   my ($self, $dbh, $source, $col) = @_;
 
@@ -60,8 +112,18 @@ sub _dbh_last_insert_id {
   return ($dbh->selectrow_array($sth))[0];
 }
 
+=head2 count
+
+Counts for limited queries are emulated by executing select queries and
+returning the number of successful executions minus the offset.
+
+This is necessary due to the limitations of Sybase.
+
+=cut
+
 sub count {
-  my ($self, $source, $attrs) = @_;
+  my $self = shift;
+  my ($source, $attrs) = @_;
 
   if (not exists $attrs->{rows}) {
     return $self->next::method(@_);
@@ -70,9 +132,11 @@ sub count {
   my $offset = $attrs->{offset} || 0;
   my $total  = $attrs->{rows} + $offset;
 
-  my $new_attrs = $self->_trim_attributes_for_count($source, $attrs);
-  $new_attrs->{select} = '1';
-  $new_attrs->{as}     = ['dummy'];
+  my $new_attrs = $self->_copy_attributes_for_count($source, $attrs);
+
+  my $first_pk = ($source->primary_columns)[0];
+
+  $new_attrs->{select} = $first_pk ? "me.$first_pk" : 1;
 
   my $tmp_rs = $source->resultset_class->new($source, $new_attrs);
 
@@ -86,8 +150,6 @@ sub count {
   return $count - $offset;
 }
 
-sub datetime_parser_type { "DBIx::Class::Storage::DBI::Sybase::DateTime" }
-
 1;
 
 =head1 NAME
@@ -111,17 +173,22 @@ without doing a C<select max(col)>.
 
 But your queries will be cached.
 
+A recommended L<DBIx::Class::Storage::DBI/connect_info> setting:
+
+  on_connect_call => [qw/datetime_setup blob_setup/]
+
 =head1 DATES
 
-On connection C<syb_date_fmt> is set to C<ISO_strict>, e.g.:
-C<2004-08-21T14:36:48.080Z> and C<dateformat> is set to C<mdy>, e.g.:
-C<08/13/1979 18:08:55.080>.
+See L</connect_call_datetime_setup> to setup date formats
+for L<DBIx::Class::InflateColumn::DateTime>.
 
-This works for both C<DATETIME> and C<SMALLDATETIME> columns, although
-C<SMALLDATETIME> columns only have minute precision.
+=head1 IMAGE AND TEXT COLUMNS
+
+See L</connect_call_blob_setup> for a L<DBIx::Class::Storage::DBI/connect_info>
+setting you need to work with C<IMAGE> columns.
 
-You will need the L<DateTime::Format::Strptime> module if you are going to use
-L<DBIx::Class::InflateColumn::DateTime>.
+Due to limitations in L<DBD::Sybase> and this driver, it is only possible to
+select one C<TEXT> or C<IMAGE> column at a time.
 
 =head1 AUTHORS