home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
sqlcla.zip
/
SQL.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-14
|
8KB
|
285 lines
/* (C) Copyright Stephen B. Behman, 1993 -- All rights reserved. */
// $Header: d:/sh/RCS/sql.cpp 2.0 93/07/14 09:45:25 Steve Exp $
extern "C" {
short _Far16 _Pascal sqlestar_api (void);
short _Far16 _Pascal sqlestrd_api (char *, /* database */
char *, /* spare, password */
unsigned char, /* use */
struct SQLCA *); /* SQLCA */
short _Far16 _Pascal sqlacall(unsigned short,
unsigned short,
unsigned short,
unsigned short,
void *);
short _Far16 _Pascal sqlastop(void *);
short _Far16 _Pascal sqlastrt(void *,
void *,
struct SQLCA *);
short _Far16 _Pascal sqlausda(unsigned short,
struct Sqlda *,
void *);
}
#define SQLCODE sqlca->sqlcode
#define SQLWARN0 sqlca->sqlwarn[0]
#define SQLWARN1 sqlca->sqlwarn[1]
#define SQLWARN2 sqlca->sqlwarn[2]
#define SQLWARN3 sqlca->sqlwarn[3]
#define SQLWARN4 sqlca->sqlwarn[4]
#define SQLWARN5 sqlca->sqlwarn[5]
#define SQLWARN6 sqlca->sqlwarn[6]
#define SQLWARN7 sqlca->sqlwarn[7]
#define SQLWARN8 sqlca->sqlwarn[8]
#define SQLWARN9 sqlca->sqlwarn[9]
#define SQLWARNA sqlca->sqlwarn[10]
#pragma pack(1)
struct SQLCA
{
unsigned char sqlcaid[8]; /* Eyecatcher = 'SQLCA ' */
long sqlcabc; /* SQLCA size in bytes = 136 */
long sqlcode; /* SQL return code */
short sqlerrml; /* Length for SQLERRMC */
unsigned char sqlerrmc[70]; /* Error message tokens */
unsigned char sqlerrp[8]; /* Diagnostic information */
long sqlerrd[6]; /* Diagnostic information */
unsigned char sqlwarn[11]; /* Warning flags */
unsigned char sqlstate[5]; /* State corresponding to SQLCODE */
};
#pragma pack()
static SQLCA sqlca;
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
class DATABASE
{
static int started;
public:
DATABASE( char * dbname, unsigned char dbuse, SQLCA* sqlca );
int isstarted();
long COMMIT( SQLCA* sqlca, char* pid );
long ROLLBACK( SQLCA* sqlca, char* pid );
};
int DATABASE::started;
DATABASE::DATABASE( char * dbname, unsigned char use, SQLCA* sqlca )
{
if( !started )
{
SQLCA inisqlca;
sqlestar_api();
use &= 0xdf;
if( use != 'X' && use != 'S' ) return;
sqlestrd_api( dbname,"",'S', &inisqlca );
started=( inisqlca.sqlcode ) ? 0 : 1;
}
}
long DATABASE::COMMIT( SQLCA* sqlca , char* pid )
{
sqlastrt( pid,0L,sqlca);
sqlacall((unsigned short)21,0,0,0,0L);
sqlastop(0L);
return SQLCODE;
}
long DATABASE::ROLLBACK( SQLCA* sqlca, char* pid )
{
sqlastrt( pid,0L,sqlca);
sqlacall((unsigned short)28,0,0,0,0L);
sqlastop(0L);
return SQLCODE;
}
#pragma pack( 1 )
struct SQLVAR
{
short sqltype; /* Variable data type */
short sqllen; /* Variable data length */
void * _Seg16 sqldata; /* Pointer to variable data value */
short * _Seg16 sqlind; /* Pointer to Null indicator */
struct sqlname /* Variable Name */
{
short length; /* Name length [1..30] */
unsigned char data[30]; /* Variable or Column name */
} sqlname;
};
struct Sqlda
{
char sqldaid[8]; /* Eye catcher = 'SQLDA ' */
long sqldabc; /* SQLDA size in bytes = 16+44*SQLN */
short sqln; /* Number of SQLVAR elements */
short sqld; /* # of used SQLVAR elements */
SQLVAR sqlvar[1];
};
#pragma pack( )
class SQLDA
{
static short nosqldas; // counter used to name sqlda's
short sqlid; // number for this sqlda
Sqlda *ada; // actual sqlda
public:
SQLDA( char *t,short noargs )
{
if( ! noargs )
{
ada=(Sqlda *)0;
sqlid=0;
}
else
{
ada=(Sqlda*) new char[ sizeof(Sqlda) + (noargs-1)*sizeof(SQLVAR) ];
sqlid=(ada==0) ? ( short )0 : nosqldas++;
SQLCA ca;
strncpy( ada->sqldaid, "SQLDA ", 8 );
ada->sqldabc=sizeof( Sqlda )+(noargs-1)*sizeof( SQLVAR );
ada->sqln=ada->sqld=noargs;
sqlastrt( t, 0, &ca );
sqlausda( sqlid, ada, ( void* )0 ); // register sqlda
sqlastop( 0 );
}
}
~SQLDA(){ delete [] ada;}
void setv( int i, short tp, short ln, void *da, short *ind )
{
SQLVAR *v=( SQLVAR* )&ada->sqlvar;
v[i].sqltype=tp;
v[i].sqllen=ln;
v[i].sqldata=da;
v[i].sqlind=ind;
}
inline short id(){ return sqlid; }
SQLVAR* var( ){return ( SQLVAR* )&ada->sqlvar;}
};
short SQLDA::nosqldas=1;
class CURSOR
{
SQLDA outda;
SQLDA inda;
SQLCA *ca;
unsigned char *top;
short stmntno;
public:
CURSOR( SQLCA* c,unsigned char * t,short sno, short nooargs,
short noinargs, ...);
long close();
long fetch();
long open();
SQLVAR* invars( );
SQLVAR* outvars( );
};
SQLVAR* CURSOR::invars( ){ return inda.var(); }
SQLVAR* CURSOR::outvars( ){ return outda.var();}
CURSOR::CURSOR( SQLCA* c,unsigned char * t,short sno, short nooargs,
short noinargs, ...):
ca(c), top(t), stmntno( sno ),
outda( (char *) t, nooargs ), inda( (char *) t, noinargs )
{
int i;
va_list list;
va_start( list, noinargs );
SQLVAR* v=( nooargs ) ? outda.var() : 0;
for( i=0; i<nooargs; i++, v++ )
{
v->sqltype=va_arg( list, short );
v->sqllen=va_arg( list, short );
v->sqldata=va_arg( list, void * );
v->sqlind=( short * )va_arg( list, void * );
}
v=( noinargs ) ? inda.var() : 0;
for( i=0; i<noinargs; i++ , v++)
{
v->sqltype=va_arg( list, short );
v->sqllen=va_arg( list, short );
v->sqldata=va_arg( list, void * );
v->sqlind=( short * )va_arg( list, void * );
}
va_end( list );
}
long CURSOR::close()
{
sqlastrt(top,0L,ca);
sqlacall(20, stmntno, 0, 0, 0 );
sqlastop(0L);
return ca->sqlcode;
}
long CURSOR::fetch()
{
sqlastrt(top,0L,ca);
sqlacall(25, stmntno, 0, inda.id(), 0 );
sqlastop(0L);
return ca->sqlcode;
}
long CURSOR::open()
{
sqlastrt(top,0L,ca);
sqlacall(26, stmntno, outda.id(), 0, 0 );
sqlastop(0L);
return ca->sqlcode;
}
class QUERY
{
SQLDA outda;
SQLDA inda;
SQLCA *ca;
unsigned char *top;
short stmntno;
unsigned short action;
public:
QUERY::QUERY( SQLCA* c, unsigned char * t, short sno, unsigned short act,
short nooargs, short noinargs,... );
long exec();
SQLVAR * invars(){return inda.var();}
SQLVAR * outvars(){return outda.var();}
};
QUERY::QUERY( SQLCA* c, unsigned char * t, short sno, unsigned short act,
short nooargs, short noinargs,... ):
ca(c), top(t), stmntno( sno ), action( act ),
outda( (char *) t, nooargs ), inda( (char *) t, noinargs )
{
int i;
va_list list;
va_start( list, noinargs );
SQLVAR* v=( nooargs ) ? outda.var() : 0;
for( i=0; i<nooargs; i++, v++ )
{
v->sqltype=va_arg( list, short );
v->sqllen=va_arg( list, short );
v->sqldata=va_arg( list, void * );
v->sqlind=( short * )va_arg( list, void * );
}
v=( noinargs ) ? inda.var() : 0;
for( i=0; i<noinargs; i++ , v++)
{
v->sqltype=va_arg( list, short );
v->sqllen=va_arg( list, short );
v->sqldata=va_arg( list, void * );
v->sqlind=( short * )va_arg( list, void * );
}
va_end( list );
}
long QUERY::exec()
{
sqlastrt(top, 0L, ca);
sqlacall(action, stmntno, outda.id(), inda.id(), 0 );
sqlastop(0L);
return ca->sqlcode;
}