#ifndef _SQLITE3ODBC_H #define _SQLITE3ODBC_H /** * @mainpage * @section readme README * @verbinclude README * @section changelog ChangeLog * @verbinclude ChangeLog * @section copying License Terms * @verbinclude license.terms */ /** * @file sqlite3odbc.h * Header file for SQLite3 ODBC driver. * * $Id: sqlite3odbc.h,v 1.32 2010/05/18 11:15:59 chw Exp chw $ * * Copyright (c) 2004-2010 Christian Werner * * See the file "license.terms" for information on usage * and redistribution of this file and for a * DISCLAIMER OF ALL WARRANTIES. */ #if defined(_WIN32) || defined(_WIN64) #include #include #include #else #include #include #include #include #endif #include #if defined(HAVE_LOCALECONV) || defined(_WIN32) || defined(_WIN64) #include #endif #include #include #include #include #include #include #include "sqlite3.h" #ifdef HAVE_IODBC #include #endif #if defined(HAVE_UNIXODBC) || defined(_WIN32) || defined(_WIN64) #include #endif #ifndef SQL_API #define SQL_API #endif #ifndef HAVE_SQLLEN #define SQLLEN SQLINTEGER #endif #define SQLLEN_PTR SQLLEN * #ifndef HAVE_SQLULEN #define SQLULEN SQLUINTEGER #endif #ifndef HAVE_SQLROWCOUNT #define SQLROWCOUNT SQLUINTEGER #endif #ifndef HAVE_SQLSETPOSIROW #define SQLSETPOSIROW SQLUSMALLINT #endif #ifndef HAVE_SQLROWOFFSET #define SQLROWOFFSET SQLLEN #endif #ifndef HAVE_SQLROWSETSIZE #define SQLROWSETSIZE SQLULEN #endif struct dbc; struct stmt; /** * @typedef ENV * @struct ENV * Driver internal structure for environment (HENV). */ typedef struct { int magic; /**< Magic cookie */ int ov3; /**< True for SQL_OV_ODBC3 */ #if defined(_WIN32) || defined(_WIN64) CRITICAL_SECTION cs; /**< For serializing most APIs */ DWORD owner; /**< Current owner of CS or 0 */ #endif struct dbc *dbcs; /**< Pointer to first DBC */ } ENV; /** * @typedef DBC * @struct dbc * Driver internal structure for database connection (HDBC). */ typedef struct dbc { int magic; /**< Magic cookie */ ENV *env; /**< Pointer to environment */ struct dbc *next; /**< Pointer to next DBC */ sqlite3 *sqlite; /**< SQLITE database handle */ int version; /**< SQLITE version number */ char *dbname; /**< SQLITE database name */ char *dsn; /**< ODBC data source name */ int timeout; /**< Lock timeout value */ long t0; /**< Start time for SQLITE busy handler */ int busyint; /**< Interrupt busy handler from SQLCancel() */ int *ov3; /**< True for SQL_OV_ODBC3 */ int ov3val; /**< True for SQL_OV_ODBC3 */ int autocommit; /**< Auto commit state */ int intrans; /**< True when transaction started */ struct stmt *stmt; /**< STMT list of this DBC */ int naterr; /**< Native error code */ char sqlstate[6]; /**< SQL state for SQLError() */ SQLCHAR logmsg[1024]; /**< Message for SQLError() */ int nowchar; /**< Don't try to use WCHAR */ int shortnames; /**< Always use short column names */ int longnames; /**< Don't shorten column names */ int nocreat; /**< Don't auto create database file */ int fksupport; /**< Foreign keys on or off */ int curtype; /**< Default cursor type */ int step_enable; /**< True for sqlite_compile/step/finalize */ int trans_disable; /**< True for no transaction support */ struct stmt *cur_s3stmt; /**< Current STMT executing sqlite statement */ int s3stmt_needmeta; /**< True to get meta data in s3stmt_step(). */ FILE *trace; /**< sqlite3_trace() file pointer or NULL */ #ifdef USE_DLOPEN_FOR_GPPS void *instlib; int (*gpps)(); #endif #if defined(_WIN32) || defined(_WIN64) int xcelqrx; #endif } DBC; /** * @typedef COL * @struct COL * Internal structure to describe a column in a result set. */ typedef struct { char *db; /**< Database name */ char *table; /**< Table name */ char *column; /**< Column name */ int type; /**< Data type of column */ int size; /**< Size of column */ int index; /**< Index of column in result */ int nosign; /**< Unsigned type */ int scale; /**< Scale of column */ int prec; /**< Precision of column */ int autoinc; /**< AUTO_INCREMENT column */ int notnull; /**< NOT NULL constraint on column */ char *typename; /**< Column type name or NULL */ char *label; /**< Column label or NULL */ } COL; /** * @typedef BINDCOL * @struct BINDCOL * Internal structure for bound column (SQLBindCol). */ typedef struct { SQLSMALLINT type; /**< ODBC type */ SQLINTEGER max; /**< Max. size of value buffer */ SQLLEN *lenp; /**< Value return, actual size of value buffer */ SQLPOINTER valp; /**< Value buffer */ int index; /**< Index of column in result */ int offs; /**< Byte offset for SQLGetData() */ } BINDCOL; /** * @typedef BINDPARM * @struct BINDPARM * Internal structure for bound parameter (SQLBindParameter). */ typedef struct { int type, stype; /**< ODBC and SQL types */ int coldef, scale; /**< from SQLBindParameter() */ SQLLEN max; /**< Max. size size of parameter buffer */ SQLLEN *lenp; /**< Actual size of parameter buffer */ SQLLEN *lenp0; /**< Actual size of parameter buffer, initial value */ void *param; /**< Parameter buffer */ void *param0; /**< Parameter buffer, initial value */ int inc; /**< Increment for paramset size > 1 */ int need; /**< True when SQL_LEN_DATA_AT_EXEC */ int bound; /**< True when SQLBindParameter() called */ int offs, len; /**< Offset/length for SQLParamData()/SQLPutData() */ void *parbuf; /**< Buffer for SQL_LEN_DATA_AT_EXEC etc. */ char strbuf[64]; /**< String buffer for scalar data */ int s3type; /**< SQLite3 type */ int s3size; /**< SQLite3 size */ void *s3val; /**< SQLite3 value buffer */ int s3ival; /**< SQLite3 integer value */ sqlite_int64 s3lival; /**< SQLite3 64bit integer value */ double s3dval; /**< SQLite3 float value */ } BINDPARM; /** * @typedef STMT * @struct stmt * Driver internal structure representing SQL statement (HSTMT). */ typedef struct stmt { struct stmt *next; /**< Linkage for STMT list in DBC */ HDBC dbc; /**< Pointer to DBC */ SQLCHAR cursorname[32]; /**< Cursor name */ SQLCHAR *query; /**< Current query, raw string */ int *ov3; /**< True for SQL_OV_ODBC3 */ int isselect; /**< > 0 if query is a SELECT statement */ int ncols; /**< Number of result columns */ COL *cols; /**< Result column array */ COL *dyncols; /**< Column array, but malloc()ed */ int dcols; /**< Number of entries in dyncols */ int bkmrk; /**< True when bookmarks used */ BINDCOL bkmrkcol; /**< Bookmark bound column */ BINDCOL *bindcols; /**< Array of bound columns */ int nbindcols; /**< Number of entries in bindcols */ int nbindparms; /**< Number bound parameters */ BINDPARM *bindparms; /**< Array of bound parameters */ int nparams; /**< Number of parameters in query */ int nrows; /**< Number of result rows */ int rowp; /**< Current result row */ char **rows; /**< 2-dim array, result set */ void (*rowfree)(); /**< Free function for rows */ int naterr; /**< Native error code */ char sqlstate[6]; /**< SQL state for SQLError() */ SQLCHAR logmsg[1024]; /**< Message for SQLError() */ int nowchar[2]; /**< Don't try to use WCHAR */ int longnames; /**< Don't shorten column names */ int retr_data; /**< SQL_ATTR_RETRIEVE_DATA */ SQLUINTEGER rowset_size; /**< Size of rowset */ SQLUSMALLINT *row_status; /**< Row status pointer */ SQLUSMALLINT *row_status0; /**< Internal status array */ SQLUSMALLINT row_status1; /**< Internal status array for 1 row rowsets */ SQLUINTEGER *row_count; /**< Row count pointer */ SQLUINTEGER row_count0; /**< Row count */ SQLUINTEGER paramset_size; /**< SQL_ATTR_PARAMSET_SIZE */ SQLUINTEGER paramset_count; /**< Internal for paramset */ SQLUINTEGER paramset_nrows; /**< Row count for paramset handling */ SQLUINTEGER max_rows; /**< SQL_ATTR_MAX_ROWS */ SQLUINTEGER bind_type; /**< SQL_ATTR_ROW_BIND_TYPE */ SQLUINTEGER *bind_offs; /**< SQL_ATTR_ROW_BIND_OFFSET_PTR */ /* Dummies to make ADO happy */ SQLUINTEGER *parm_bind_offs;/**< SQL_ATTR_PARAM_BIND_OFFSET_PTR */ SQLUSMALLINT *parm_oper; /**< SQL_ATTR_PARAM_OPERATION_PTR */ SQLUSMALLINT *parm_status; /**< SQL_ATTR_PARAMS_STATUS_PTR */ SQLUINTEGER *parm_proc; /**< SQL_ATTR_PARAMS_PROCESSED_PTR */ SQLUINTEGER parm_bind_type; /**< SQL_ATTR_PARAM_BIND_TYPE */ int curtype; /**< Cursor type */ sqlite3_stmt *s3stmt; /**< SQLite statement handle or NULL */ int s3stmt_noreset; /**< False when sqlite3_reset() needed. */ int s3stmt_rownum; /**< Current row number */ char *bincell; /**< Cache for blob data */ char *bincache; /**< Cache for blob data */ int binlen; /**< Length of blob data */ int guessed_types; /**< Flag for drvprepare()/drvexecute() */ } STMT; #endif