[Bast-commits] r6388 - in DBIx-Class/0.08/branches: . sybase sybase/lib/DBIx/Class/Storage/DBI sybase/lib/DBIx/Class/Storage/DBI/Sybase sybase/t

caelum at dev.catalyst.perl.org caelum at dev.catalyst.perl.org
Sat May 23 20:48:06 GMT 2009


Author: caelum
Date: 2009-05-23 20:48:06 +0000 (Sat, 23 May 2009)
New Revision: 6388

Added:
   DBIx-Class/0.08/branches/sybase/
Modified:
   DBIx-Class/0.08/branches/sybase/Makefile.PL
   DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm
   DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm
   DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
   DBIx-Class/0.08/branches/sybase/t/746sybase.t
Log:
recreating Sybase branch

Copied: DBIx-Class/0.08/branches/sybase (from rev 6386, DBIx-Class/0.08/trunk)

Modified: DBIx-Class/0.08/branches/sybase/Makefile.PL
===================================================================
--- DBIx-Class/0.08/trunk/Makefile.PL	2009-05-23 20:28:42 UTC (rev 6386)
+++ DBIx-Class/0.08/branches/sybase/Makefile.PL	2009-05-23 20:48:06 UTC (rev 6388)
@@ -87,6 +87,7 @@
   'Hash::Merge',                  => 0.11,
 
   # t/96_is_deteministic_value.t
+  # t/746sybase.t
   'DateTime::Format::Strptime' => 0,
 );
 

Modified: DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm	2009-05-23 20:28:42 UTC (rev 6386)
+++ DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/MSSQL.pm	2009-05-23 20:48:06 UTC (rev 6388)
@@ -3,7 +3,11 @@
 use strict;
 use warnings;
 
-use base qw/DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server DBIx::Class::Storage::DBI::Sybase/;
+use base qw/
+  DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server
+  DBIx::Class::Storage::DBI::NoBindVars
+  DBIx::Class::Storage::DBI::Sybase
+/;
 
 1;
 

Modified: DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm	2009-05-23 20:28:42 UTC (rev 6386)
+++ DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm	2009-05-23 20:48:06 UTC (rev 6388)
@@ -5,6 +5,7 @@
 
 use base qw/
   DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server
+  DBIx::Class::Storage::DBI::NoBindVars
   DBIx::Class::Storage::DBI::Sybase
 /;
 

Modified: DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm
===================================================================
--- DBIx-Class/0.08/trunk/lib/DBIx/Class/Storage/DBI/Sybase.pm	2009-05-23 20:28:42 UTC (rev 6386)
+++ DBIx-Class/0.08/branches/sybase/lib/DBIx/Class/Storage/DBI/Sybase.pm	2009-05-23 20:48:06 UTC (rev 6388)
@@ -3,27 +3,51 @@
 use strict;
 use warnings;
 
-use base qw/DBIx::Class::Storage::DBI::NoBindVars/;
+use base qw/DBIx::Class::Storage::DBI/;
 
 sub _rebless {
-    my $self = shift;
+  my $self = shift;
 
-    my $dbtype = eval { @{$self->dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2] };
-    unless ( $@ ) {
-        $dbtype =~ s/\W/_/gi;
-        my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}";
-        if ($self->load_optional_class($subclass) && !$self->isa($subclass)) {
-            bless $self, $subclass;
-            $self->_rebless;
-        }
+  if (ref($self) eq 'DBIx::Class::Storage::DBI::Sybase') {
+    my $dbtype = eval {
+      @{$self->dbh->selectrow_arrayref(qq{sp_server_info \@attribute_id=1})}[2]
+    } || '';
+
+    my $exception = $@;
+    $dbtype =~ s/\W/_/gi;
+    my $subclass = "DBIx::Class::Storage::DBI::Sybase::${dbtype}";
+
+    if (!$exception && $dbtype && $self->load_optional_class($subclass)) {
+      bless $self, $subclass;
+      $self->_rebless;
+    } else { # probably real Sybase
+      if (not $self->dbh->{syb_dynamic_supported}) {
+        bless $self, 'DBIx::Class::Storage:DBI::Sybase::NoBindVars';
+        $self->_rebless;
+      }
+
+      $self->dbh->syb_date_fmt('ISO_strict');
+      $self->dbh->do('set dateformat mdy');
     }
+  }
 }
 
 sub _dbh_last_insert_id {
-    my $self = shift;
-    ($self->_dbh->selectrow_array('select @@identity'))[0];
+  my ($self, $dbh, $source, $col) = @_;
+
+  if (not $self->dbh->{syb_dynamic_supported}) {
+    # @@identity works only if not using placeholders
+    # Should this query be cached?
+    return ($dbh->selectrow_array('select @@identity'))[0];
+  }
+
+  # sorry, there's no other way!
+  my $sth = $dbh->prepare_cached("select max($col) from ".$source->from);
+  return ($dbh->selectrow_array($sth))[0];
 }
 
+sub datetime_parser_type { "DBIx::Class::Storage::DBI::Sybase::DateTime" }
+
 1;
 
 =head1 NAME
@@ -38,21 +62,41 @@
 
 =head1 CAVEATS
 
-This storage driver uses L<DBIx::Class::Storage::DBI::NoBindVars> as a base.
-This means that bind variables will be interpolated (properly quoted of course)
+If your version of Sybase does not support placeholders, then this storage
+driver uses L<DBIx::Class::Storage::DBI::NoBindVars> as a base,
+
+In which case, bind variables will be interpolated (properly quoted of course)
 into the SQL query itself, without using bind placeholders.
 
 More importantly this means that caching of prepared statements is explicitly
 disabled, as the interpolation renders it useless.
 
+If your version of Sybase B<DOES> support placeholders (check
+C<<$dbh->{syb_dynamic_supported}>> then unfortunately there's no way to get the
+C<last_insert_id> without doing a C<select max(col)>.
+
+But your queries will be cached.
+
+=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>.
+
+You will need the L<DateTime::Format::Strptime> module if you are going to use
+L<DBIx::Class::InflateColumn::DateTime>.
+
 =head1 AUTHORS
 
 Brandon L Black <blblack at gmail.com>
 
 Justin Hunter <justin.d.hunter at gmail.com>
 
+Rafael Kitover <rkitover at cpan.org>
+
 =head1 LICENSE
 
 You may distribute this code under the same terms as Perl itself.
 
 =cut
+# vim:sts=2 sw=2:

Modified: DBIx-Class/0.08/branches/sybase/t/746sybase.t
===================================================================
--- DBIx-Class/0.08/trunk/t/746sybase.t	2009-05-23 20:28:42 UTC (rev 6386)
+++ DBIx-Class/0.08/branches/sybase/t/746sybase.t	2009-05-23 20:48:06 UTC (rev 6388)
@@ -4,13 +4,14 @@
 use Test::More;
 use lib qw(t/lib);
 use DBICTest;
+use DBIx::Class::Storage::DBI::Sybase::DateTime;
 
 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
 
 plan skip_all => 'Set $ENV{DBICTEST_SYBASE_DSN}, _USER and _PASS to run this test'
   unless ($dsn && $user);
 
-plan tests => 12;
+plan tests => 15;
 
 my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
 
@@ -20,16 +21,24 @@
 $schema->storage->dbh_do (sub {
     my ($storage, $dbh) = @_;
     eval { $dbh->do("DROP TABLE artist") };
+    eval { $dbh->do("DROP TABLE track") };
     $dbh->do(<<'SQL');
-
 CREATE TABLE artist (
-   artistid INT IDENTITY NOT NULL,
+   artistid INT IDENTITY PRIMARY KEY,
    name VARCHAR(100),
    rank INT DEFAULT 13 NOT NULL,
-   charfield CHAR(10) NULL,
-   primary key(artistid)
+   charfield CHAR(10) NULL
 )
+SQL
 
+# we only need the DT
+    $dbh->do(<<'SQL');
+CREATE TABLE track (
+   trackid INT IDENTITY PRIMARY KEY,
+   cd INT,
+   position INT,
+   last_updated_on DATETIME,
+)
 SQL
 
 });
@@ -52,9 +61,7 @@
     $seen_id{$new->artistid}++;
 }
 
-my $it;
-
-$it = $schema->resultset('Artist')->search( {}, {
+my $it = $schema->resultset('Artist')->search( {}, {
     rows => 3,
     order_by => 'artistid',
 });
@@ -73,10 +80,26 @@
 is( $it->next->name, "Artist 2", "iterator->next ok" );
 is( $it->next, undef, "next past end of resultset ok" );
 
+# Test DateTime inflation
 
+my $dt = DBIx::Class::Storage::DBI::Sybase::DateTime
+    ->parse_datetime('2004-08-21T14:36:48.080Z');
+
+my $row;
+ok( $row = $schema->resultset('Track')->create({
+    last_updated_on => $dt,
+    cd => 1,
+}));
+ok( $row = $schema->resultset('Track')
+    ->search({ trackid => $row->trackid }, { select => ['last_updated_on'] })
+    ->first
+);
+is( $row->updated_date, $dt, 'DateTime inflation works' );
+
 # clean up our mess
 END {
-    my $dbh = eval { $schema->storage->_dbh };
-    $dbh->do('DROP TABLE artist') if $dbh;
+    if (my $dbh = eval { $schema->storage->_dbh }) {
+        $dbh->do('DROP TABLE artist');
+        $dbh->do('DROP TABLE track');
+    }
 }
-




More information about the Bast-commits mailing list