home *** CD-ROM | disk | FTP | other *** search
- static char SccsId[] = "@(#)sybperl.c 1.31 6/8/94";
- /************************************************************************/
- /* Copyright (c) 1991, 1992, 1993, 1994 */
- /* Michael Peppler and ITF Management SA */
- /* Portions Copyright (c) 1993 Commercial Dynamics Pty Ltd */
- /* */
- /* You may copy this under the terms of the GNU General Public License, */
- /* or the Artistic License, copies of which should have accompanied */
- /* your Perl kit. */
- /************************************************************************/
-
- /* sybperl.c
- *
- * Call Sybase DB-Library functions from Perl.
- * Written by Michael Peppler (mpeppler@itf.ch)
- * ITF Management SA, 13 rue de la Fontaine
- * CH-1204 Geneva, Switzerland
- * Tel: (+4122) 312 1311 Fax: (+4122) 312 1322
- */
-
-
- #include "EXTERN.h"
- #include "perl.h"
- #undef MAX
- #undef MIN
-
- #if defined(VERSION3)
- #define str_2mortal(s) str_2static(s)
- #endif
-
- #include <sybfront.h>
- #include <sybdb.h>
- #include <syberror.h>
-
- #include "patchlevel.h"
-
- extern int wantarray;
-
- #if DBLIBVS >= 461
- static void new_mny4tochar(); /* forward declaration */
- static void new_mnytochar(); /* forward declaration */
- #endif
-
- /*
- * The variables that the Sybase routines set, and that you may want
- * to test in your Perl script. These variables are READ-ONLY.
- */
- enum uservars
- {
- UV_SUCCEED, /* Returns SUCCEED */
- UV_FAIL, /* Returns FAIL */
- UV_NO_MORE_ROWS, /* Returns NO_MORE_ROWS */
- UV_NO_MORE_RESULTS, /* Returns NO_MORE_RESULTS */
- UV_ComputeId, /* Returns the compute id of the row (in dbnextrow()) */
- UV_SybperlVer, /* Returns Sybperl Version/Patchlevel */
- UV_DBstatus, /* The status value of the last dbnextrow() call */
- /* The following enum definitions are also for Sybase OpenClient R4.6.1
- * read-only perl variable synthesis. See above for format ...
- */
- #if DBLIBVS >= 461
- UV_STDEXIT,
- UV_ERREXIT,
- UV_INT_EXIT,
- UV_INT_CONTINUE,
- UV_INT_CANCEL,
- UV_INT_TIMEOUT,
- UV_MORE_ROWS,
- UV_REG_ROW,
- UV_BUF_FULL,
- UV_NO_MORE_PARAMS,
- UV_DBSAVE,
- UV_DBNOSAVE,
- UV_DBNOERR,
- UV_DB_PASSTHRU_MORE,
- UV_DB_PASSTHRU_EOM,
- UV_DBNOPROC,
- UV_EXCEPTION,
- UV_EXSIGNAL,
- UV_EXSCREENIO,
- UV_EXDBLIB,
- UV_EXFORMS,
- UV_EXCLIPBOARD,
- UV_EXLOOKUP,
- UV_EXINFO,
- UV_EXUSER,
- UV_EXNONFATAL,
- UV_EXCONVERSION,
- UV_EXSERVER,
- UV_EXTIME,
- UV_EXPROGRAM,
- UV_EXRESOURCE,
- UV_EXCOMM,
- UV_EXFATAL,
- UV_EXCONSISTENCY,
- #endif
- UV_DB_IN,
- UV_DB_OUT,
- UV_BCPMAXERRS,
- UV_BCPFIRST,
- UV_BCPLAST,
- UV_BCPBATCH,
- UV_DBTRUE,
- UV_DBFALSE,
- #if defined(PACKAGE_BUG)
- UV_PACKAGE_BUG,
- #endif
- UV_dbNullIsUndef,
- UV_dbKeepNumeric,
- UV_dbBin0x,
- };
-
- /*
- * User subroutines that we have implemented. I've found that I can do
- * all the stuff I want to with this subset of DB-Library. Let me know
- * if you implement further routines.
- * The names are self-explanatory.
- */
- enum usersubs
- {
- US_dblogin, /* This also performs the first dbopen() */
- US_dbopen,
- US_dbclose,
- US_dbcmd,
- US_dbsqlexec,
- US_dbresults,
- US_dbnextrow,
- US_dbcancel,
- US_dbcanquery,
- US_dbexit,
- US_dbuse,
- #ifdef HAS_CALLBACK
- US_dberrhandle,
- US_dbmsghandle,
- #endif
- US_dbstrcpy,
- US_DBMORECMDS,
- US_DBCMDROW,
- US_DBROWS,
- US_DBCOUNT,
- US_DBCURCMD,
- US_dbhasretstat,
- US_dbretstatus,
- US_dbretdata,
- US_dbwritetext,
- US_dbcoltype,
- US_dbcolname,
- US_dbcollen,
- US_dbnumcols,
- US_dbfreebuf,
- US_dbsetopt,
- #if DBLIBVS >= 420
- US_dbsafestr,
- US_dbrecftos,
- #if DBLIBVS >= 461
- US_dbmny4add,
- US_dbmny4cmp,
- US_dbmny4divide,
- US_dbmny4minus,
- US_dbmny4mul,
- US_dbmny4sub,
- US_dbmny4zero,
- US_dbmnyadd,
- US_dbmnycmp,
- US_dbmnydivide,
- US_dbmnyminus,
- US_dbmnymul,
- US_dbmnysub,
- US_dbmnyzero,
- US_dbmnydec,
- US_dbmnydown,
- US_dbmnyinc,
- US_dbmnyinit,
- US_dbmnymaxneg,
- US_dbmnymaxpos,
- US_dbmnyndigit,
- US_dbmnyscale,
- US_DBSETLCHARSET,
- US_DBSETLNATLANG,
- #endif
- #endif
- US_BCP_SETL,
- #if DBLIBVS >= 461
- US_bcp_getl,
- #endif
- US_bcp_init,
- US_bcp_meminit,
- US_bcp_sendrow,
- US_bcp_batch,
- US_bcp_done,
- US_bcp_control,
- US_bcp_columns,
- US_bcp_colfmt,
- US_bcp_collen,
- US_bcp_exec,
- US_bcp_readfmt,
- US_bcp_writefmt,
- };
-
- #ifndef MAX_DBPROCS
- #define MAX_DBPROCS 25 /* Change this if you really want your perl script to talk to */
- /* more than 25 dataserver connections at a time ...*/
- #endif
-
-
- /* some info that needs to be maintained on a per DBPROCESS basis. */
- struct dbProcInfo
- {
- DBPROCESS *dbproc;
- BYTE **colPtr;
- };
-
- static LOGINREC *login;
- static struct dbProcInfo dbProc[MAX_DBPROCS];
- static int exitCalled = 0; /* Set to 1 if dbexit() has been called. */
- static int ComputeId;
- static int DBstatus; /* Set by dbnextrow() */
- static int dbNullIsUndef;
- static int dbKeepNumeric;
- static int dbBin0x;
-
- /* Stack pointer for the error routines. This is set to the stack pointer
- when entering into the sybase subroutines. Error and message
- handling needs this. */
-
- static int perl_sp;
-
- /* Current error handler name. */
-
- static char *err_handler_sub;
-
- /* Current message handler subroutine name */
-
- static char *msg_handler_sub;
-
- /* Macro to access the stack. This is necessary since error handlers may
- call perl routines and thus the stack may change. I hope most compilers
- will optimize this reasonably. */
-
- #define STACK(SP) (stack->ary_array + (SP))
-
-
- static int usersub();
- static int userset();
- static int userval();
- static int err_handler(), msg_handler();
- static int getDbProc();
- static char scriptName[32];
-
- int
- userinit()
- {
- char *p;
- int len;
-
- if(!(p = strrchr(origfilename, '/')))
- p = origfilename;
- else
- ++p;
- if((len = strlen(p)) > 30)
- len = 30;
- strncpy(scriptName, p, len);
-
- init_sybase();
- }
-
- int
- init_sybase()
- {
- struct ufuncs uf;
- char *filename = "sybase.c";
-
- if (dbinit() == FAIL) /* initialize dblibrary */
- exit(ERREXIT);
- /*
- * Install the user-supplied error-handling and message-handling routines.
- * They are defined at the bottom of this source file.
- */
- dberrhandle(err_handler);
- dbmsghandle(msg_handler);
-
- if(MAX_DBPROCS > 25)
- dbsetmaxprocs(MAX_DBPROCS);
-
- login = dblogin();
- DBSETLAPP(login, scriptName);
-
- uf.uf_set = userset;
- uf.uf_val = userval;
-
- #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
-
- MAGICVAR("SUCCEED", UV_SUCCEED);
- MAGICVAR("FAIL",UV_FAIL);
- MAGICVAR("NO_MORE_ROWS", UV_NO_MORE_ROWS);
- MAGICVAR("NO_MORE_RESULTS", UV_NO_MORE_RESULTS);
- MAGICVAR("ComputeId", UV_ComputeId);
- MAGICVAR("SybperlVer", UV_SybperlVer);
- MAGICVAR("DBstatus", UV_DBstatus);
- #if DBLIBVS >= 461
- MAGICVAR("STDEXIT", UV_STDEXIT);
- MAGICVAR("ERREXIT", UV_ERREXIT);
- MAGICVAR("INT_EXIT", UV_INT_EXIT);
- MAGICVAR("INT_CONTINUE", UV_INT_CONTINUE);
- MAGICVAR("INT_CANCEL", UV_INT_CANCEL);
- MAGICVAR("INT_TIMEOUT", UV_INT_TIMEOUT);
- MAGICVAR("MORE_ROWS", UV_MORE_ROWS);
- MAGICVAR("REG_ROW", UV_REG_ROW);
- MAGICVAR("BUF_FULL", UV_BUF_FULL);
- MAGICVAR("NO_MORE_PARAMS", UV_NO_MORE_PARAMS);
- MAGICVAR("DBSAVE", UV_DBSAVE);
- MAGICVAR("DBNOSAVE", UV_DBNOSAVE);
- MAGICVAR("DBNOERR", UV_DBNOERR);
- MAGICVAR("DB_PASSTHRU_MORE", UV_DB_PASSTHRU_MORE);
- MAGICVAR("DB_PASSTHRU_EOM", UV_DB_PASSTHRU_EOM);
- MAGICVAR("DBNOPROC", UV_DBNOPROC);
- MAGICVAR("EXCEPTION", UV_EXCEPTION);
- MAGICVAR("EXSIGNAL", UV_EXSIGNAL);
- MAGICVAR("EXSCREENIO", UV_EXSCREENIO);
- MAGICVAR("EXDBLIB", UV_EXDBLIB);
- MAGICVAR("EXFORMS", UV_EXFORMS);
- MAGICVAR("EXCLIPBOARD", UV_EXCLIPBOARD);
- MAGICVAR("EXLOOKUP", UV_EXLOOKUP);
- MAGICVAR("EXINFO", UV_EXINFO);
- MAGICVAR("EXUSER", UV_EXUSER);
- MAGICVAR("EXNONFATAL", UV_EXNONFATAL);
- MAGICVAR("EXCONVERSION", UV_EXCONVERSION);
- MAGICVAR("EXSERVER", UV_EXSERVER);
- MAGICVAR("EXTIME", UV_EXTIME);
- MAGICVAR("EXPROGRAM", UV_EXPROGRAM);
- MAGICVAR("EXRESOURCE", UV_EXRESOURCE);
- MAGICVAR("EXCOMM", UV_EXCOMM);
- MAGICVAR("EXFATAL", UV_EXFATAL);
- MAGICVAR("EXCONSISTENCY", UV_EXCONSISTENCY);
- #endif
- MAGICVAR("DB_IN", UV_DB_IN);
- MAGICVAR("DB_OUT", UV_DB_OUT);
- MAGICVAR("BCPMAXERRS", UV_BCPMAXERRS);
- MAGICVAR("BCPFIRST", UV_BCPFIRST);
- MAGICVAR("BCPLAST", UV_BCPLAST);
- MAGICVAR("BCPBATCH", UV_BCPBATCH);
- MAGICVAR("DBTRUE", UV_DBTRUE);
- MAGICVAR("DBFALSE", UV_DBFALSE);
- #if defined(PACKAGE_BUG)
- MAGICVAR("SybPackageBug", UV_PACKAGE_BUG);
- #endif
- MAGICVAR("dbNullIsUndef", UV_dbNullIsUndef);
- MAGICVAR("dbKeepNumeric", UV_dbKeepNumeric);
- MAGICVAR("dbBin0x", UV_dbBin0x);
-
- #if defined(PACKAGE_BUG)
- make_usub("dbLOGIN", US_dblogin, usersub, filename);
- make_usub("dbOPEN", US_dbopen, usersub, filename);
- make_usub("dbCLOSE", US_dbclose, usersub, filename);
- make_usub("dbCMD", US_dbcmd, usersub, filename);
- make_usub("dbSQLEXEC", US_dbsqlexec, usersub, filename);
- make_usub("dbRESULTS", US_dbresults, usersub, filename);
- make_usub("dbNEXTROW", US_dbnextrow, usersub, filename);
- make_usub("dbCANCEL", US_dbcancel, usersub, filename);
- make_usub("dbCANQUERY", US_dbcanquery, usersub, filename);
- make_usub("dbEXIT", US_dbexit, usersub, filename);
- make_usub("dbUSE", US_dbuse, usersub, filename);
- #ifdef HAS_CALLBACK
- make_usub("dbERRHANDLE", US_dberrhandle, usersub, filename);
- make_usub("dbMSGHANDLE", US_dbmsghandle, usersub, filename);
- #endif
- make_usub("dbSTRCPY", US_dbstrcpy, usersub, filename);
- make_usub("dbCURCMD", US_DBCURCMD, usersub, filename);
- make_usub("dbMORECMDS", US_DBMORECMDS, usersub, filename);
- make_usub("dbCMDROW", US_DBCMDROW, usersub, filename);
- make_usub("dbROWS", US_DBROWS, usersub, filename);
- make_usub("dbCOUNT", US_DBCOUNT, usersub, filename);
- make_usub("dbHASRETSTAT", US_dbhasretstat, usersub, filename);
- make_usub("dbRETSTATUS", US_dbretstatus, usersub, filename);
- make_usub("dbRETDATA", US_dbretdata, usersub, filename);
- make_usub("dbWRITETEXT", US_dbwritetext, usersub, filename);
- make_usub("dbCOLTYPE", US_dbcoltype, usersub, filename);
- make_usub("dbCOLNAME", US_dbcolname, usersub, filename);
- make_usub("dbCOLLEN", US_dbcollen, usersub, filename);
- make_usub("dbNUMCOLS", US_dbnumcols, usersub, filename);
- make_usub("dbFREEBUF", US_dbfreebuf, usersub, filename);
- make_usub("dbSETOPT", US_dbsetopt, usersub, filename);
- #if DBLIBVS >= 420
- make_usub("dbSAFESTR", US_dbsafestr, usersub, filename);
- make_usub("dbRECFTOS", US_dbrecftos, usersub, filename);
- #if DBLIBVS >= 461
- make_usub("dbMNY4ADD", US_dbmny4add, usersub, filename);
- make_usub("dbMNY4CMP", US_dbmny4cmp, usersub, filename);
- make_usub("dbMNY4DIVIDE", US_dbmny4divide, usersub, filename);
- make_usub("dbMNY4MINUS", US_dbmny4minus, usersub, filename);
- make_usub("dbMNY4MUL", US_dbmny4mul, usersub, filename);
- make_usub("dbMNY4SUB", US_dbmny4sub, usersub, filename);
- make_usub("dbMNY4ZERO", US_dbmny4zero, usersub, filename);
- make_usub("dbMNYADD", US_dbmnyadd, usersub, filename);
- make_usub("dbMNYCMP", US_dbmnycmp, usersub, filename);
- make_usub("dbMNYDIVIDE", US_dbmnydivide, usersub, filename);
- make_usub("dbMNYMINUS", US_dbmnyminus, usersub, filename);
- make_usub("dbMNYMUL", US_dbmnymul, usersub, filename);
- make_usub("dbMNYSUB", US_dbmnysub, usersub, filename);
- make_usub("dbMNYZERO", US_dbmnyzero, usersub, filename);
- make_usub("dbMNYDEC", US_dbmnydec, usersub, filename);
- make_usub("dbMNYDOWN", US_dbmnydown, usersub, filename);
- make_usub("dbMNYINC", US_dbmnyinc, usersub, filename);
- make_usub("dbMNYINIT", US_dbmnyinit, usersub, filename);
- make_usub("dbMNYMAXNEG", US_dbmnymaxneg, usersub, filename);
- make_usub("dbMNYMAXPOS", US_dbmnymaxpos, usersub, filename);
- make_usub("dbMNYNDIGIT", US_dbmnyndigit, usersub, filename);
- make_usub("dbMNYSCALE", US_dbmnyscale, usersub, filename);
- make_usub("bcp_GETL", US_bcp_getl, usersub, filename);
- make_usub("dbSETLCHARSET", US_DBSETLCHARSET, usersub, filename);
- make_usub("dbSETLNATLANG", US_DBSETLNATLANG, usersub, filename);
- #endif
- #endif
- make_usub("bcp_SETL", US_BCP_SETL, usersub, filename);
- make_usub("bcp_INIT", US_bcp_init, usersub, filename);
- make_usub("bcp_MEMINIT", US_bcp_meminit, usersub, filename);
- make_usub("bcp_SENDROW", US_bcp_sendrow, usersub, filename);
- make_usub("bcp_BATCH", US_bcp_batch, usersub, filename);
- make_usub("bcp_DONE", US_bcp_done, usersub, filename);
- make_usub("bcp_CONTROL", US_bcp_control, usersub, filename);
- make_usub("bcp_COLUMNS", US_bcp_columns, usersub, filename);
- make_usub("bcp_COLFMT", US_bcp_colfmt, usersub, filename);
- make_usub("bcp_COLLEN", US_bcp_collen, usersub, filename);
- make_usub("bcp_EXEC", US_bcp_exec, usersub, filename);
- make_usub("bcp_READFMT", US_bcp_readfmt, usersub, filename);
- make_usub("bcp_WRITEFMT", US_bcp_writefmt, usersub, filename);
- #else
- make_usub("dblogin", US_dblogin, usersub, filename);
- make_usub("dbopen", US_dbopen, usersub, filename);
- make_usub("dbclose", US_dbclose, usersub, filename);
- make_usub("dbcmd", US_dbcmd, usersub, filename);
- make_usub("dbsqlexec", US_dbsqlexec, usersub, filename);
- make_usub("dbresults", US_dbresults, usersub, filename);
- make_usub("dbnextrow", US_dbnextrow, usersub, filename);
- make_usub("dbcancel", US_dbcancel, usersub, filename);
- make_usub("dbcanquery", US_dbcanquery, usersub, filename);
- make_usub("dbexit", US_dbexit, usersub, filename);
- make_usub("dbuse", US_dbuse, usersub, filename);
- #ifdef HAS_CALLBACK
- make_usub("dberrhandle", US_dberrhandle, usersub, filename);
- make_usub("dbmsghandle", US_dbmsghandle, usersub, filename);
- #endif
- make_usub("dbstrcpy", US_dbstrcpy, usersub, filename);
- make_usub("DBCURCMD", US_DBCURCMD, usersub, filename);
- make_usub("DBMORECMDS", US_DBMORECMDS, usersub, filename);
- make_usub("DBCMDROW", US_DBCMDROW, usersub, filename);
- make_usub("DBROWS", US_DBROWS, usersub, filename);
- make_usub("DBCOUNT", US_DBCOUNT, usersub, filename);
- make_usub("dbhasretstat", US_dbhasretstat, usersub, filename);
- make_usub("dbretstatus", US_dbretstatus, usersub, filename);
- make_usub("dbretdata", US_dbretdata, usersub, filename);
- make_usub("dbwritetext", US_dbwritetext, usersub, filename);
- make_usub("dbcoltype", US_dbcoltype, usersub, filename);
- make_usub("dbcolname", US_dbcolname, usersub, filename);
- make_usub("dbcollen", US_dbcollen, usersub, filename);
- make_usub("dbnumcols", US_dbnumcols, usersub, filename);
- make_usub("dbfreebuf", US_dbfreebuf, usersub, filename);
- make_usub("dbsetopt", US_dbsetopt, usersub, filename);
- #if DBLIBVS >= 420
- make_usub("dbsafestr", US_dbsafestr, usersub, filename);
- make_usub("dbrecftos", US_dbrecftos, usersub, filename);
- #if DBLIBVS >= 461
- make_usub("dbmny4add", US_dbmny4add, usersub, filename);
- make_usub("dbmny4cmp", US_dbmny4cmp, usersub, filename);
- make_usub("dbmny4divide", US_dbmny4divide, usersub, filename);
- make_usub("dbmny4minus", US_dbmny4minus, usersub, filename);
- make_usub("dbmny4mul", US_dbmny4mul, usersub, filename);
- make_usub("dbmny4sub", US_dbmny4sub, usersub, filename);
- make_usub("dbmny4zero", US_dbmny4zero, usersub, filename);
- make_usub("dbmnyadd", US_dbmnyadd, usersub, filename);
- make_usub("dbmnycmp", US_dbmnycmp, usersub, filename);
- make_usub("dbmnydivide", US_dbmnydivide, usersub, filename);
- make_usub("dbmnyminus", US_dbmnyminus, usersub, filename);
- make_usub("dbmnymul", US_dbmnymul, usersub, filename);
- make_usub("dbmnysub", US_dbmnysub, usersub, filename);
- make_usub("dbmnyzero", US_dbmnyzero, usersub, filename);
- make_usub("dbmnydec", US_dbmnydec, usersub, filename);
- make_usub("dbmnydown", US_dbmnydown, usersub, filename);
- make_usub("dbmnyinc", US_dbmnyinc, usersub, filename);
- make_usub("dbmnyinit", US_dbmnyinit, usersub, filename);
- make_usub("dbmnymaxneg", US_dbmnymaxneg, usersub, filename);
- make_usub("dbmnymaxpos", US_dbmnymaxpos, usersub, filename);
- make_usub("dbmnyndigit", US_dbmnyndigit, usersub, filename);
- make_usub("dbmnyscale", US_dbmnyscale, usersub, filename);
- make_usub("bcp_getl", US_bcp_getl, usersub, filename);
- make_usub("DBSETLCHARSET", US_DBSETLCHARSET, usersub, filename);
- make_usub("DBSETLNATLANG", US_DBSETLNATLANG, usersub, filename);
- #endif
- #endif
- make_usub("BCP_SETL", US_BCP_SETL, usersub, filename);
- make_usub("bcp_init", US_bcp_init, usersub, filename);
- make_usub("bcp_meminit", US_bcp_meminit, usersub, filename);
- make_usub("bcp_sendrow", US_bcp_sendrow, usersub, filename);
- make_usub("bcp_batch", US_bcp_batch, usersub, filename);
- make_usub("bcp_done", US_bcp_done, usersub, filename);
- make_usub("bcp_control", US_bcp_control, usersub, filename);
- make_usub("bcp_columns", US_bcp_columns, usersub, filename);
- make_usub("bcp_colfmt", US_bcp_colfmt, usersub, filename);
- make_usub("bcp_collen", US_bcp_collen, usersub, filename);
- make_usub("bcp_exec", US_bcp_exec, usersub, filename);
- make_usub("bcp_readfmt", US_bcp_readfmt, usersub, filename);
- make_usub("bcp_writefmt", US_bcp_writefmt, usersub, filename);
- #endif
- }
-
- static int
- usersub(ix, sp, items)
- int ix;
- register int sp;
- register int items;
- {
- ARRAY *ary = stack;
- STR *Str; /* used in str_get and str_gnum macros */
- static int first = 1; /* set to 0 once a call to dblogin/dbopen */
- /* has been made */
- int inx = -1; /* Index into dbProc[] array. Passed as */
- /* first parameter to nearly all &dbxxx() calls */
-
- if(exitCalled)
- fatal("&dbexit() has been called. Access to Sybase impossible.");
-
- perl_sp = sp + items; /* Save the stack pointer - */
- /* required in the case where */
- /* callbacks are used. */
-
- /*
- * We're calling some dblib function, but &dblogin has not been
- * called. Two actions are possible: either fail the call, or call
- * dbopen with the default info. The second option is enabled
- * AUTO_LOGIN is defined. This saves a couple of keystrokes, but it can
- * only be used if you are in a trusted environment.
- */
- if(first && (ix != US_dblogin) &&
- (ix != US_dbmsghandle) && (ix != US_dberrhandle) && (ix != US_BCP_SETL)
- #if DBLIBVS >= 420
- && (ix != US_dbrecftos)
- #endif
- )
- { /* You can call &dbmsghandle/errhandle before calling &dblogin */
- #ifdef AUTO_LOGIN
- dbProc[0].dbproc = dbopen(login, NULL);
- first = 0;
- #else
- fatal("&dblogin has not been called yet!");
- #endif
- }
-
- switch (ix)
- {
- case US_dblogin:
- if (items > 3)
- fatal("Usage: &dblogin([user[,pwd[,server]]])");
- else
- {
- int j = 0;
- char *server = NULL, *user = NULL, *pwd = NULL;
-
- /* Reset the password and user fields in the LOGINREC.
- Otherwise, calling &dblogin with a null password/username
- after calling it with a non-null field will result in
- the non-null value being used... (1.011) */
-
- DBSETLPWD(login, NULL);
- DBSETLUSER(login, NULL);
-
- switch(items)
- {
- case 3:
- if(STACK(sp)[3] != &str_undef)
- {
- server = (char *)str_get(STACK(sp)[3]);
- if(!server || !strlen(server))
- server = NULL;
- }
- case 2:
- if(STACK(sp)[2] != &str_undef)
- {
- pwd = (char *)str_get(STACK(sp)[2]);
- if(pwd && strlen(pwd))
- DBSETLPWD(login, pwd);
- }
- case 1:
- if(STACK(sp)[1] != &str_undef)
- {
- user = (char *)str_get(STACK(sp)[1]);
- if(user && strlen(user))
- DBSETLUSER(login, user);
- }
- }
-
- for(j = 0; j < MAX_DBPROCS; ++j)
- if(dbProc[j].dbproc == NULL)
- break;
- if(j == MAX_DBPROCS)
- fatal ("&dblogin: No more dbprocs available.");
- if((dbProc[j].dbproc = dbopen(login, server)) == NULL)
- j = -1;
-
- first = 0;
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
- case US_dbopen:
- if (items > 1)
- fatal("Usage: $dbproc = &dbopen([server]);");
- else
- {
- int j;
- char *server = NULL;
-
- for(j = 0; j < MAX_DBPROCS; ++j)
- if(dbProc[j].dbproc == NULL)
- break;
- if(j == MAX_DBPROCS)
- fatal("&dbopen: No more dbprocs available.");
- if(items == 1)
- server = (char *)str_get(STACK(sp)[1]);
-
- dbProc[j].dbproc = dbopen(login, server);
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
- case US_dbclose:
- if (items > 1)
- fatal("Usage: $ret = &dbclose($dbproc);");
- else
- {
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- dbclose(dbProc[inx].dbproc);
- dbProc[inx].dbproc = (DBPROCESS *)NULL;
- }
- break;
- case US_dbcancel:
- if (items > 1)
- fatal("Usage: &dbcancel($dbproc)");
- else
- {
- int retval;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- retval = dbcancel(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbcanquery:
- if (items > 1)
- fatal("Usage: &dbcanquery($dbproc)");
- else
- {
- int retval;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- retval = dbcanquery(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbfreebuf:
- if (items > 1)
- fatal("Usage: &dbfreebuf($dbproc)");
- else
- {
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- dbfreebuf(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], 1.0); /* it's a void function, so just */
- /* return 1 anyway... */
- }
- break;
-
- case US_dbsetopt:
- if (!(items == 3 || items == 4))
- fatal ("Usage: $ret = &dbsetopt($dbproc,$option, $char_param [,$int_param])");
- else
- {
- int inx, option;
- char *charParam;
- int intParam, ret;
-
- inx = getDbProc(STACK(sp)[1]);
- option = (int)str_gnum(STACK(sp)[2]);
- charParam = str_get(STACK(sp)[3]);
- if(items == 4)
- intParam = (int)str_gnum(STACK(sp)[4]);
- else
- intParam = 0;
- ret = dbsetopt (dbProc[inx].dbproc, option, charParam,intParam);
- str_numset(STACK(sp)[0], (double) ret);
- }
- break;
-
- case US_dbexit:
- if (items != 0)
- fatal("Usage: &dbexit()");
- else
- {
- dbexit();
- exitCalled++;
- str_numset(STACK(sp)[0], (double) 1);
- }
- break;
-
- case US_dbuse:
- if (items > 2)
- fatal("Usage: &dbuse($dbproc, $database)");
- else
- {
- int retval, off;
- char str[255];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
- strcpy(str, (char *)str_get(STACK(sp)[off]));
-
-
- retval = dbuse(dbProc[inx].dbproc, str);
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbsqlexec:
- if (items > 1)
- fatal("Usage: &dbsqlexec($dbproc)");
- else
- {
- int retval;
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- retval = dbsqlexec(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbresults:
- if (items > 1)
- fatal("Usage: &dbresults($dbproc)");
- else
- {
- int retval;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- retval = dbresults(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbcmd:
- if (items > 2)
- fatal("Usage: &dbcmd($dbproc, $str)");
- else
- {
- int retval, off;
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- retval = dbcmd(dbProc[inx].dbproc, (char *)str_get(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
-
- case US_dbnextrow:
- if (items > 2)
- fatal("Usage: @arr = &dbnextrow([$dbproc [, $returnAssoc]])");
- else
- {
- int retval;
- char buff[260], *p = NULL, *t;
- BYTE *data;
- int col, type, numcols;
- int len;
- int doAssoc = 0;
- DBFLT8 tmp;
- char *colname;
- char cname[64];
- int is_numeric;
- int is_null;
- #if DBLIBVS >= 461
- DBMONEY tv_money;
- #endif
-
- inx = 0;
- switch(items)
- {
- case 2:
- doAssoc = (int)str_gnum(STACK(sp)[2]);
- case 1:
- inx = getDbProc(STACK(sp)[1]);
- break;
- }
-
- --sp; /* get rid of space pre-allocation */
-
- DBstatus = retval = dbnextrow(dbProc[inx].dbproc);
- if(retval == REG_ROW)
- {
- ComputeId = 0;
- numcols = dbnumcols(dbProc[inx].dbproc);
- }
- else
- {
- ComputeId = retval;
- numcols = dbnumalts(dbProc[inx].dbproc, ComputeId);
- }
- for(col = 1, buff[0] = 0; col <= numcols; ++col)
- {
- is_numeric = 0;
- is_null = 0;
- colname = NULL;
- if(!ComputeId)
- {
- type = dbcoltype(dbProc[inx].dbproc, col);
- len = dbdatlen(dbProc[inx].dbproc,col);
- data = (BYTE *)dbdata(dbProc[inx].dbproc,col);
- colname = dbcolname(dbProc[inx].dbproc, col);
- if(!colname || !colname[0])
- {
- sprintf(cname, "Col %d", col);
- colname = cname;
- }
- }
- else
- {
- int colid = dbaltcolid(dbProc[inx].dbproc, ComputeId, col);
- type = dbalttype(dbProc[inx].dbproc, ComputeId, col);
- len = dbadlen(dbProc[inx].dbproc, ComputeId, col);
- data = (BYTE *)dbadata(dbProc[inx].dbproc, ComputeId, col);
- if(colid > 0)
- colname = dbcolname(dbProc[inx].dbproc, colid);
- if(!colname || !colname[0])
- {
- sprintf(cname, "Col %d", col);
- colname = cname;
- }
- }
- t = &buff[0];
- if(!data && !len)
- ++is_null;
- else
- {
- switch(type)
- {
- case SYBCHAR:
- strncpy(buff,data,len);
- buff[len] = 0;
- break;
- case SYBTEXT:
- case SYBIMAGE:
- New(902, p, len + 1, char);
- memcpy(p, data, len);
- p[len] = 0;
- t = p;
- break;
- case SYBINT1:
- case SYBBIT: /* a bit is at least a byte long... */
- if(dbKeepNumeric)
- {
- tmp = *(DBTINYINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%u",*(DBTINYINT *)data);
- break;
- case SYBINT2:
- if(dbKeepNumeric)
- {
- tmp = *(DBSMALLINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%d",*(DBSMALLINT *)data);
- break;
- case SYBINT4:
- if(dbKeepNumeric)
- {
- tmp = *(DBINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%d",*(DBINT *)data);
- break;
- case SYBFLT8:
- if(dbKeepNumeric)
- {
- tmp = *(DBFLT8 *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%.6f",*(DBFLT8 *)data);
- break;
- #if DBLIBVS >= 461
- case SYBMONEY:
- dbconvert(dbProc[inx].dbproc, SYBMONEY, data, len,
- SYBMONEY, (BYTE*)&tv_money, -1);
- new_mnytochar(dbProc[inx].dbproc, &tv_money, buff);
- break;
- #else
- case SYBMONEY:
- dbconvert(dbProc[inx].dbproc, SYBMONEY, data, len,
- SYBFLT8, &tmp, -1);
- if(dbKeepNumeric)
- ++is_numeric;
- else
- sprintf(buff,"%.6f",tmp);
- break;
- #endif
- case SYBDATETIME:
- dbconvert(dbProc[inx].dbproc, SYBDATETIME, data, len,
- SYBCHAR, buff, -1);
- break;
- case SYBBINARY:
- if(dbBin0x)
- {
- strcpy(buff, "0x");
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, &buff[2], -1);
- }
- else
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, buff, -1);
- break;
- #if DBLIBVS >= 420
- case SYBREAL:
- if(dbKeepNumeric)
- {
- tmp = *(DBREAL *)data;
- ++is_numeric;
- }
- else
- sprintf(buff, "%.6f", (double)*(DBREAL *)data);
- break;
- case SYBDATETIME4:
- dbconvert(dbProc[inx].dbproc, SYBDATETIME4, data, len,
- SYBCHAR, buff, -1);
- break;
- #if DBLIBVS >= 461
- case SYBMONEY4:
- dbconvert(dbProc[inx].dbproc, SYBMONEY4, data, len,
- SYBMONEY, (BYTE*)&tv_money, -1);
- new_mnytochar(dbProc[inx].dbproc, &tv_money, buff);
- break;
- #endif
- #endif
- default:
- /*
- * WARNING!
- *
- * We convert unknown data types to SYBCHAR
- * without checking to see if the resulting
- * string will fit in the 'buff' variable.
- * This isn't very pretty...
- */
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, buff, -1);
- break;
- }
- }
- if(doAssoc)
- (void)astore(ary,++sp,str_2mortal(str_make(colname, 0)));
- if(type != SYBIMAGE && type != SYBTEXT)
- len = 0; /* str_make needs to know the lenght only on binary data */
- if(is_null)
- {
- if(dbNullIsUndef)
- {
- /* we make a copy of str_undef to be on the safe */
- /* side (we don't want somebody modifying it! */
- (void)astore(ary,++sp,str_mortal(&str_undef));
- continue; /* whatever follows here (in this iteration) is irrelevant */
- /* when NULLs are returned as undef */
- }
- else
- strcpy(buff,"NULL");
- }
- if(is_numeric)
- (void)astore(ary,++sp,str_2mortal(str_nmake(tmp)));
- else
- (void)astore(ary,++sp,str_2mortal(str_make(t, len)));
- /*
- * If we've allocated some space to retrieve a
- * SYBTEXT field, then free it now.
- */
- if(t == p)
- {
- Safefree(p);
- p = NULL;
- }
- }
- }
- break;
- #ifdef HAS_CALLBACK
- case US_dberrhandle:
- if (items > 1)
- fatal ("Usage: &dberrhandle($handler)");
- else
- {
- char *old = err_handler_sub;
- if (items == 1)
- {
- if (STACK (sp)[1] == &str_undef)
- err_handler_sub = 0;
- else
- {
- char *sub = (char *) str_get (STACK (sp)[1]);
- New (902, err_handler_sub, strlen (sub) + 1, char);
- strcpy (err_handler_sub, sub);
- }
- }
-
- if (old)
- {
- STACK (sp)[0] = str_2mortal (str_make (old, strlen (old)));
- if (items == 1)
- Safefree (old);
- }
- else
- STACK (sp)[0] = &str_undef;
- }
- break;
- case US_dbmsghandle:
- if (items > 1)
- fatal ("Usage: &dbmsghandle($handler)");
- else
- {
- char *old = msg_handler_sub;
- if (items == 1)
- {
- if (STACK (sp)[1] == &str_undef)
- msg_handler_sub = 0;
- else
- {
- char *sub = (char *) str_get (STACK (sp)[1]);
- New (902, msg_handler_sub, strlen (sub) + 1, char);
- strcpy (msg_handler_sub, sub);
- }
- }
-
- if (old)
- {
- STACK (sp)[0] = str_2mortal (str_make (old, strlen (old)));
- if (items == 1)
- Safefree (old);
- }
- else
- STACK (sp)[0] = &str_undef;
- }
- break;
- #endif /* HAS_CALLBACK */
- case US_dbstrcpy:
- if (items > 1)
- fatal("Usage: $string = &dbstrcpy($dbproc)");
- else
- {
- int retval, len;
- char *buff;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc && (len = dbstrlen(dbProc[inx].dbproc)))
- {
- New(902, buff, len+1, char);
- retval = dbstrcpy(dbProc[inx].dbproc, 0, -1, buff);
- str_set(STACK(sp)[0], buff);
- Safefree(buff);
- }
- else
- str_set(STACK(sp)[0], "");
- }
- break;
-
- case US_DBCURCMD:
- if (items > 1)
- fatal("Usage: $num = &DBCURCMD($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = DBCURCMD(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_DBMORECMDS:
- if (items > 1)
- fatal("Usage: $rc = &DBMORECMDS($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = DBMORECMDS(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_DBCMDROW:
- if (items > 1)
- fatal("Usage: $rc = &DBCMDROW($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = DBCMDROW(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_DBROWS:
- if (items > 1)
- fatal("Usage: $rc = &DBROWS($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = DBROWS(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_DBCOUNT:
- if (items > 1)
- fatal("Usage: $ret = &DBCOUNT($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = DBCOUNT(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_dbhasretstat:
- if (items > 1)
- fatal("Usage: $rc = &dbhasretstat($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = dbhasretstat(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_dbretstatus:
- if (items > 1)
- fatal("Usage: $rc = &dbretstatus($dbproc)");
- else
- {
- int retval = 0;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- if(dbProc[inx].dbproc)
- retval = dbretstatus(dbProc[inx].dbproc);
-
- str_numset(STACK(sp)[0], (double) retval);
- }
- break;
- case US_dbretdata:
- if (items > 2)
- fatal("Usage: @data = &dbretdata($dbproc [, $doAssoc])");
- else
- {
- int numrets;
- int retval;
- char buff[260], *p = NULL, *t;
- BYTE *data;
- int col, type;
- int len;
- int doAssoc = 0;
- DBFLT8 tmp;
- char *colname;
- char cname[64];
- int is_numeric;
- int is_null;
- #if DBLIBVS >= 461
- DBMONEY tv_money;
- #endif
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- doAssoc = str_gnum(STACK(sp)[2]);
- }
- else
- inx = 0;
- --sp; /* get rid of space pre-allocation */
-
- if(!(numrets = dbnumrets(dbProc[inx].dbproc)))
- break; /* nothing to return! */
-
- for(col = 1, buff[0] = 0; col <= numrets; ++col)
- {
- is_numeric = 0;
- is_null = 0;
- colname = NULL;
- type = dbrettype(dbProc[inx].dbproc, col);
- len = dbretlen(dbProc[inx].dbproc,col);
- data = (BYTE *)dbretdata(dbProc[inx].dbproc,col);
- colname = dbretname(dbProc[inx].dbproc, col);
- if(!colname || !colname[0])
- {
- sprintf(cname, "Par %d", col);
- colname = cname;
- }
- t = &buff[0];
- if(!data && !len)
- ++is_null;
- else
- {
- switch(type)
- {
- case SYBCHAR:
- strncpy(buff,data,len);
- buff[len] = 0;
- break;
- case SYBTEXT:
- case SYBIMAGE:
- New(902, p, len + 1, char);
- memcpy(p, data, len);
- p[len] = 0;
- t = p;
- break;
- case SYBINT1:
- case SYBBIT: /* a bit is at least a byte long... */
- if(dbKeepNumeric)
- {
- tmp = *(DBTINYINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%u",*(DBTINYINT *)data);
- break;
- case SYBINT2:
- if(dbKeepNumeric)
- {
- tmp = *(DBSMALLINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%d",*(DBSMALLINT *)data);
- break;
- case SYBINT4:
- if(dbKeepNumeric)
- {
- tmp = *(DBINT *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%d",*(DBINT *)data);
- break;
- case SYBFLT8:
- if(dbKeepNumeric)
- {
- tmp = *(DBFLT8 *)data;
- ++is_numeric;
- }
- else
- sprintf(buff,"%.6f",*(DBFLT8 *)data);
- break;
- #if DBLIBVS >= 461
- case SYBMONEY:
- dbconvert(dbProc[inx].dbproc, SYBMONEY, data, len,
- SYBMONEY, (BYTE*)&tv_money, -1);
- new_mnytochar(dbProc[inx].dbproc, &tv_money, buff);
- break;
- #else
- case SYBMONEY:
- dbconvert(dbProc[inx].dbproc, SYBMONEY, data, len,
- SYBFLT8, &tmp, -1);
- if(dbKeepNumeric)
- ++is_numeric;
- else
- sprintf(buff,"%.6f",tmp);
- break;
- #endif
- case SYBDATETIME:
- dbconvert(dbProc[inx].dbproc, SYBDATETIME, data, len,
- SYBCHAR, buff, -1);
- break;
- case SYBBINARY:
- if(dbBin0x)
- {
- strcpy(buff, "0x");
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, &buff[2], -1);
- }
- else
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, buff, -1);
- break;
- #if DBLIBVS >= 420
- case SYBREAL:
- if(dbKeepNumeric)
- {
- tmp = *(DBREAL *)data;
- ++is_numeric;
- }
- else
- sprintf(buff, "%.6f", (double)*(DBREAL *)data);
- break;
- case SYBDATETIME4:
- dbconvert(dbProc[inx].dbproc, SYBDATETIME4, data, len,
- SYBCHAR, buff, -1);
- break;
- #if DBLIBVS >= 461
- case SYBMONEY4:
- dbconvert(dbProc[inx].dbproc, SYBMONEY4, data, len,
- SYBMONEY, (BYTE*)&tv_money, -1);
- new_mnytochar(dbProc[inx].dbproc, &tv_money, buff);
- break;
- #endif
- #endif
- default:
- /*
- * WARNING!
- *
- * We convert unknown data types to SYBCHAR
- * without checking to see if the resulting
- * string will fit in the 'buff' variable.
- * This isn't very pretty...
- */
- dbconvert(dbProc[inx].dbproc, type, data, len,
- SYBCHAR, buff, -1);
- break;
- }
- }
- if(doAssoc)
- (void)astore(ary,++sp,str_2mortal(str_make(colname, 0)));
- if(type != SYBIMAGE && type != SYBTEXT)
- len = 0; /* str_make needs to know the lenght only on binary data */
- if(is_null)
- {
- if(dbNullIsUndef)
- {
- (void)astore(ary,++sp,str_mortal(&str_undef));
- continue; /* skip the rest of the processing */
- /* in this iteration */
- }
- else
- strcpy(buff,"NULL");
- }
- if(is_numeric)
- (void)astore(ary,++sp,str_2mortal(str_nmake(tmp)));
- else
- (void)astore(ary,++sp,str_2mortal(str_make(t, len)));
- /*
- * If we've allocated some space to retrieve a
- * SYBTEXT field, then free it now.
- */
- if(t == p)
- {
- Safefree(p);
- p = NULL;
- }
- }
- }
- break;
- #if DBLIBVS >= 420
- case US_dbsafestr:
- if (!(items == 3 || items == 2))
- fatal ("Usage: $string = &dbsafestr($dbproc,$instring[,$quote_char])");
- else
- {
- int retval, len, quote;
- char *buff, *instr;
-
- inx = getDbProc (STACK (sp)[1]);
-
- instr = (char *) str_get (STACK (sp)[2]);
- if (items != 3)
- quote = DBBOTH;
- else
- {
- char *quote_char = (char *) str_get (STACK (sp)[3]);
- if (*quote_char == '\"') /* " (to make hilite.el happy */
- quote = DBDOUBLE;
- else if (*quote_char == '\'')
- quote = DBSINGLE;
- else
- { /* invalid */
- str_set (STACK (sp)[0], "");
- break;
- }
- }
- if (dbProc[inx].dbproc && (len = strlen (instr)))
- {
- /* twice as much space needed worst case */
- New (902, buff, len * 2 + 1, char);
- retval = dbsafestr (dbProc[inx].dbproc, instr, -1, buff, -1, quote);
- str_set (STACK (sp)[0], buff);
- Safefree (buff);
- }
- }
- break;
- #if DBLIBVS >= 461
- case US_dbmny4add:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmny4add($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY4 m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4add $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4add $m2 parameter");
- }
-
- retval = dbmny4add(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmny4cmp:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: &dbmny4cmp($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY4 m1, m2;
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4cmp $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4cmp $m2 parameter");
- }
-
- retval = dbmny4cmp(dbProc[inx].dbproc, &m1, &m2);
-
- str_numset(STACK(sp)[0], (double)retval);
- }
- break;
- case US_dbmny4divide:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmny4divide($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY4 m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4divide $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4divide $m2 parameter");
- }
-
- retval = dbmny4divide(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmny4minus:
- if ((items > 2) || (items < 1 ))
- {
- fatal("Usage: @arr = &dbmny4minus($dbproc, $m1)");
- }
- else
- {
- int retval, off1;
- DBMONEY4 m1, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- }
- else
- {
- inx = 0;
- off1 = 1;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4minus $m1 parameter");
- }
-
- retval = dbmny4minus(dbProc[inx].dbproc, &m1, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmny4mul:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmny4mul($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY4 m1, m2, mresult;
- DBMONEY tv_money;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4mul $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4mul $m2 parameter");
- }
-
- retval = dbmny4mul(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmny4sub:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmny4sub($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY4 m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4sub $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY4, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmny4sub $m2 parameter");
- }
-
- retval = dbmny4sub(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmny4zero:
- if (items > 1)
- {
- fatal("Usage: @arr = &dbmny4zero($dbproc)");
- }
- else
- {
- int retval;
- DBMONEY4 mresult;
- DBMONEY tv_money;
- DBCHAR mnybuf[40];
-
- if(items == 1)
- {
- inx = getDbProc(STACK(sp)[1]);
- }
- else
- {
- inx = 0;
- }
-
- retval = dbmny4zero(dbProc[inx].dbproc, &mresult);
-
- new_mny4tochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnyadd:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnyadd($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyadd $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyadd $m2 parameter");
- }
-
- retval = dbmnyadd(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnycmp:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: &dbmnycmp($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY m1, m2;
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnycmp $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnycmp $m2 parameter");
- }
-
- retval = dbmnycmp(dbProc[inx].dbproc, &m1, &m2);
-
- str_numset(STACK(sp)[0], (double)retval);
- }
- break;
- case US_dbmnydivide:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnydivide($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnydivide $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnydivide $m2 parameter");
- }
-
- retval = dbmnydivide(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnyminus:
- if ((items > 2) || (items < 1 ))
- {
- fatal("Usage: @arr = &dbmnyminus($dbproc, $m1)");
- }
- else
- {
- int retval, off1;
- DBMONEY m1, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- }
- else
- {
- inx = 0;
- off1 = 1;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyminus $m1 parameter");
- }
-
- retval = dbmnyminus(dbProc[inx].dbproc, &m1, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnymul:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnymul($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnymul $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnymul $m2 parameter");
- }
-
- retval = dbmnymul(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnysub:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnysub($dbproc, $m1, $m2)");
- }
- else
- {
- int retval, off1, off2;
- DBMONEY m1, m2, mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnysub $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBMONEY, (BYTE*)&m2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnysub $m2 parameter");
- }
-
- retval = dbmnysub(dbProc[inx].dbproc, &m1, &m2, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnyzero:
- if (items > 1)
- {
- fatal("Usage: @arr = &dbmnyzero($dbproc)");
- }
- else
- {
- int retval;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 1)
- {
- inx = getDbProc(STACK(sp)[1]);
- }
- else
- {
- inx = 0;
- }
-
- retval = dbmnyzero(dbProc[inx].dbproc, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnydec:
- if ((items > 2) || (items < 1 ))
- {
- fatal("Usage: @arr = &dbmnydec($dbproc, $m1)");
- }
- else
- {
- int retval, off1;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- }
- else
- {
- inx = 0;
- off1 = 1;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE *)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnydec $m1 parameter");
- }
-
- retval = dbmnydec(dbProc[inx].dbproc, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnydown:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnydown($dbproc, $m1, $i1)");
- }
- else
- {
- int retval, off1, off2;
- int i1, iresult = 0;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnydown $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBINT4, (BYTE*)&i1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnydown $i1 parameter");
- }
-
- retval = dbmnydown(dbProc[inx].dbproc, &mresult, i1, &iresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)iresult)));
- }
- break;
- case US_dbmnyinc:
- if ((items > 2) || (items < 1 ))
- {
- fatal("Usage: @arr = &dbmnyinc($dbproc, $m1)");
- }
- else
- {
- int retval, off1;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- }
- else
- {
- inx = 0;
- off1 = 1;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyinc $m1 parameter");
- }
-
- retval = dbmnyinc(dbProc[inx].dbproc, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnyinit:
- if ((items > 3) || (items < 2 ))
- {
- fatal("Usage: @arr = &dbmnyinit($dbproc, $m1, $i1)");
- }
- else
- {
- int retval, off1, off2;
- DBINT i1, iresult;
- DBMONEY mresult;
- DBBOOL bresult = (DBBOOL)FALSE;
- DBCHAR mnybuf[40];
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyinit $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBINT4, (BYTE*)&i1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyinit $i1 parameter");
- }
-
- retval = dbmnyinit(dbProc[inx].dbproc, &mresult, i1, &bresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- iresult = (DBINT)bresult;
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)iresult)));
- }
- break;
- case US_dbmnymaxneg:
- if (items > 1)
- {
- fatal("Usage: @arr = &dbmnymaxneg($dbproc)");
- }
- else
- {
- int retval;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 1)
- {
- inx = getDbProc(STACK(sp)[1]);
- }
- else
- {
- inx = 0;
- }
-
- retval = dbmnymaxneg(dbProc[inx].dbproc, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnymaxpos:
- if (items > 1)
- {
- fatal("Usage: @arr = &dbmnymaxpos($dbproc)");
- }
- else
- {
- int retval;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 1)
- {
- inx = getDbProc(STACK(sp)[1]);
- }
- else
- {
- inx = 0;
- }
-
- retval = dbmnymaxpos(dbProc[inx].dbproc, &mresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
- case US_dbmnyndigit:
- if ((items > 2) || (items < 1 ))
- {
- fatal("Usage: @arr = &dbmnyndigit($dbproc, $m1)");
- }
- else
- {
- int retval, off1;
- DBMONEY mresult;
- DBINT iresult;
- DBBOOL bresult = (DBBOOL)FALSE;
- DBCHAR mnybuf[40], dgtbuf[ 10 ];
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- }
- else
- {
- inx = 0;
- off1 = 1;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyndigit $m1 parameter");
- }
-
- retval = dbmnyndigit(dbProc[inx].dbproc, &mresult, dgtbuf, &bresult);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- iresult = (DBINT)bresult;
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- (void)astore(ary,++sp,str_2mortal(str_make(dgtbuf, 0)));
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)iresult)));
- }
- break;
- case US_dbmnyscale:
- if ((items > 4) || (items < 3 ))
- {
- fatal("Usage: @arr = &dbmnyscale($dbproc, $m1, $i1, $i2)");
- }
- else
- {
- int retval, off1, off2, off3;
- DBINT i1, i2;
- DBMONEY mresult;
- DBCHAR mnybuf[40];
-
- if(items == 4)
- {
- inx = getDbProc(STACK(sp)[1]);
- off1 = 2;
- off2 = 3;
- off3 = 4;
- }
- else
- {
- inx = 0;
- off1 = 1;
- off2 = 2;
- off3 = 3;
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off1]), (DBINT)-1,
- SYBMONEY, (BYTE*)&mresult, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyscale $m1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off2]), (DBINT)-1,
- SYBINT4, (BYTE*)&i1, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyscale $i1 parameter");
- }
-
- if (dbconvert(dbProc[inx].dbproc, SYBCHAR,
- (char *)str_get(STACK(sp)[off3]), (DBINT)-1,
- SYBINT4, (BYTE*)&i2, (DBINT)-1) == -1)
- {
- fatal("Invalid dbconvert() for &dbmnyscale $i2 parameter");
- }
-
- retval = dbmnyscale(dbProc[inx].dbproc, &mresult, i1, i2);
-
- new_mnytochar(dbProc[inx].dbproc, &mresult, mnybuf);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)retval)));
- (void)astore(ary,++sp,str_2mortal(str_make(mnybuf, 0)));
- }
- break;
-
- case US_DBSETLCHARSET:
- if (items != 1)
- fatal("Usage: &DBSETLCHARSET(char_set);");
- else
- {
- DBSETLCHARSET(login, (char *)str_get(STACK(sp)[1]));
-
- str_numset(STACK(sp)[0], (double) 0);
- }
- break;
-
- case US_DBSETLNATLANG:
- if (items != 1)
- fatal("Usage: &DBSETLNATLANG(language);");
- else
- {
- DBSETLNATLANG(login, (char *)str_get(STACK(sp)[1]));
-
- str_numset(STACK(sp)[0], (double) 0);
- }
- break;
-
- #endif /* DBLIBVS >= 461 */
- case US_dbrecftos:
- if (items != 1)
- fatal("Usage: &dbrecftos($filename);");
- else
- {
- dbrecftos((char *)str_get(STACK(sp)[1]));
-
- str_numset(STACK(sp)[0], (double) 0);
- }
- break;
- #endif /* DBLIBVS >= 420 */
- case US_dbwritetext:
- if (items != 5)
- fatal ("Usage: dbwritetext($dbproc1,$column,$dbproc2,$col,$text");
- else
- {
- int inx2, wcolnum;
- char *wcolname, *wtext;
- int ret;
-
- inx = getDbProc(STACK(sp)[1]);
- wcolname = str_get(STACK(sp)[2]);
- inx2 = getDbProc(STACK(sp)[3]);
- wcolnum = (int)str_gnum(STACK(sp)[4]);
- Str = STACK(sp)[5];
- wtext = str_get(Str);
- ret = dbwritetext (dbProc[inx].dbproc, wcolname, dbtxptr(dbProc[inx2].dbproc, wcolnum),
- DBTXPLEN, dbtxtimestamp(dbProc[inx2].dbproc, wcolnum), 0,
- Str->str_len, wtext);
- str_numset(STACK(sp)[0], (double) ret);
- }
- break;
- case US_dbnumcols:
- if (items > 1)
- fatal("Usage: $dbnumcols = &dbnumcols($dbproc);");
- else
- {
- int j;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- j = dbnumcols(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
- case US_dbcoltype:
- if (items > 2 || items < 1)
- fatal("Usage: $dbcoltype = &dbcoltype($dbproc, columnid);");
- else
- {
- int j, off;
-
- if(items)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
-
- j = dbcoltype(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
- case US_dbcolname:
- if (items > 2 || items < 1)
- fatal("Usage: $dbcolname = &dbcolname($dbproc, columnid);");
- else
- {
- int j, off;
- char *colname;
-
- if(items)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
-
- colname = dbcolname(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]));
- str_set (STACK (sp)[0], colname);
- }
- break;
- case US_dbcollen:
- if (items > 2)
- fatal("Usage: $dbcollen = &dbcollen($dbproc, columnid);");
- else
- {
- int j, off;
-
- if(items)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
-
- j = dbcollen(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_BCP_SETL:
- if (items != 1)
- fatal("Usage: &BCP_SETL($state);");
- else
- {
- BCP_SETL(login, (int)str_gnum(STACK(sp)[1]));
- str_numset(STACK(sp)[0], (double) 0);
- }
- break;
- #if DBLIBVS >= 461
- case US_bcp_getl:
- if (items)
- fatal("Usage: $state = &bcp_getl();");
- else
- {
- int ret;
- ret = bcp_getl(login);
- str_numset(STACK(sp)[0], (double) ret);
- }
- break;
- #endif
- case US_bcp_init:
- if (items < 4 || items > 5)
- fatal("Usage: &bcp_init($dbproc, $tblname, $hfile, $errfile, $dir);");
- else
- {
- int j, off;
- char *hfile;
-
- if(items == 5)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
- hfile = str_get(STACK(sp)[off+1]);
- if((Str = STACK(sp)[off+1]) == &str_undef ||
- ((hfile = str_get(Str)) && strlen(hfile) == 0))
- hfile = NULL;
- j = bcp_init(dbProc[inx].dbproc, str_get(STACK(sp)[off]),
- hfile,
- str_get(STACK(sp)[off+2]),
- (int)str_gnum(STACK(sp)[off+3]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_meminit:
- if (items < 1 || items > 2)
- fatal("Usage: &bcp_meminit($dbproc, $num_cols);");
- else
- {
- int j, off, numcols;
- BYTE dummy;
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- numcols = str_gnum(STACK(sp)[off]);
- for(j = 1; j <= numcols; ++j)
- bcp_bind(dbProc[inx].dbproc, &dummy, 0, -1, "", 1, SYBCHAR, j);
-
- if(dbProc[inx].colPtr) /* avoid a potential memory leak */
- Safefree(dbProc[inx].colPtr);
- New (902, dbProc[inx].colPtr, numcols, BYTE *);
-
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_sendrow: /* WARNING: the dbproc param is NOT */
- /* optional for this call!!! */
- if (items < 2)
- fatal("Usage: &bcp_sendrow($dbproc, LIST);");
- else
- {
- int j, off;
-
- inx = getDbProc(STACK(sp)[1]);
- for(j = 1; j < items; ++j)
- {
- Str = STACK(sp)[j+1];
- if(Str == &str_undef) /* it's a NULL data value */
- bcp_collen(dbProc[inx].dbproc, 0, j);
- else
- bcp_collen(dbProc[inx].dbproc, -1, j);
- dbProc[inx].colPtr[j] = (BYTE *)str_get(Str);
- bcp_colptr(dbProc[inx].dbproc, dbProc[inx].colPtr[j], j);
- }
- j = bcp_sendrow(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_batch:
- if (items > 1)
- fatal("Usage: $ret = &bcp_batch($dbproc);");
- else
- {
- int j;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
-
- j = bcp_batch(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_done:
- if (items > 1)
- fatal("Usage: $ret = &bcp_done($dbproc);");
- else
- {
- int j;
-
- if(items)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
- if(dbProc[inx].colPtr)
- {
- Safefree(dbProc[inx].colPtr);
- dbProc[inx].colPtr = NULL;
- }
- j = bcp_done(dbProc[inx].dbproc);
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_control:
- if (items < 2 || items > 3)
- fatal("Usage: $ret = &bcp_control($dbproc, $field, $value);");
- else
- {
- int j, off;
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- j = bcp_control(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]),
- (int)str_gnum(STACK(sp)[off+1]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_columns:
- if (items < 1 || items > 2)
- fatal("Usage: $ret = &bcp_columns($dbproc, $host_colcount);");
- else
- {
- int j, off;
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- j = bcp_columns(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_colfmt:
- if (items < 7 || items > 8)
- fatal("Usage: $ret = &bcp_colfmt($dbproc, $host_colnum, $host_type, $host_prefixlen, $host_collen, $host_term, $host_termlen, $table_colnum);");
- else
- {
- int j, off;
- char *host_term;
-
- if(items == 8)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
-
- if(STACK(sp)[off+4] == &str_undef)
- host_term = NULL;
- else
- host_term = str_get(STACK(sp)[off+4]);
-
- j = bcp_colfmt(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]),
- (int)str_gnum(STACK(sp)[off+1]),
- (int)str_gnum(STACK(sp)[off+2]),
- (int)str_gnum(STACK(sp)[off+3]),
- host_term,
- (int)str_gnum(STACK(sp)[off+5]),
- (int)str_gnum(STACK(sp)[off+6]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_collen:
- if (items < 2 || items > 3)
- fatal("Usage: $ret = &bcp_collen($dbproc, $varlen, $table_column);");
- else
- {
- int j, off;
-
- if(items == 3)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- j = bcp_collen(dbProc[inx].dbproc, (int)str_gnum(STACK(sp)[off]),
- (int)str_gnum(STACK(sp)[off+1]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_exec:
- if (items > 1)
- fatal("Usage: ($ret, $rows_copied) = &bcp_exec($dbproc);");
- else
- {
- int j;
- DBINT rows;
-
- if(items == 1)
- inx = getDbProc(STACK(sp)[1]);
- else
- inx = 0;
- j = bcp_exec(dbProc[inx].dbproc, &rows);
-
- --sp; /* readjust to get rid of space preallocation */
-
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)j)));
- (void)astore(ary,++sp,str_2mortal(str_nmake((double)rows)));
- }
- break;
-
- case US_bcp_readfmt:
- if (items < 1 || items > 2)
- fatal("Usage: $ret = &bcp_readfmt($dbproc, $filename);");
- else
- {
- int j, off;
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- j = bcp_readfmt(dbProc[inx].dbproc, str_get(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- case US_bcp_writefmt:
- if (items < 1 || items > 2)
- fatal("Usage: $ret = &bcp_writefmt($dbproc, $filename);");
- else
- {
- int j, off;
-
- if(items == 2)
- {
- inx = getDbProc(STACK(sp)[1]);
- off = 2;
- }
- else
- inx = 0, off = 1;
- j = bcp_writefmt(dbProc[inx].dbproc, str_get(STACK(sp)[off]));
- str_numset(STACK(sp)[0], (double) j);
- }
- break;
-
- default:
- fatal("Unimplemented user-defined subroutine");
- }
- return sp;
- }
-
- /*
- * Return the value of a userdefined variable. These variables are nearly all
- * READ-ONLY.
- */
- static int
- userval(ix, str)
- int ix;
- STR *str;
- {
- char buff[24];
-
- switch (ix)
- {
- case UV_SUCCEED:
- str_numset(str, (double)SUCCEED);
- break;
- case UV_FAIL:
- str_numset(str, (double)FAIL);
- break;
- case UV_NO_MORE_ROWS:
- str_numset(str, (double)NO_MORE_ROWS);
- break;
- case UV_NO_MORE_RESULTS:
- str_numset(str, (double)NO_MORE_RESULTS);
- break;
- case UV_ComputeId:
- str_numset(str, (double)ComputeId);
- break;
- case UV_SybperlVer:
- sprintf(buff, "%d.%3.3d", VERSION, PATCHLEVEL);
- str_set(str, buff);
- break;
- case UV_DBstatus:
- str_numset(str, (double)DBstatus);
- break;
- #if DBLIBVS >= 461
- case UV_STDEXIT:
- str_numset(str, (double)STDEXIT);
- break;
- case UV_ERREXIT:
- str_numset(str, (double)ERREXIT);
- break;
- case UV_INT_EXIT:
- str_numset(str, (double)INT_EXIT);
- break;
- case UV_INT_CONTINUE:
- str_numset(str, (double)INT_CONTINUE);
- break;
- case UV_INT_CANCEL:
- str_numset(str, (double)INT_CANCEL);
- break;
- case UV_INT_TIMEOUT:
- str_numset(str, (double)INT_TIMEOUT);
- break;
- case UV_MORE_ROWS:
- str_numset(str, (double)MORE_ROWS);
- break;
- case UV_REG_ROW:
- str_numset(str, (double)REG_ROW);
- break;
- case UV_BUF_FULL:
- str_numset(str, (double)BUF_FULL);
- break;
- case UV_NO_MORE_PARAMS:
- str_numset(str, (double)NO_MORE_PARAMS);
- break;
- case UV_DBSAVE:
- str_numset(str, (double)DBSAVE);
- break;
- case UV_DBNOSAVE:
- str_numset(str, (double)DBNOSAVE);
- break;
- case UV_DBNOERR:
- str_numset(str, (double)DBNOERR);
- break;
- case UV_DB_PASSTHRU_MORE:
- str_numset(str, (double)DB_PASSTHRU_MORE);
- break;
- case UV_DB_PASSTHRU_EOM:
- str_numset(str, (double)DB_PASSTHRU_EOM);
- break;
- case UV_DBNOPROC:
- str_numset(str, (double)DBNOPROC);
- break;
- case UV_EXCEPTION:
- str_numset(str, (double)EXCEPTION);
- break;
- case UV_EXSIGNAL:
- str_numset(str, (double)EXSIGNAL);
- break;
- case UV_EXSCREENIO:
- str_numset(str, (double)EXSCREENIO);
- break;
- case UV_EXDBLIB:
- str_numset(str, (double)EXDBLIB);
- break;
- case UV_EXFORMS:
- str_numset(str, (double)EXFORMS);
- break;
- case UV_EXCLIPBOARD:
- str_numset(str, (double)EXCLIPBOARD);
- break;
- case UV_EXLOOKUP:
- str_numset(str, (double)EXLOOKUP);
- break;
- case UV_EXINFO:
- str_numset(str, (double)EXINFO);
- break;
- case UV_EXUSER:
- str_numset(str, (double)EXUSER);
- break;
- case UV_EXNONFATAL:
- str_numset(str, (double)EXNONFATAL);
- break;
- case UV_EXCONVERSION:
- str_numset(str, (double)EXCONVERSION);
- break;
- case UV_EXSERVER:
- str_numset(str, (double)EXSERVER);
- break;
- case UV_EXTIME:
- str_numset(str, (double)EXTIME);
- break;
- case UV_EXPROGRAM:
- str_numset(str, (double)EXPROGRAM);
- break;
- case UV_EXRESOURCE:
- str_numset(str, (double)EXRESOURCE);
- break;
- case UV_EXCOMM:
- str_numset(str, (double)EXCOMM);
- break;
- case UV_EXFATAL:
- str_numset(str, (double)EXFATAL);
- break;
- case UV_EXCONSISTENCY:
- str_numset(str, (double)EXCONSISTENCY);
- break;
- #endif
- case UV_DB_IN:
- str_numset(str, (double)DB_IN);
- break;
- case UV_DB_OUT:
- str_numset(str, (double)DB_OUT);
- break;
- case UV_BCPMAXERRS:
- str_numset(str, (double)BCPMAXERRS);
- break;
- case UV_BCPFIRST:
- str_numset(str, (double)BCPFIRST);
- break;
- case UV_BCPLAST:
- str_numset(str, (double)BCPLAST);
- break;
- case UV_BCPBATCH:
- str_numset(str, (double)BCPBATCH);
- break;
- case UV_DBTRUE:
- str_numset(str, (double)TRUE);
- break;
- case UV_DBFALSE:
- str_numset(str, (double)FALSE);
- break;
- #if defined(PACKAGE_BUG)
- case UV_PACKAGE_BUG:
- str_numset(str, 1.0);
- break;
- #endif
- case UV_dbNullIsUndef:
- str_numset(str, (double)dbNullIsUndef);
- break;
- case UV_dbKeepNumeric:
- str_numset(str, (double)dbKeepNumeric);
- break;
- case UV_dbBin0x:
- str_numset(str, (double)dbBin0x);
- break;
- }
- return 0;
- }
-
- static int
- userset(ix, str)
- int ix;
- STR *str;
- {
- switch (ix)
- {
- case UV_dbNullIsUndef:
- dbNullIsUndef = str_gnum(str);
- break;
- case UV_dbKeepNumeric:
- dbKeepNumeric = str_gnum(str);
- break;
- case UV_dbBin0x:
- dbBin0x = str_gnum(str);
- break;
- default:
- #if defined(USERVAL_SET_FATAL)
- fatal("sybperl: trying to write to a read-only variable.");
- #else
- warn("sybperl: trying to write to a read-only variable.");
- #endif
- break;
- }
- return 0;
- }
-
-
- /*ARGSUSED*/
- static int err_handler(db, severity, dberr, oserr, dberrstring, oserrstr)
- DBPROCESS *db;
- int severity;
- int dberr;
- int oserr;
- char *dberrstring;
- char *oserrstr;
- {
- #ifdef HAS_CALLBACK
- /* If we have error handler subroutine, use it. */
- if (err_handler_sub)
- {
- int sp = perl_sp;
- int j;
-
- for(j = 0; j < MAX_DBPROCS; ++j)
- if(db == dbProc[j].dbproc)
- break;
- if(j == MAX_DBPROCS)
- j = 0;
-
- /* Reserve spot for return value. */
- astore (stack, ++ sp, Nullstr);
-
- /* Set up arguments. */
- astore (stack, ++ sp,
- str_2mortal (str_nmake ((double) j)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) severity)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) dberr)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) oserr)));
- if (dberrstring && *dberrstring)
- astore (stack, ++ sp, str_2mortal (str_make (dberrstring, 0)));
- else
- astore (stack, ++ sp, &str_undef);
- if (oserrstr && *oserrstr)
- astore (stack, ++ sp, str_2mortal (str_make (oserrstr, 0)));
- else
- astore (stack, ++ sp, &str_undef);
-
- /* Call it. */
- sp = callback (err_handler_sub, sp, 0, 1, 6);
-
- /* Return whatever it returned. */
- return (int) str_gnum (STACK (sp)[0]);
- }
- #endif /* HAS_CALLBACK */
- if ((db == NULL) || (DBDEAD(db)))
- return(INT_EXIT);
- else
- {
- fprintf(stderr,"DB-Library error:\n\t%s\n", dberrstring);
-
- if (oserr != DBNOERR)
- fprintf(stderr,"Operating-system error:\n\t%s\n", oserrstr);
-
- return(INT_CANCEL);
- }
- }
-
- /*ARGSUSED*/
-
- static int msg_handler(db, msgno, msgstate, severity, msgtext, srvname, procname, line)
- DBPROCESS *db;
- DBINT msgno;
- int msgstate;
- int severity;
- char *msgtext;
- char *srvname;
- char *procname;
- DBUSMALLINT line;
- {
- #ifdef HAS_CALLBACK
- /* If we have message handler subroutine, use it. */
- if (msg_handler_sub)
- {
- int sp = perl_sp;
- int j;
-
- for(j = 0; j < MAX_DBPROCS; ++j)
- if(db == dbProc[j].dbproc)
- break;
- if(j == MAX_DBPROCS)
- j = 0;
-
- /* Reserve spot for return value. */
- astore (stack, ++ sp, Nullstr);
-
- /* Set up arguments. */
- astore (stack, ++ sp,
- str_2mortal (str_nmake ((double) j)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) msgno)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) msgstate)));
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) severity)));
- if (msgtext && *msgtext)
- astore (stack, ++ sp, str_2mortal (str_make (msgtext, 0)));
- else
- astore (stack, ++ sp, &str_undef);
- if (srvname && *srvname)
- astore (stack, ++ sp, str_2mortal (str_make (srvname, 0)));
- else
- astore (stack, ++ sp, &str_undef);
- if (procname && *procname)
- astore (stack, ++ sp, str_2mortal (str_make (procname, 0)));
- else
- astore (stack, ++ sp, &str_undef);
- astore (stack, ++ sp, str_2mortal (str_nmake ((double) line)));
-
- /* Call it. */
- sp = callback (msg_handler_sub, sp, 0, 1, 8);
-
- /* Return whatever it returned. */
- return (int) str_gnum (STACK (sp)[0]);
- }
- #endif /* HAS_CALLBACK */
-
- /* Don't print any message if severity == 0 */
- if(!severity)
- return 0;
-
- fprintf (stderr,"Msg %ld, Level %d, State %d\n",
- msgno, severity, msgstate);
- if (strlen(srvname) > 0)
- fprintf (stderr,"Server '%s', ", srvname);
- if (strlen(procname) > 0)
- fprintf (stderr,"Procedure '%s', ", procname);
- if (line > 0)
- fprintf (stderr,"Line %d", line);
-
- fprintf(stderr,"\n\t%s\n", msgtext);
-
- return(0);
- }
-
- /*
- * Get the index into the dbproc[] array from a Perl STR datatype.
- * Check that the index is reasonably valid...
- */
- static int
- getDbProc(Str)
- STR *Str;
- {
- int ix;
-
- if (Str == &str_undef || !Str->str_nok) /* This may be getting a bit too */
- /* close with the internals of */
- /* the 'str' workings... */
- warn("The $dbproc parameter has not been properly initialized - it defaults to 0");
-
- ix = (int)str_gnum(Str);
-
- if(ix < 0 || ix >= MAX_DBPROCS)
- fatal("$dbproc parameter is out of range");
- if(dbProc[ix].dbproc == NULL || DBDEAD(dbProc[ix].dbproc))
- fatal("$dbproc parameter is NULL or the connection to the server has been closed");
- return ix;
- }
-
-
- #ifdef HAS_CALLBACK
-
- /* Taken from Perl 4.018 usub/usersub.c. mp. */
-
- /* Be sure to refetch the stack pointer after calling these routines. */
-
- int
- callback(subname, sp, gimme, hasargs, numargs)
- char *subname;
- int sp; /* stack pointer after args are pushed */
- int gimme; /* called in array or scalar context */
- int hasargs; /* whether to create a @_ array for routine */
- int numargs; /* how many args are pushed on the stack */
- {
- static ARG myarg[3]; /* fake syntax tree node */
- int arglast[3];
-
- arglast[2] = sp;
- sp -= numargs;
- arglast[1] = sp--;
- arglast[0] = sp;
-
- if (!myarg[0].arg_ptr.arg_str)
- myarg[0].arg_ptr.arg_str = str_make("",0);
-
- myarg[1].arg_type = A_WORD;
- myarg[1].arg_ptr.arg_stab = stabent(subname, FALSE);
-
- myarg[2].arg_type = hasargs ? A_EXPR : A_NULL;
-
- return do_subr(myarg, gimme, arglast);
- }
-
- #endif /* HAS_CALLBACK */
-
-
- #if DBLIBVS >= 461
-
- /* The following routines originate from the OpenClient R4.6.1 reference */
- /* manual, pages 2-165 to 2-168 both inclusive. It has been subsequently */
- /* modified (slightly) to suit local conditions. */
-
- #define PRECISION 4
-
- static void new_mny4tochar(dbproc, mny4ptr, buf_ptr)
- DBPROCESS *dbproc;
- DBMONEY4 *mny4ptr;
- DBCHAR *buf_ptr;
- {
- DBMONEY local_mny;
- DBCHAR value;
- char temp_buf[40];
-
- int bytes_written = 0;
- int i = 0;
- DBBOOL negative = (DBBOOL)FALSE;
- DBBOOL zero = (DBBOOL)FALSE;
-
- if (dbconvert(dbproc, SYBMONEY4, (BYTE*)mny4ptr, (DBINT)-1,
- SYBMONEY, (BYTE*)&local_mny, (DBINT)-1) == -1)
- {
- fatal("dbconvert() failed in routine new_mny4tochar()");
- }
-
- if (dbmnyinit(dbproc, &local_mny, 4 - PRECISION, &negative) == FAIL)
- {
- fatal("dbmnyinit() failed in routine new_mny4tochar()");
- }
-
- while (zero == FALSE)
- {
- if (dbmnyndigit(dbproc, &local_mny, &value, &zero) == FAIL)
- {
- fatal("dbmnyndigit() failed in routine new_mny4tochar()");
- }
-
- temp_buf[bytes_written++] = value;
-
- if (zero == FALSE)
- {
- if (bytes_written == PRECISION)
- {
- temp_buf[bytes_written++] = '.';
- }
- }
- }
-
- while (bytes_written < PRECISION)
- {
- temp_buf[bytes_written++] = '0';
- }
-
- if (bytes_written == PRECISION)
- {
- temp_buf[bytes_written++] = '.';
- temp_buf[bytes_written++] = '0';
- }
-
- if (negative == TRUE)
- {
- buf_ptr[i++] = '-';
- }
-
- while (bytes_written--)
- {
- buf_ptr[i++] = temp_buf[bytes_written];
- }
-
- buf_ptr[i] = '\0';
-
- return;
- }
-
- static void new_mnytochar(dbproc, mnyptr, buf_ptr)
- DBPROCESS *dbproc;
- DBMONEY *mnyptr;
- DBCHAR *buf_ptr;
- {
- DBMONEY local_mny;
- DBCHAR value;
- char temp_buf[40];
-
- int bytes_written = 0;
- int i = 0;
- DBBOOL negative = (DBBOOL)FALSE;
- DBBOOL zero = (DBBOOL)FALSE;
-
- if (dbmnycopy(dbproc, mnyptr, &local_mny) == FAIL)
- {
- fatal("dbmnycopy() failed in routine new_mnytochar()");
- }
-
- if (dbmnyinit(dbproc, &local_mny, 4 - PRECISION, &negative) == FAIL)
- {
- fatal("dbmnyinit() failed in routine new_mnytochar()");
- }
-
- while (zero == FALSE)
- {
- if (dbmnyndigit(dbproc, &local_mny, &value, &zero) == FAIL)
- {
- fatal("dbmnyndigit() failed in routine new_mnytochar()");
- }
-
- temp_buf[bytes_written++] = value;
-
- if (zero == FALSE)
- {
- if (bytes_written == PRECISION)
- {
- temp_buf[bytes_written++] = '.';
- }
- }
- }
-
- while (bytes_written < PRECISION)
- {
- temp_buf[bytes_written++] = '0';
- }
-
- if (bytes_written == PRECISION)
- {
- temp_buf[bytes_written++] = '.';
- temp_buf[bytes_written++] = '0';
- }
-
- if (negative == TRUE)
- {
- buf_ptr[i++] = '-';
- }
-
- while (bytes_written--)
- {
- buf_ptr[i++] = temp_buf[bytes_written];
- }
-
- buf_ptr[i] = '\0';
-
- return;
- }
-
- #endif /* DBLIBVS >= 461 */
-
-