#define SYNTAX_ERROR 999
#define CROAK(xxxx) \
PUSHMARK(sp); \
XPUSHs(sv_2mortal(newSVnv((
double
)SYNTAX_ERROR))); \
XPUSHs(sv_2mortal(newSVpv(xxxx,
strlen
(xxxx)))); \
PUTBACK; \
return
; \
\
\
#define DEBUG_DUMP(xxx); \
#define TMPBUFSZ 512
#define SUCCESSRETURNED(x) (x == ERROR_SUCCESS)
#define REGRETURN(x) XSRETURN_IV(SUCCESSRETURNED(x))
#define MAX_DATA_BUF_SIZE 0x7FFFFFFE // Largest value for a SDWORD ( -1 for a string terminating null)
#define MAX_DATA_ASSUME_SIZE 0x20000000 // Largest size a field can specify before we assume that it is not accurate
#define DEFAULT_DATA_BUF_SIZE 10240
#define DEFAULTCOLSIZE 20 // Start with DEFAULTCOLSIZE number of chars per column.
#define COMMAND_LENGTH 1024
#define DSN_LENGTH 1024
#define DS_DESCRIPTION_LENGTH 2048
#define ODBC_BUFF_SIZE 1024
#define SQL_STATE_SIZE 10
#define QUERY_TIMEOUT_VALUE 120
#define LOGIN_TIMEOUT_VALUE 20
#define TABLE_COMMAND_STRING "%s(\"%s\", \"%s\", \"%s\", \"%s\")"
#define DEFAULT_DEBUG_FILE "c:\\temp\\perlodbc.out"
#define DEFAULT_STMT_CLOSE_TYPE SQL_DROP
#define THREAD_MOM ( (CMom *) ::cMom->operator[](GetCurrentThreadId()))
#define ODBCLIST ( (ODBC_TYPE *) (THREAD_MOM)->operator[]((DWORD)0))
class
CResults;
struct
ODBC_hdbc{
HDBC hdbc;
int
iConnected;
int
iCount;
}
typedef
ODBC_HDBC;
struct
ODBCError{
char
szError[ODBC_BUFF_SIZE];
UCHAR
szSqlState[SQL_STATE_SIZE];
char
szFunction[50];
char
szFunctionLevel[10];
long
ErrNum;
int
EOR;
}
typedef
ODBC_ERROR;
struct
ODBC_Conn{
int
conn;
HENV henv;
HSTMT hstmt;
ODBC_HDBC *hdbc;
CResults *Results;
ODBCError *Error;
UWORD uStmtCloseType;
long
iMaxBufSize;
int
numcols;
DWORD
dNumOfRows;
int
iDebug;
HANDLE
hDebug;
char
szUserDSN[DSN_LENGTH];
char
*szDSN;
char
*szCommand;
}
typedef
ODBC_TYPE;
#ifdef __WIN32_ODBC__
#define ReturnError(xx) \
{ \
char
*szError =
"No connections exist"
; \
if
(h){ \
szError = h->Error->szError; \
} \
XPUSHs(sv_2mortal(newSVnv((
double
)1))); \
XPUSHs(sv_2mortal(newSVnv((
double
)((h)? h->Error->ErrNum:0)))); \
XPUSHs(sv_2mortal(newSVpv((
char
*)szError,
strlen
((
char
*)szError)))); \
}
ODBC_TYPE *ODBCList = 0;
int
ODBC_Conn_Number = 0;
int
ODBCTotal = 1;
HENV ghEnv = 0;
char
ODBC_errorstring[ODBC_BUFF_SIZE];
int
ODBC_errornum;
HINSTANCE
ghDLL = 0;
HANDLE
ghDebug = 0;
HANDLE
ghFile = 0;
char
*gszFile = 0;
int
giDebug = 0;
int
giDebugGlobal = 0;
int
giThread = 0;
CRITICAL_SECTION gDCS;
CRITICAL_SECTION gCS;
#else
extern
ODBC_TYPE *ODBCList;
extern
int
ODBC_Conn_Number;
extern
int
ODBCTotal;
extern
HENV ghEnv;
extern
char
ODBC_errorstring[ODBC_BUFF_SIZE];
extern
int
ODBC_errornum;
extern
HINSTANCE
ghDLL;
extern
HANDLE
ghDebug;
extern
HANDLE
ghFile;
extern
char
*gszFile;
extern
int
giDebug;
extern
int
giDebugGlobal;
extern
int
giThread;
extern
CRITICAL_SECTION gDCS;
extern
CRITICAL_SECTION gCS;
#endif
ODBC_TYPE *NewODBC();
ODBC_TYPE *CleanODBC(ODBC_TYPE *h);
ODBC_TYPE * _NT_ODBC_Verify(
int
iODBC);
ODBC_TYPE *ODBCError(
char
*szString, ODBC_TYPE *h,
char
*szFunction,
char
*szFunctionLevel);
int
DeleteConn(
int
iODBC);
void
_NT_ODBC_Error(ODBC_Conn * h,
char
*szFunction,
char
*szFunctionLevel);
int
FreeODBC(ODBC_TYPE *h);
RETCODE ResetStmt(ODBC_TYPE *h);
char
*MapCloseType(UWORD uCloseType);
void
CleanError(ODBC_ERROR *h);
int
ColNameToNum(ODBC_TYPE *h,
char
*szName);
#ifdef __BORLANDC__
BOOL
WINAPI DllEntryPoint(
HINSTANCE
hinstDLL,
DWORD
fdwReason,
LPVOID
lpvReserved);
#else
BOOL
WINAPI DllMain(
HINSTANCE
hinstDLL,
DWORD
fdwReason,
LPVOID
lpvReserved);
#endif
void
AddDebug(ODBC_TYPE *h);
void
RemoveDebug(ODBC_TYPE *h);
RETCODE TableColList(
int
iType);
void
TerminateThread();
int
InitExtension();
#ifdef new
#undef new
#endif
#define new ::new
#if _DEBUG
void
DebugDumpError(ODBC_TYPE *h);
void
DebugConnection(
char
*szString, ODBC_TYPE *h);
void
DebugDump(
char
*szString);
void
DebugPrint(
char
*szString);
#endif