PEPPLER.ORG
Michael Peppler
Sybase Consulting
Menu
Home
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
Freeware
Sybperl
Sybase::Simple
DBD::Sybase
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
FAQs
Sybase on Linux FAQ
Sybperl FAQ
Personal
Michael Peppler's resume

sybperl-l Archive

Up    Prev    Next    

From: Michael Peppler <mpeppler at peppler dot org>
Subject: Re: DBD::Sybase and Replication Server
Date: Jan 27 2005 3:23PM

On Thu, 2005-01-27 at 12:26, Avis, Ed wrote:
> It is possible to connect to Sybase Replication Server with
> DBD::Sybase.  But whenever you do you get this error in the repserver
> logs:
> 
> E. 2005/01/27 10:48:38. ERROR #14024 USER(sa) - /execint.c(1069)
> 	Executor does not allow the entered command in the current mode.
> 
> I think this may be caused by the check for chained transactions which
> syb_db_connect() does.  Or perhaps DBD::Sybase is sending 'begin tran'
> to the server.  Replication server doesn't support any kind of
> transaction.

There are a couple of minor issues with DBD::Sybase and rep server.

First, with DBD::Sybase 1.04 and earlier the code uses a standard
prepare()/execute()/fetch() block in the connect() call to fetch the
@@version string. The problem with that is that AutoCommit is still
false at that time (it gets set by DBI *after* connect() returns), and
so a begin tran/commit tran combo gets issued.

In 1.05 the server version string is fetched by an ad-hoc C function, so
no begin tran/commit tran should be executed there. However, 1.05 tries
to check if the server supports the CHAINED_TXN capability, which sends
an error to the client with "no SRV_OPTION handler installed". That's
not a serious error, and I'll silence it in the next version.

Third, when DBI sets AutoCommit to TRUE (after the connect() returns)
the handler for this action generates a COMMIT call to be on the safe
side even though no transactions (or requests) of any sort have been
issued. That's pretty much what the DBI spec mandates, though I suppose
that DBD::Sybase could carry a flag in the $dbh that is set if any
command has been executed, so could avoid the commit if no command has
been executed.

Michael
-- 
Michael Peppler  -  mpeppler@peppler.org  -  http://www.peppler.org/
Sybase DBA/Developer
Sybase on Linux FAQ: http://www.peppler.org/FAQ/linux.html