Michael Peppler
Sybase Consulting
Sybase on Linux
Install Guide for Sybase on Linux
General Sybase Resources
General Perl Resources
BCP Tool
Bug Tracker
Mailing List Archive
Downloads Directory
Sybase on Linux FAQ
Sybperl FAQ
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 Peppler  -  -
Sybase DBA/Developer
Sybase on Linux FAQ: