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: "Scott Zetlan" <scottzetlan at aol dot com>
Subject: Re: callback question
Date: Apr 14 2003 7:00PM

I'd use a closure:

use Sybase::CTlib;
use FileHandle;

sub sample_cb {
    my $fh = shift;
    my $realfunc = sub {
       my @args = @_;
       print $fh "Put your own code here...\n";
    };
    return $realfunc;
}

my $fh = new FileHandle (">/path/to/file") or die ("$!");
my $test = test_cb ($fh);

ct_callback (CS_CLIENTMSG_CB, $test);
ct_callback (CS_SERVERMSG_CB, $test);

my $dbh = new Sybase::CTlib $user, $pass, $server, $app;
$dbh->ct_sql ("use foo");

You can determine at run time (using a conf file, environment var, etc.) the path to the logfile, then create the callback function on the fly using the lexical closure (sample_cb creates an anonymous sub with reference stored in $realfunc).

Scott

Monty Charlton wrote:

All,

I am using ct_callback in my code for trapping errors.  I call ct_callback
like so:

ct_callback(CS_CLIENTMSG_CB, \&msg_cb);
ct_callback(CS_SERVERMSG_CB, \&srv_cb);

Then my msg_cb srv_cb subroutines log to a file.  The log file is currently
hard-coded.

I need to have the log file defined at the command line or in a config file. 
I suppose I need to pass another parameter to each of these functions.  Short
of defining a global variable to the log file path, is there a way to do
this?

Something like:

sub msg_cb
{
my( $dbh, $number, $severity, $state, $line, $server, $proc, $msg,
$userFileHandle ) = @_;
print $userFileHandle "error...";
return CS_SUCCEED;
}

Thanks.

Monty