#ifndef UVODBC_H #define UVODBC_H /****************************************************************************** * * Header files for UCI (Universe Call Interface) * * Module %M% Version %I% Date %H% * * (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved * This is unpublished proprietary source code of Ardent Software Inc. * The copyright notice above does not evidence any actual or intented * publication of such source code. * ******************************************************************************* * * Maintenence log - insert most recent change descriptions at top * * Date.... GTAR# WHO Description......................................... * 04/07/99 24790 CSM Enhance UCI config file for OLEDB configuration * 03/30/99 24764 CSM recognize Ardent UCI applications * 03/25/99 24411 JBG Add SQDefBindExecp set, *pirow, field in hstmt * 03/16/99 23637 JBG Add colautoinc in column desc * 02/12/99 24502 CSM new func SQLUseCfgFile & SQLDataSources for OLEDB * 02/12/99 24501 CSM Add support for Unidata DBMStype * 11/19/98 24000 CSM Add fields to hdbc structure for UVODBC licensing * 10/22/98 23801 SAP Change company name to Ardent * 10/14/98 23801 SAP Change copyrights. * 10/02/98 23765 CSM Add dev subkey option to SetConnectOption for license * 06/08/98 22557 CSM add isaselect and isadatam flags * 09/08/97 21173 MJC Add is_local_connect and scon... flags * 07/31/97 20912 ECS fieldwidth to unsigned int for MS SQLServer * 06/17/97 20748 MJC Expand dbc for NLS * 06/03/97 20748 MJC Add CLT/LS_SQGetInfo; SETERRINFO * 04/29/97 20395 MJC Change msg now that we try ODBC if not DSN found * 11/20/96 19548 ENF Add fields for TX isolevel and default iso level * 11/18/96 19622 ENF Rename fataltx bit to nonumparams bit; * Added a 'markerbound' bit to pmark structure * 11/05/96 19512 ENF Add cell to marker holding amt space allocated * 10/30/96 19512 ENF SQLParamOptions changes * 08/08/96 18994 ENF Add flags for empty_null and tx_private * 07/26/96 18758 MJC fix printresult and bit counts * 07/25/96 18758 MJC flag for UCI_COLUMN_PRINT_RESULT * 07/22/96 18854 ENF Changes for ODBC middleware project * 06/10/96 18162 ENF Mods for procedure OUTPUT params * 06/04/96 18162 ENF Added valmax to both pmarker and bcol structs * 05/22/96 18423 GMM Added iflags.h * 05/17/96 18460 HSB Define flags for UVSQLError. * 05/15/96 18162 ENF Add ERRBLK *setdiag to HENV and HDBC structs * 05/14/96 18162 ENF Add ERRBLK *setdiag AGAIN..accidentally erased * 05/13/96 17689 ENF Mods to allow finding config file in Windows * 04/09/96 18162 ENF Add bit identifying an @HSTMT assignment * 03/29/96 18162 ENF Additions for CALL; lots of re-organization * 03/15/95 17689 ENF Port to 32 bit Windows * 12/01/95 17490 ENF Add PWD_H to define struct passwd * 08/21/95 17199 MJC add SETERRBAD for uci_bconvert * 07/11/95 16489 FRA Port to IBM RS6000 (define uchar rather than typedef) * 06/19/95 15921 ENF Add execinprog to hdc struct * 06/14/95 15921 ENF Define ODrealloc; add place for server PID * 06/13/95 15921 ENF Add version numbers to hdbc, exec in progress flag * 06/02/95 15921 ENF Change definition of MAXFETCHROWS to MAXFETCHCOLS * 05/30/95 15921 ENF Add nest, isolation levels to Fetch structures * 05/23/95 16489 FRA Back change out * 05/19/95 16489 FRA Port to IBM RS6000 * 05/09/95 16358 AGM Rename FCONTROL as it clashes with NT system name * 04/28/95 15921 ENF Remove () from around CLT_xxx EXTERNs * 04/26/95 15921 ENF Fix DESCLISTFLAGS for hp compile * 04/25/95 15921 ENF Initial submission. * * *****************************************************************************/ #ifdef SQLINK /***** If SequeLink is present ****/ #include "SequeLink.h" #endif /********************************************************************/ #ifndef UV /*************** We're linked with UniVerse ***************/ #include "uv.h" #include "iflags.h" #define SQLNKCONERR -3103 #ifndef Xfree #define Xfree(mem) {Rfree(mem); mem = (char *)0; } #endif #ifndef Ufree #define Ufree(mem) {Rfree(mem); mem = (uchar *)0; } #endif #ifndef SQLINK #define TRUE 1 #define FALSE 0 #endif #endif /********************************************************* * Include a bunch of standard definitions like SQL * datatypes and application datatypes *********************************************************/ #ifndef UV /* UniVerse compile includes real ODBC */ #define __SQL /* Make it look like we're using REAL ODBC */ #ifdef MSWIN #include #endif #endif #include "UCI.h" #ifdef UV /***************We're linked stand-alone *******************/ #ifdef _WINNT /**************** We're on NT ********************/ #include "nt.h" #define PWD_H "uid.h" #else #define PWD_H #endif #define TRUE 1 #define FALSE 0 #define SQLNKCONERR -3103 #define CTYPE_H extern char *ODmalloc(); extern int ODfree(); #ifndef PUB_RW #define PUB_RW #endif #ifndef PRI_RO #define PRI_RO static #endif #ifndef PUB_RO #define PUB_RO #endif #ifndef PRI_RW #define PRI_RW static #endif #ifndef EXTERN #define EXTERN extern #endif #define Rmalloc(size) (uchar *)ODmalloc(size,__LINE__,__MODULE__) #define Rcalloc(x,y) ((uchar*)calloc((x),(y))) #ifdef Rrealloc #undef Rrealloc #endif #define Rrealloc(x,y) ((UCHAR *)ODrealloc((x),(y))) #define Rfree(txt) if (txt) {ODfree(txt);} #define Xfree(txt) {ODfree(txt); txt = (char *)0; } #define Ufree(txt) {ODfree(txt); txt = (uchar *)0; } #define Mfopen fopen #define MMAP(a,b,c) #define Ienable() #define Idisable() #ifndef uchar #define uchar unsigned char #endif # define BITMAP unsigned int #define TRUE 1 #define FALSE 0 #endif /******************************************* * Define a structure to contain error code * and SQLSTATE information *******************************************/ typedef struct { /* Define SSTXT to contain addresses of */ char *tag; /* the ODBC err code and the internal code */ char *ODtag; } SSTXT; /******************************************* * Define data types used at the middleware ******************************************/ typedef SWORD UCIRefNum; /* Context reference numbers */ typedef char * UCIName; /* C string */ typedef char * UCIString; /* C string */ typedef char * UCIStmt; /* C string */ typedef char * UCIData; /* Unlimited byte buffer */ typedef SDWORD UCIErr; /* Status return code v2.0 */ typedef SDWORD UCISrvRtn; /* server status return code */ typedef SWORD UCIParse; /* Parser Offset */ typedef UWORD UCISize; /* data size */ typedef SWORD UCIIndicator; /* data presence/NULL val indicator */ typedef UWORD UCICount; /* number of rows affected/fetched */ typedef enum { UCIUnDef, /* Initialisation default */ UCIBinary, /* Unformatted bytes */ UCILong = 3, /* Long Integer */ UCIChar = 5, /* C string */ UCIFloat = 7, /* IEEE extended precision float */ UCIPckdDecimal = 9 /* Binary Coded Decimal */ } UCIType; typedef struct { BITMAP spares:(8*sizeof(BITMAP)-3), /*18758*/ printresult:1, /* 1 => This col is a Procedure print result *18758*/ colnullable:1, /* 1 => column is nullable */ colmultivalued:1; /* 1 => column is multi-valued */ } DESCLISTBITS; #define COLNULLABLE desclistbits.colnullable #define COLMULTIVALUED desclistbits.colmultivalued #define PRINTRESULT desclistbits.printresult /*18758*/ typedef union { DESCLISTBITS desclistbits; unsigned int desclistint; } DESCLISTFLAGS; typedef struct { DESCLISTFLAGS desclistflags; int sqltype; int precision; int scale; int displaysize; int nullable; STRING collabel; int collength; STRING colname; STRING colowner; STRING colqualifier; int colsearchable; STRING coltable; STRING coltypename; int colupdatable; STRING colformat; STRING colconv; int colautoinc; /* 23637; support NEXT.AVAILABLE */ /*** This part for SequeLink operation ***/ int dbType; /* Internal database type */ UCIType SqlnkType; /* Type to deliver over transport */ UCISize Size; /* Size of SequeLink datum */ /*** Above part for SequeLink operation ***/ } UCIDescList; /******************************************* * Define DBMS id codes for the databases * we support: *******************************************/ #define DBMS_GENERIC 0 #define DBMS_ORACLE 1 #define DBMS_INFORMIX 2 #define DBMS_INGRES 3 #define DBMS_SYBASE 4 #define DBMS_DB2 5 #define DBMS_RDB 6 #define DBMS_UNIVERSE 7 #define DBMS_ODBC 8 #define DBMS_UNIDATA 9 /************************************ * Common defines for dealing with * hstmt structures. ************************************/ #define MWSTMT hstmt->MWstmt #define MWSTMTFLAGS hstmt->MWstmt.MWStmtFlags #define HSTMTFLAGS hstmt->StmtFlags #define SETERR(addr,err) {SetErr(&addr->error,err); return(SQL_ERROR);} #define SETERRINFO(addr,err) {SetErr(&addr->error,err); return(SQL_SUCCESS_WITH_INFO);} #define SETERRBAD(addr,err) {SetErr(&addr->error,err);\ udptr->fIndicator = SQL_BAD_DATA; return(SQL_ERROR);} #define HSTMT_TRANS_ERR hstmt->ownerdbc->Dsnet->transport_err #define HSTMT_ISTOUV hstmt->ownerdbc->dbcflags.istouv #define HSTMT_ISTOUDT hstmt->ownerdbc->dbcflags.istoudt #define HSTMT_ISTOUNI hstmt->ownerdbc->dbcflags.istouni #define HSTMT_ISTOODBC hstmt->ownerdbc->dbcflags.istoodbc /* enf */ #define TRANSTYPE hdbc->MWdbc.Ttype /*** Define local and remote transport constants ***/ #define LOCAL_TRANSPORT 0 #define REMOTE_TRANSPORT 1 #define LOCAL_CALL 2 /* 24411; nested call in localsrv */ /*************************************** * Defines for error message headers ***************************************/ #define NOERRTXT "Unable to retrieve server error text" #define NOODBCTXT "Data source name not found, or ODBC is not installed on the system" #define VENDORHDR "[Ardent]" #define LBRACKET "[" #define RBRACKET "]" #define UCIHDR "[UCI Client]" #define ODBCHDR "[SQL Client]" #define SQLINKHDR "[SequeLink] error code = " #define SQLINKCONHDR "[SequeLink] Connect error, subcode: %d" #define RPCHDR "[RPC] error code = " #define RPCCONHDR "[RPC] Connect error, subcode: %d" /************************************* * Defines for UVSQLError flags *************************************/ #define GET_DIAGNOSTICS 0x01 /* Tell UVSQLError that it is being called by GetDiagnostics */ #define NO_HEADER 0x02 /* Tell UVSQLError not not include header info */ /**************************************** * Items required for operation with * SequeLink middleware ****************************************/ #ifdef SQLINK #ifdef ODBC_MAIN SSPTransLitTab CodeTable[] = { { "", (SSPTransLit)NULL } }; #else extern SSPTransLitTab CodeTable[]; #endif #endif /*** Define a structure used to keep track of each column of a row in *** a result set. ***/ typedef struct { UDWORD offset; /* Offset of this column in data buffer */ UDWORD width; /* How big is this column's data */ UDWORD valcount; /* How many values this column has */ } PERCOL; /***************************************************************** * Define new structures to handle uniVerse database *****************************************************************/ /*** For now, fix the sizes of fetch header and data buffer ***/ #define FETCH_HDR_SIZE 4800 #define FETCH_DATA_SIZE 16000 /*** Define a fetch header buffer structure ***/ typedef struct { UDWORD rowsofdata; /* Number of rows in data area */ UDWORD datasize; /* Amount of data in the buffer */ UDWORD moredata; /* 1=> there are more rows to be fetched */ UDWORD colentries; /* Number of PERCOL entries in the header */ } FETCHHDR; /*** Define a structure used in fetching data. ***/ typedef struct { STRING fhdr; /* Where fetch header gets allocated */ STRING fdata; /* Address of fetch data buffer */ } FETCHCTRL; /****************************** * Structures for middleware - * * Define a Middleware component * for each of DBC and STMT and * a middleware BITMAP for the * mwstmt structure ******************************/ struct mwdbc { UCIRefNum ConRef; /* Middleware server reference # */ UCIRefNum LogRefNum; /* Middleware login reference num */ UCIRefNum TXcursrefnum; /* Cursor used for TX control */ UCIRefNum Ttype; /* Transport type. 0 => local */ UCIParse TXparseoffset; /* Returned data source syntax error ptr */ int srvpid; /* UV: Server's PID number */ int cltuvversion; /* UV: client uniVerse version */ int srvuvversion; /* UV: server uniVerse version */ int cltuciversion; /* UV: client rev of UCI */ int cltmwversion; /* UV: Client's level of middleware support */ int srvmwversion; /* UV: Client's level of middleware support */ UDWORD txisomask; /* ODBC: Holds bits for which isolation levels are supported */ UDWORD txdefisolvl; /* ODBC: holds default isolation level of driver */ }; struct mwstmtflags { BITMAP spares:(8*sizeof(BITMAP)-10), /*18758*/ mwcursoropen:1, /* 1 => midldeware cursor open */ binddefined:1, /* 1 => SELECT columns are defined */ pmarkdefined:1, /* 1 => marker variables are defined */ sqdescribe:1, /* 1 => SQnDescribe has been done */ sqexec:1, /* 1 => SQExec has been done */ sqassoc:1, /* 1 => SQAssociate done */ reassociate:1, /* 1 => SQAssociate before SQDefine */ cancelled:1, /* 1 => Cursor has been cancelled */ execinprog:1, /* 1 => Execute in progress at uv server */ fetcheod:1; /* 1 => End of data seen */ }; /**** Define a structure to represent the per column items in the header **** block coming back from Fetch from uniVerse. ****/ typedef struct { int offset; /* Offset into data stream */ int width; /* Width of this column */ int nvalues; /* Number of values in cell */ } ColHdr; struct mwstmt { UCIRefNum CursRefNum; /* Cursor reference number */ UCIParse ParseOffset; /* Returned data source syntax error ptr */ int updcount; /* # updated rows Returned from SQExec */ int colcount; /* Returned from SQnDescribe */ int rowwidth; /* Total width of all row data + indicators */ int rowcount; /* # rows we can fetch at once */ int rowsfetched; /* # rows that came back from Fetch */ UWORD fetchisolevel; /* Iso level at which server fetched data */ UWORD fetchnestlevel; /* Nest level at which server fetched data */ FETCHCTRL fetchctrl; /* UV: control area for fetched data */ PERCOL *fhdrcolp; /* UV: pointer to per column entries */ struct mwstmtflags MWStmtFlags; /* Flags for mw STMT block */ UCIDescList (*desclist)[]; /* Pointers to Describe blocks */ }; /****************************** * Define HENV and HDBC states * for state transitions ******************************/ #define STATE0 0 #define STATE1 1 #define STATE2 2 #define STATE3 3 #define STATE4 4 /****************************** * Define a structure to map * a native error number to * an ODBC error code ******************************/ struct errmapblk { SDWORD natvcode; char *odbcerr; struct errmapblk *next; }; /****************************************************** * Define a struct to hold how to map this data source's * internal data types into our SQL types ******************************************************/ struct sqltype { int sqltype; /* The valid SQL_type */ int dbtype; /* The data source internal code */ /* The type and length of data to * request from the server. This comes from * the syntax: * SQLTYPE = SQL_type = dbtype (SSPtype,SSPlen) */ int SSPdatatype; int SSPdatalen; struct sqltype *next; }; /****************************** * Define an Error structure ******************************/ struct errblk { char *sqlstate; /* Holds ODBC state string */ SDWORD natvcode; /* Native DBMS error code */ SDWORD sqlcode; /* Code for SQLink error */ char *natvtxt; /* Native DBMS error text. Got in SQLError */ char *srvrtxt; /* Native error text..got in SQLConnect */ STRING hltext; /* High level returns malloc'ed string */ struct errblk *next; /* There may be more than one... */ }; /****************************** * Define numeric types for * data structures and linking ******************************/ #define ENV_TYPE 21 #define DBC_TYPE 32 #define STMT_TYPE 43 #define ERR_TYPE 100 #define SYNONYM_TYPE 102 #define PMARKER_TYPE 104 #define BINDCOL_TYPE 106 #define ERRMAP_TYPE 107 #define SQLCODE_TYPE 108 /****************************** * Typedefs ******************************/ typedef struct errblk ERRBLK; typedef struct sqltype SQLCODE; typedef struct errmapblk ERRMAPBLK; typedef struct env ENV; typedef ENV *UHENV; typedef struct dbc DBC; typedef DBC *UHDBC; typedef struct stmt STMT; typedef STMT *UHSTMT; typedef struct bindcol BINDCOL; typedef struct pmarker PMARKER; typedef UCIRETCODE (*CBFUNC)(); typedef struct synonym SYNONYM; /****************************************************** * Define ALLOCADDR, which is simply a linked list * of char * ******************************************************/ struct synonym { char *datumaddr; struct synonym *next; }; /****************************************************** * BITMAP of status flags for all three structure types ******************************************************/ struct statusflags { BITMAP spares:(8*sizeof(BITMAP)-3), is_local_connect:1, /* 1 => for @HENV */ nopasswd:1, /* 1 => no password is required to connect */ isuci:1; /* Environment setter is uci, not bci */ }; /****************************************************** * Define the ENVironment structure ******************************************************/ struct env { int intype; /* Must contain ENV_TYPE for validity */ int state; int refcnt; SYNONYM *Synonym; /* Synonyms for this HENV */ CBFUNC Cbfunc; struct statusflags statusflags; ERRBLK *error; ERRBLK *setdiag; /* Area to hold SET.DIAGNOSTICS blocks */ int rmid; /* Id we got when registering with TX mgr */ int dbccnt; /* Count of attached connect blocks */ DBC *dbchdr; char *ucicfgfil; /* user (OLEDB) has explicit config file */ char **cfgstart; /* Start of config file for this env */ char **cfgtext; /* Text ptr to config file for this env */ HENV odhenv; /* Oddly, a REAL ODBC HENV! */ ENV *next; }; /****************************************************** * DBC (Datbase Connection) flags bitmap ******************************************************/ struct dbcflags { BITMAP spares:((8*sizeof(BITMAP))-23), scontime:1, /* 1 => SetConn overrode locale time */ sconnumeric:1, /* 1 => SetConn overrode locale numeric */ sconmonetary:1, /* 1 => SetConn overrode locale monetary */ sconctype:1, /* 1 => SetConn overrode locale ctype */ sconcollate:1, /* 1 => SetConn overrode locale collate */ empty_null:1, /* 1 => Map emptys to NULLS */ tx_private:1, /* 1 => Don't play with UV TX manager */ ignore:1, /* 1 => Ignore SQLink errors */ autocommit:1, /* 1 => Commit every statement */ txstarted:1, /* 1 => transaction has started */ odbc_precision:1, /* 1 => Use ODBC defs of Precision */ trunc_round:1, /* 0 => round results, 1 => truncate */ send_tround:1, /* 1 => Send truncated/rounded data */ scondateprec:1, /* 1 => SetConn overrorde date precision */ scondateform:1, /* 1 => SetConn overrode date format */ istouv:1, /* 1 => connection is to uniVerse */ istoudt:1, /* 1 => connection is to uniData */ istouni:1, /* 1 => connection is to uniVerse or uniData */ istoodbc:1, /* 1 => connection is to real ODBC */ nf1client:1, /* 1 => This client in NF1 mode */ nonumparams:1, /* 1 => ODBC driver doesn't support SQLNumParams */ senddevinfo:1, /* 1 => client is UCI on NT or client is >94 UVODBC on NT to (UNIX/NT) server 0 => client is (UCI on UNIX) or (<95 UVODBC on NT) or (UVODBC on UNIX) */ execinprog:1; /* 1 => Connection has an executing hstmt */ }; /* Define some option bits for ConnectOpts function. Some of these * may find their way across the path to the server */ #define OPTS_EMPTY_NULL 1 #define OPTS_TX_PRIVATE 2 /****************************************************** * Define the network connection block for the data * source. ss_tran_err will contain a transport * sepecific status code. ******************************************************/ struct dsnet { int netcode; /* Network code type */ UCIName hostname; /* Server name or IP address */ UCIName service; /* Name of service */ SSTXT transport_err; /* Will hold code for transport error */ }; /****************************************************** * Define the DBC database connection structure ******************************************************/ struct dbc { int intype; /* Must contain DBC_TYPE for validity */ int state; int refcnt; SYNONYM *Synonym; /* Holds synonym list for this HDBC */ CBFUNC Cbfunc; struct statusflags statusflags; struct dbcflags dbcflags; char *osuid; /* Userid for OS login */ char *ospwd; /* passwd for OS login */ char *dsname; /* Data source we're connected to */ char *driver; /* Generic name of db we're connected to */ struct dsdefs *Dsdefs; /* Pointer to block with source defaults */ struct dsnet *Dsnet; /* Ptr to network area for this server */ struct mwdbc MWdbc; /* Middleware block with connect stuff */ ERRBLK *error; ERRBLK *setdiag; /* Area to hold SET.DIAGNOSTICS blocks */ ERRMAPBLK *errmap; /* Map table of native -> ODBC errors */ ENV *ownerenv; /* Owner ENV */ HDBC odhdbc; /* Oddly, A REAL ODBC HDBC */ DBC *next; /* Next DBC */ STMT *stmthdr; /* Pointer to statement blocks */ char *NLSmap; /* NLS map name */ char *NLSLCtime; /* NLS TIME locale */ char *NLSLCnumeric; /* NLS NUMERIC locale */ char *NLSLCmonetary; /* NLS MONETARY locale */ char *NLSLCctype; /* NLS CTYPE locale */ char *NLSLCcollate; /* NLS COLLATE locale */ int mrkseqnum; /* Sequence number for marker names */ int stmtcnt; /* Count of this connection's hstmts */ UWORD TXnestlevel; /* Counts BEGIN TX */ UWORD procisolevel; /* process isolation level set by SetConnOpt */ UWORD actisolevel; /* active isolation level set by SQLTransact */ char *macaddr; /* macaddr of UCI/UVODBC client */ char *devname; /* device name of UCI/UVODBC client */ char *devsubkey; /* device sub key given by user for licensing */ unsigned long ipaddr; /* IP address of UCI/UVODBC client */ int ardtuciclt; /* Ardent UCI client: UVODBC,UDODBC,OLEDB */ }; /* Define a common structure for flags for both pmarkers and bind cols * We do this so that we can have maximum commonality between the * two structures */ struct pmbcolflags { BITMAP spares:(8*sizeof(BITMAP)-11), /*18758*/ marker:1, /* 1 => This is a marker */ bindcol:1, /* 1 => This is a bound column */ userdefined:1, /* user has defined this column */ invalid:1, /* column is invalidated */ getdata:1, /* truncated data waiting */ badtype:1, /* Unsupported SQL data type */ truncated:1, /* 1 => SQLFetch saw truncated data */ bindmvcol:1, /* 1 => Column bound with BindMvCol */ bindmvparam:1, /* 1 => Parameter bound with BindMvParam */ inputparam:1, /* 1 => Input parameter */ outputparam:1; /* 1 => Output parameter */ }; /****************************************************** * BIND column structure * One of these gets allocated for each SQLBind * done on an STMT. The first part of the structure is * IDENTICAL to the pmarker structure. LEAVE IT THAT WAY ******************************************************/ struct bindcol { int icol; /* Column number. */ struct pmbcolflags Colflags; PTR pval; /* Where to store final column data */ int sqltype; /* SQL type at the source */ SWORD dtype; /* data type to fetch into */ STRING strval; /* Area for incoming data */ SDWORD longval; /* place for incoming [long] integer */ double dblval; /* place for incoming float, double */ SDWORD valmax; /* Space available in pval */ SDWORD *pvalret; /* Where to put returned data length */ UCIIndicator indicator; /* Indicator variable for NULL */ C_ARRAY **carray; /* UCI: ptr to param/column object */ STRING getdata; /* UCI: place to save where we are for GetData */ SDWORD pcbValue; /* ODBC: Where actual col leength goes */ unsigned int fieldwidth; /* How wide is raw data for this field */ int charpad; /* If this is a char field gets 1 for null byte pad */ UDWORD precision; /* Precision according to SQL type */ char *TBCaddr; /* For BASIC...pointer to TBC item */ CBFUNC Cbfunc; /* Callback address for BindCol */ UCIDescList MWdesc; /* MW descriptor for this column */ uchar *rawdata; /* Pointer to raw data from server */ char *indicatordata; /* Pointer to indicator data */ BINDCOL *next; /* Link to next Bind column */ }; /****************************************************** * PMARKER structure for a parameter marker. * Language module will fill this in and * send it to UVSQLSetParam. * The first part of the structure is IDENTICAL to the * bindcol structure. LEAVE IT THAT WAY! ******************************************************/ struct pmarker { int pnum; /* Marker number */ struct pmbcolflags pmarkflags; PTR valaddr; /* Where incoming data is */ int sqltype; /* SQL type to convert to */ SWORD dtype; /* Data type going out */ STRING strval; /* Area for outgoing string data. */ SDWORD longval; /* place for outgoing [long] integer */ double dblval; /* place for outgoing float, double */ SDWORD valmax; /* Space available in valaddr */ SDWORD *vallen; /* Where length of data is */ UCIIndicator indicator; /* indicator variable for NULL */ C_ARRAY *carray; /* UCI: ptr to parameter/column object */ STRING getdata; /* Not used for marker. Here for case of procedure ouput markers, which look like bound columns in a lot of ways. */ SDWORD pcbValue; /* ODBC: Where actual col length goes */ char *name; /* Param name if dbms uses forms ':var' */ SWORD paramtype; /* Paramter type */ UDWORD prec; /* Precision value */ SWORD scale; char *TBCaddr; /* For BASIC...pointer to TBC item */ CBFUNC Cbfunc; /* Callback address for Setparam */ UCIType sqlnktype; /* SQlink data type */ SDWORD *pcbvaluep; /* Pointer to array of pcbvalues for ParamOptions */ SDWORD allocsize; /* Holds amt space allocated for each value */ PMARKER *next; /* Link to next parmaeter */ }; /****************************************************** * STMT flags bitmap ******************************************************/ struct stmtflags { BITMAP /* Meaning if bit is SET */ spares:(8*sizeof(BITMAP)-13), paramoptions:1, /* SQLParamOptions issued 24411 */ ignore:1, /* If set, ignore SQLink errors */ badtype:1, /* A column has an illegal data type */ fetching:1, /* We're Fetching on this HSTMT */ destroy:1, /* Free hstmt and return INV_HANDLE */ prepared:1, /* Pepare was issued */ exectype:1, /* 1=>Direct, 0=>Execute */ descbok:1, /* Set when Describe is legal */ cursoropen:1, /* Cursor open..same as saying a result set was created */ isacall:1, /* 1 => HSTMT is for a CALL */ isaselect:1, /* 1 => HSTMT is for a SELECT */ isadatam:1, /* 1 => HSTMT is for a INSERT/UPDATE/DELETE */ athstmt:1; /* 1 => This is an @HSTMT..DON"T DELETE IT! */ }; /*************************** * Define the STMT structure ***************************/ struct stmt { int intype; int state; int refcnt; SYNONYM *Synonym; /* Synonyms for this HSTMT */ CBFUNC Cbfunc; /* callback function. See BindCol, SetParam */ struct statusflags statusflags; struct stmtflags StmtFlags; struct mwstmt MWstmt; /* Middleware block for STMT struct */ char *insql; /* The SQL that came in */ char *outsql; /* SQL transformed by paramater markers */ ERRBLK *error; ERRBLK *setdiag; /* Area to hold SET.DIAGNOSTICS blocks */ char *cursorname; /* Filled in if SetCursorName given */ UWORD maxuserbind; /* Max col number user bound */ UWORD bindcolcnt; /* # bound columns */ int fetchptr; /* Number of the row we'll get next */ BINDCOL *bindcols; /* List of bound columns */ UWORD paramcnt; /* Count of ? seen in sql */ UWORD resolvedinparams; /* Count of resolved input parameters */ UWORD resolvedoutparams; /* Count of resolved output parameters */ PMARKER *markers; /* List of parameter markers */ UWORD execnestlevel; /* Nest depth at which cursor was opened */ UWORD execisolevel; /* Iso level at which execute was done */ DBC *ownerdbc; /* Owning connect block */ HSTMT odhstmt; /* A REAL ODBC HSTMT for ODBC transport */ UDWORD paramrows_count; /* Count of parameter rows to do */ UDWORD paramrows_done; /* Count of parameter rows processed */ STMT *next; /* Next statement */ UDWORD *pirow; /* location to store rowcount if ParamOptions issued 24411 */ }; /****************************************************** * Define the dsdefs block, which contains defaults * for each type of DBMS ******************************************************/ struct dsdflg { BITMAP spares:(8*sizeof(BITMAP)-4), /*18758*/ markername:1, /* Set if pmarkers use name */ descb4exec:1, /* Set if Describe valid before execute */ usetgitx:1, /* Set if we need to use TGI commit/rback */ txbehavior:1; /* 0=> Manual normal, 1=>Autocommit normal */ /*18758*/ }; struct attrbits { /* Bits for ColAttributes, describing */ BITMAP /* Which (if any) attributes this vendor */ spares:(8*sizeof(BITMAP)-11), knowprecision:1, /* can supply for us. */ knownullable:1, knowscale:1, knowdspsize:1, knowunsigned:1, knowmoney:1, knowupdate:1, knowautoinc:1, knowcase:1, knowsearch:1, knowtypename:1; }; struct dsdefs { int dbid; /* Code identifying each data source */ struct dsdflg Dsflags; /* Flag bits for this data source */ struct attrbits Attrbits; /* Bits for which Attributes this ds does */ int sspportnumber; /* port to use for connection */ int maxfetchbuff; int maxfetchcols; short maxchar; /* Max size of CHAR */ short maxvarchar; /* max size of varchar */ unsigned int maxlongvarchar; short smintprec; /* precision for smallint,int,float,double */ short intprec; short floatprec; short realprec; short dblprec; unsigned int bigintprec; /* precision for big integers */ short dateprec; /* # digits in a dATE representation */ short svdateprec; /* saved (original) date precision */ short datefetch; /* amount to read from host for DATEs */ char *txstart; /* Text to begin a transaction */ char *txroll; /* Text to roll back transaction */ char *txcommit; /* Text to commit a tx */ char *dateform; /* Format of this DBMS date format */ char *svdateform; /* saved (original) date format */ char *account; /* use as schema, if Connect did not specify */ char *username; /* if OS_UID not specified, use this value */ int eodcode; /* source error code for no more data */ SQLCODE *Sqltypes; /* Ptr to list of mapped sql type codes */ }; extern UCIRETCODE UVSQLAllocConnect(), UVSQLAllocEnv(), UVSQLAllocStmt(); extern UCIRETCODE UVSQLError(); extern int SetErr(); /****************************************************** * Define various maxima for ODBC things ******************************************************/ #define MAX_CURSOR_NAME 18 /* Max cursor name length */ #define MAX_SQLINK_ROW 4050 /* Max for one SQLink row */ #define MAX_OPTION_TOKEN 128 /* Max size of a token in get_option() */ /************************************************* * EXTERN refs to commonly used routines *************************************************/ extern SDWORD UVaddsyn(), Slink(), UVdelsyn(), Ulink(), SetErrFull(), SetErrFuller(); extern UCIRETCODE UVSQLFreeStmt(); extern void flush_errors(); /************************************************* * EXTERN refs to the local server entry points *************************************************/ EXTERN UCIRETCODE LS_SQAssociate(); EXTERN UCIRETCODE LS_SQBind(); EXTERN UCIRETCODE LS_SQCancel(); EXTERN UCIRETCODE LS_SQClose(); EXTERN UCIRETCODE LS_SQCommit(); EXTERN UCIRETCODE LS_SQConnect(); EXTERN UCIRETCODE LS_SQConnectOpts(); EXTERN UCIRETCODE LS_SQDefine(); EXTERN UCIRETCODE LS_SQnDescribe(); EXTERN UCIRETCODE LS_SQDisconnect(); EXTERN UCIRETCODE LS_SQErrorMessage(); EXTERN UCIRETCODE LS_SQExec(); EXTERN UCIRETCODE LS_SQFetch(); EXTERN UCIRETCODE LS_SQGetInfo(); EXTERN UCIRETCODE LS_SQLogoff(); EXTERN UCIRETCODE LS_SQLogon(); EXTERN UCIRETCODE LS_SQOpen(); EXTERN UCIRETCODE LS_SQOutParams(); EXTERN UCIRETCODE LS_SQRollback(); EXTERN UCIRETCODE LS_SQTXBegin(); EXTERN UCIRETCODE LS_SQDefBindExec(); /************************************************* * EXTERN refs to the RPC client routines *************************************************/ EXTERN UCIRETCODE CLT_SQAssociate(); EXTERN UCIRETCODE CLT_SQBind(); EXTERN UCIRETCODE CLT_SQCancel(); EXTERN UCIRETCODE CLT_SQClose(); EXTERN UCIRETCODE CLT_SQCommit(); EXTERN UCIRETCODE CLT_SQConnect(); EXTERN UCIRETCODE CLT_SQConnectOpts(); EXTERN UCIRETCODE CLT_SQDefine(); EXTERN UCIRETCODE CLT_SQnDescribe(); EXTERN UCIRETCODE CLT_SQDisconnect(); EXTERN UCIRETCODE CLT_SQErrorMessage(); EXTERN UCIRETCODE CLT_SQExec(); EXTERN UCIRETCODE CLT_SQFetch(); EXTERN UCIRETCODE CLT_SQGetInfo(); EXTERN UCIRETCODE CLT_SQLogoff(); EXTERN UCIRETCODE CLT_SQLogon(); EXTERN UCIRETCODE CLT_SQOpen(); EXTERN UCIRETCODE CLT_SQOutParams(); EXTERN UCIRETCODE CLT_SQRollback(); EXTERN UCIRETCODE CLT_SQTXBegin(); EXTERN UCIRETCODE CLT_SQDefBindExec(); #ifdef ODBC_MAIN #define gentxt(sqlstate,tag,ODtxt) SSTXT tag = {sqlstate, ODtxt}; /************************************************* * Define pointer to the local server routines. * They will be initilaized for access to the * local server. For the stand-alone UCI, the * pointer will remain 0. *************************************************/ UCIRETCODE (*LS_SQAssociatep)(); UCIRETCODE (*LS_SQBindp)(); UCIRETCODE (*LS_SQCancelp)(); UCIRETCODE (*LS_SQClosep)(); UCIRETCODE (*LS_SQCommitp)(); UCIRETCODE (*LS_SQConnectp)(); UCIRETCODE (*LS_SQConnectOptsp)(); UCIRETCODE (*LS_SQDefinep)(); UCIRETCODE (*LS_SQnDescribep)(); UCIRETCODE (*LS_SQDisconnectp)(); UCIRETCODE (*LS_SQErrorMessagep)(); UCIRETCODE (*LS_SQExecp)(); UCIRETCODE (*LS_SQFetchp)(); UCIRETCODE (*LS_SQGetInfop)(); UCIRETCODE (*LS_SQLogoffp)(); UCIRETCODE (*LS_SQLogonp)(); UCIRETCODE (*LS_SQOutParamsp)(); UCIRETCODE (*LS_SQOpenp)(); UCIRETCODE (*LS_SQRollbackp)(); UCIRETCODE (*LS_SQTXBeginp)(); UCIRETCODE (*LS_SQDefBindExecp)(); /**************************** * Configuration file stuff ***************************/ PUB_RO char _uvhome[] = "/.uvhome"; PUB_RO char _etc[] = "/etc/"; PUB_RO char _dot[] = "./"; PUB_RO char _odbc[] = "uv.odbc.config"; PUB_RO char _ucicfg[] = "uvodbc.config"; #else #define gentxt(sqlstate,tag,ODtxt) extern SSTXT tag; EXTERN UCIRETCODE (*LS_SQAssociatep)(); EXTERN UCIRETCODE (*LS_SQBindp)(); EXTERN UCIRETCODE (*LS_SQCancelp)(); EXTERN UCIRETCODE (*LS_SQClosep)(); EXTERN UCIRETCODE (*LS_SQCommitp)(); EXTERN UCIRETCODE (*LS_SQConnectp)(); EXTERN UCIRETCODE (*LS_SQConnectOptsp)(); EXTERN UCIRETCODE (*LS_SQDefinep)(); EXTERN UCIRETCODE (*LS_SQnDescribep)(); EXTERN UCIRETCODE (*LS_SQDisconnectp)(); EXTERN UCIRETCODE (*LS_SQErrorMessagep)(); EXTERN UCIRETCODE (*LS_SQExecp)(); EXTERN UCIRETCODE (*LS_SQFetchp)(); EXTERN UCIRETCODE (*LS_SQGetInfop)(); EXTERN UCIRETCODE (*LS_SQLogoffp)(); EXTERN UCIRETCODE (*LS_SQLogonp)(); EXTERN UCIRETCODE (*LS_SQOutParamsp)(); EXTERN UCIRETCODE (*LS_SQOpenp)(); EXTERN UCIRETCODE (*LS_SQRollbackp)(); EXTERN UCIRETCODE (*LS_SQTXBeginp)(); EXTERN UCIRETCODE (*LS_SQDefBindExecp)(); EXTERN char _uvhome[]; EXTERN char _etc[]; EXTERN char _dot[]; EXTERN char _odbc[]; EXTERN char _ucicfg[]; #endif #include "GENTXT.h" /* Include file gernerated from UVOD_SSERR.h */ #endif /* UVODBC_H */