new connected() for dbd::sybase users
Rafael Kitover [Wed, 1 Jul 2009 13:21:30 +0000 (13:21 +0000)]
lib/DBIx/Class/Storage/DBI/Sybase.pm
lib/DBIx/Class/Storage/DBI/Sybase/Base.pm [new file with mode: 0644]
lib/DBIx/Class/Storage/DBI/Sybase/Microsoft_SQL_Server.pm

index ec4fcf7..9b80f81 100644 (file)
@@ -2,8 +2,11 @@ package DBIx::Class::Storage::DBI::Sybase;
 
 use strict;
 use warnings;
-
-use base qw/DBIx::Class::Storage::DBI::NoBindVars/;
+use mro 'c3';
+use base qw/
+    DBIx::Class::Storage::DBI::Sybase::Base
+    DBIx::Class::Storage::DBI::NoBindVars
+/;
 
 sub _rebless {
     my $self = shift;
diff --git a/lib/DBIx/Class/Storage/DBI/Sybase/Base.pm b/lib/DBIx/Class/Storage/DBI/Sybase/Base.pm
new file mode 100644 (file)
index 0000000..a26ed23
--- /dev/null
@@ -0,0 +1,52 @@
+package DBIx::Class::Storage::DBI::Sybase::Base;
+
+use strict;
+use warnings;
+
+=head1 NAME
+
+DBIx::Class::Storage::DBI::Sybase::Base - Common functionality for drivers using
+L<DBD::Sybase>
+
+=head1 METHODS
+
+=head2 connected
+
+Returns true if we have an open (and working) database connection, false if it
+is not (yet) open (or does not work). (Executes a simple SELECT to make sure it
+works.)
+
+The reason this is needed is that L<DBD::Sybase>'s ping() does not work with an
+active statement handle, leading to masked database errors.
+
+=cut
+
+sub connected {
+  my $self = shift;
+
+  my $dbh = $self->_dbh;
+
+  local $dbh->{RaiseError} = 1;
+
+  my $ping_sth;
+
+  eval {
+    my $ping_sth = $dbh->prepare_cached("select 1");
+    $ping_sth->execute;
+    $ping_sth->finish;
+  };
+
+  return $@ ? 0 : 1;
+}
+
+1;
+
+=head1 AUTHORS
+
+See L<DBIx::Class/CONTRIBUTORS>.
+
+=head1 LICENSE
+
+You may distribute this code under the same terms as Perl itself.
+
+=cut
index 58ac36f..e6809ec 100644 (file)
@@ -2,10 +2,10 @@ package DBIx::Class::Storage::DBI::Sybase::Microsoft_SQL_Server;
 
 use strict;
 use warnings;
-
+use mro 'c3';
 use base qw/
+  DBIx::Class::Storage::DBI::Sybase::Base
   DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server
-  DBIx::Class::Storage::DBI::Sybase
 /;
 
 1;