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: CTLib Callback Msg; can this access the SQL statement being execu ted
Date: May 17 1999 1:17PM

Ruth Geever writes:
 > Hello,
 > I'm using Sybperl with Sybase Open Client 11.1.1;
 > When an error occurs, I want to display the SQL statement that caused the
 > error. However, I cannot access the SQL statement that caused the error in
 > the callback subroutine.

Unfortunately there is no equivalent to dbstrcpy() in Client Library,
so there is no really easy way to do this.

There are a number of alternate ways to achieve this, however. The
most painless (and mostly transparent to your users) is to write a
module that inherits from Sybase::CTlib and that overloads
ct_execute(), storing the $sql in the $dbh before the execute.

Something like

package My::CTlib;

use Sybase::CTlib;

use strict;

require Exporter;
require AutoLoader;

@ISA = qw(Exporter AutoLoader Sybase::CTlib);
@EXPORT = @Sybase::CTlib::EXPORT;
$VERSION = '1.00';

sub new {
    my ($package, $user, $pwd, $server, $app, $attr) = @_;

    # Pre-allocate space for the SQL text in the $dbh struct.
    if ($attr) {
        $attr->{SQL} = '';
    else {
        $attr = {SQL => ''};

    $package::SUPER->new($user, $pwd, $server, $app, $attr);

sub ct_execute {
    my $dbh = shift;
    my $sql = shift;

    $dbh->{SQL} = $sql;   # Store the $sql in the dbh...

    $dbh::SUPER->ct_execute($sql);  # call the real ct_execute;



Place the above in a file in My/

Now in your program you do:

use My::CTlib;

ct_callback(CS_SERVERMSG_CB, \&msgCB);

$dbh = new My::CTlib $user, $pwd, $server;



sub msgCB
my $ctlib = shift;
my ($number, $severity, $origin, $layer, $server, $proc,
$msg, $osmsg) = @_;

	my $q = new CGI;
	print $q->header(),
		$q->h1('Sybase Error'),
	print ''
if defined($osmsg);
	# Print out the SQL:
        print '';

	print	'
Open Client Message:
Message Number:LAYER = ',$layer,' ORIGIN = ',$origin,'
SEVERITY = ',$severity,' NUMBER = ',$number,'
Message String:',$msg,'
Operating System Error:',$osmsg,'
SQL:', $ctlib->{SQL}, '
'; $q->end_html(); exit; return CS_SUCCEED; } I hope this helps a little bit.... Michael -- Michael Peppler -||- Data Migrations Inc. -||- Int. Sybase User Group -||- Sybase on Linux mailing list: