/*
* $Id: dbdimp.h 10166 2007-11-06 14:04:25Z mjevans $
* Copyright (c) 1997-2001 Jeff Urlwin
* portions Copyright (c) 1997 Thomas K. Wenrich
* portions Copyright (c) 1994,1995,1996 Tim Bunce
* portions Copyright (c) 1997-2001 Jeff Urlwin
* portions Copyright (c) 2001 Dean Arnold
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the Perl README file.
*
*/
typedef struct imp_fbh_st imp_fbh_t;
/* This holds global data of the driver itself.
*/
struct imp_drh_st {
dbih_drc_t com; /* MUST be first element in structure */
SQLHENV henv;
int connects; /* connect count */
};
/* Define dbh implementor data structure
This holds everything to describe the database connection.
*/
struct imp_dbh_st {
dbih_dbc_t com; /* MUST be first element in structure */
SQLHENV henv; /* copy from imp_drh for speed */
SQLHDBC hdbc;
char odbc_ver[20]; /* ODBC compat. version for driver */
SQLSMALLINT max_column_name_len;
char odbc_dbname[64];
int odbc_ignore_named_placeholders; /* flag to ignore named parameters */
SQLSMALLINT odbc_default_bind_type; /* flag to set default binding type (experimental) */
int odbc_sqldescribeparam_supported; /* flag to see if SQLDescribeParam is supported */
int odbc_sqlmoreresults_supported; /* flag to see if SQLMoreResults is supported */
int odbc_defer_binding; /* flag to work around SQLServer bug and defer binding until */
/* last possible moment */
int odbc_force_rebind; /* force rebinding the output columns after each execute to */
/* resolve some issues where certain stored procs can return */
/* multiple result sets */
SQLINTEGER odbc_query_timeout;
int odbc_has_unicode;
int odbc_async_exec; /* flag to set asynchronous execution */
int odbc_exec_direct; /* flag for executing SQLExecDirect instead of SQLPrepare and SQLExecute. Magic happens at SQLExecute() */
SQLUINTEGER odbc_async_type; /* flag to store the type of asynchronous
* execution the driver supports */
SV *odbc_err_handler; /* contains the error handler coderef */
int RowCacheSize; /* default row cache size in rows for statements */
};
/* Define sth implementor data structure */
struct imp_sth_st {
dbih_stc_t com; /* MUST be first element in structure */
HENV henv; /* copy for speed */
HDBC hdbc; /* copy for speed */
SQLHSTMT hstmt;
int moreResults; /* are there more results to fetch? */
int done_desc; /* have we described this sth yet ? */
/* Input Details */
char *statement; /* sql (see sth_scan) */
HV *all_params_hv; /* all params, keyed by name */
AV *out_params_av; /* quick access to inout params */
int has_inout_params;
UCHAR *ColNames; /* holds all column names; is referenced
* by ptrs from within the fbh structures
*/
UCHAR *RowBuffer; /* holds row data; referenced from fbh */
imp_fbh_t *fbh; /* array of imp_fbh_t structs */
SQLLEN RowCount; /* Rows affected by insert, update, delete
* (unreliable for SELECT)
*/
int eod; /* End of data seen */
SV *param_sts; /* ref to param status array for array bound PHs */
int params_procd; /* to recv number of parms processed by an SQLExecute() */
UWORD *param_status; /* row indicators for array binding */
SV *row_sts; /* ref to row status array for array bound columns */
UDWORD rows_fetched; /* actual number of rows fetched for array binding */
UDWORD max_rows; /* max number of rows per fetch for array binding */
UWORD *row_status; /* row indicators for array binding */
int odbc_ignore_named_placeholders; /* flag to ignore named parameters */
SQLSMALLINT odbc_default_bind_type; /* flag to set default binding type (experimental) */
int odbc_exec_direct; /* flag for executing SQLExecDirect instead of SQLPrepare and SQLExecute. Magic happens at SQLExecute() */
int odbc_force_rebind; /* force rebinding the output columns after each execute to */
/* resolve some issues where certain stored procs can return */
/* multiple result sets */
SQLINTEGER odbc_query_timeout;
};
#define IMP_STH_EXECUTING 0x0001
struct imp_fbh_st { /* field buffer EXPERIMENTAL */
char szDummyBuffer[1024];
imp_sth_t *imp_sth; /* 'parent' statement */
/* field description - SQLDescribeCol() */
UCHAR *ColName; /* zero-terminated column name */
SQLSMALLINT ColNameLen;
SQLULEN ColDef; /* precision */
SQLSMALLINT ColScale;
SQLSMALLINT ColSqlType;
SQLSMALLINT ColNullable;
SQLLEN ColLength; /* SqlColAttributes(SQL_COLUMN_LENGTH) */
SQLLEN ColDisplaySize; /* SqlColAttributes(SQL_COLUMN_DISPLAY_SIZE) */
/* Our storage space for the field data as it's fetched */
SWORD ftype; /* external datatype we wish to get.
* Used as parameter to SQLBindCol().
*/
UCHAR *data; /* points into sth->RowBuffer */
SQLLEN datalen; /* length returned from fetch for single row. */
UDWORD maxcnt; /* max num of rows to return per fetch */
SV *colary; /* ref to array to recv output data */
SDWORD *col_indics; /* individual column length/NULL indicators for array binding */
int is_array; /* TRUE => bound to array */
};
typedef struct phs_st phs_t; /* scalar placeholder */
struct phs_st { /* scalar placeholder EXPERIMENTAL */
SQLUSMALLINT idx; /* index number of this param 1, 2, ... */
SV *sv; /* the scalar holding the value */
int sv_type; /* original sv type at time of bind */
int biggestparam; /* if sv_type is VARCHAR, size of biggest so far */
int scale; /* MJE NEVER USED */
bool is_inout;
IV maxlen; /* max possible len (=allocated buffer) */
char *sv_buf; /* pointer to sv's data buffer */
int alen_incnull; /* MJE NEVER USED */
SWORD ftype; /* external field type */
SWORD sql_type; /* the sql type the placeholder should have in SQL */
SWORD tgt_sql_type; /* the PH SQL type the stmt expects */
SDWORD tgt_len; /* size or precision the stmt expects */
SQLLEN cbValue; /* length of returned value OR SQL_NULL_DATA */
SDWORD *indics; /* ptr to indicator array for param arrays */
int is_array; /* TRUE => parameter array */
char name[1]; /* struct is malloc'd bigger as needed */
};
/* These defines avoid name clashes for multiple statically linked DBD's */
#define dbd_init odbc_init
#define dbd_db_login odbc_db_login
#define dbd_db_login6 odbc_db_login6
/*
* Not defined by DBI
* #define dbd_db_do odbc_db_do
*/
#define dbd_db_commit odbc_db_commit
#define dbd_db_rollback odbc_db_rollback
#define dbd_db_disconnect odbc_db_disconnect
#define dbd_db_destroy odbc_db_destroy
#define dbd_db_STORE_attrib odbc_db_STORE_attrib
#define dbd_db_FETCH_attrib odbc_db_FETCH_attrib
#define dbd_st_prepare odbc_st_prepare
#define dbd_st_rows odbc_st_rows
#define dbd_st_execute odbc_st_execute
#define dbd_st_fetch odbc_st_fetch
#define dbd_st_finish odbc_st_finish
#define dbd_st_destroy odbc_st_destroy
#define dbd_st_blob_read odbc_st_blob_read
#define dbd_st_STORE_attrib odbc_st_STORE_attrib
#define dbd_st_FETCH_attrib odbc_st_FETCH_attrib
#define dbd_describe odbc_describe
#define dbd_bind_ph odbc_bind_ph
#define dbd_error odbc_error
#define dbd_discon_all odbc_discon_all
#define dbd_st_tables odbc_st_tables
#define dbd_st_primary_keys odbc_st_primary_keys
#define dbd_db_execdirect odbc_db_execdirect
/* end */