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;
}
}
}
+sub _populate_dbh {
+ my $self = shift;
+ $self->next::method(@_);
+ $self->connect_call_datetime_setup;
+ 1;
+}
+
{
my $old_dbd_warned = 0;
- sub _populate_dbh {
+=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
+
+ sub connect_call_datetime_setup {
my $self = shift;
- $self->next::method(@_);
my $dbh = $self->_dbh;
if ($dbh->can('syb_date_fmt')) {
}
sub count {
- my ($self, $source, $attrs) = @_;
+ my $self = shift;
+ my ($source, $attrs) = @_;
- if (exists $attrs->{rows}) {
- my $offset = $attrs->{offset} || 0;
- my $total = $attrs->{rows} + $offset;
+ if (not exists $attrs->{rows}) {
+ return $self->next::method(@_);
+ }
- my $new_attrs = $self->_trim_attributes_for_count($source, $attrs);
+ my $offset = $attrs->{offset} || 0;
+ my $total = $attrs->{rows} + $offset;
- my $query = $source->resultset_class->new($source, $new_attrs)->as_query;
+ my $new_attrs = $self->_copy_attributes_for_count($source, $attrs);
- my $top_attrs = {};
- $top_attrs->{from} = [{
- top_subq => $query
- }];
- $top_attrs->{select} = "TOP $total 1";
- $top_attrs->{as} = ['total'];
+ my $first_pk = ($source->primary_columns)[0];
- my $top_query = $source->resultset_class->new($source, $top_attrs)->as_query;
+ $new_attrs->{select} = $first_pk ? "me.$first_pk" : 1;
- my $count_attrs = {};
- $count_attrs->{from} = [{
- count_subq => $top_query
- }];
- $count_attrs->{select} = { count => '*' };
- $count_attrs->{as} = ['count'];
+ my $tmp_rs = $source->resultset_class->new($source, $new_attrs);
- my $tmp_rs = $source->resultset_class->new($source, $count_attrs);
- my ($count) = $tmp_rs->cursor->next;
+ $self->dbh->{syb_rowcount} = $total;
- $count -= $offset;
- $count = $attrs->{rows} if $count > $attrs->{rows};
+ my $count = 0;
+ $count++ while $tmp_rs->cursor->next;
- return $count;
- }
+ $self->dbh->{syb_rowcount} = 0;
- return $self->next::method(@_);
+ return $count - $offset;
}
-sub datetime_parser_type { "DBIx::Class::Storage::DBI::Sybase::DateTime" }
+sub datetime_parser_type { "DateTime::Format::Sybase" }
1;
=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>.
-
-This works for both C<DATETIME> and C<SMALLDATETIME> columns, although
-C<SMALLDATETIME> columns only have minute precision.
-
-You will need the L<DateTime::Format::Strptime> module if you are going to use
-L<DBIx::Class::InflateColumn::DateTime>.
+See L</connect_call_datetime_setup> to setup date formats
+for L<DBIx::Class::InflateColumn::DateTime>.
=head1 AUTHORS