29#include "apu_config.h"
45#elif defined(HAVE_ODBC_SQL_H)
47#include <odbc/sqlext.h>
54#if defined(_MSC_VER) && _MSC_VER < 1400
55#if APR_SIZEOF_VOIDP == 8
56#define ODBC_INTPTR_T apr_int64_t
58#define ODBC_INTPTR_T apr_int32_t
61#define ODBC_INTPTR_T intptr_t
69#ifndef ODBC_DRIVER_NAME
70#define ODBC_DRIVER_NAME odbc
72#define STRINGIFY(x) #x
73#define NAMIFY2(n) apr_dbd_##n##_driver
74#define NAMIFY1(n) NAMIFY2(n)
75#define ODBC_DRIVER_STRING STRINGIFY(ODBC_DRIVER_NAME)
76#define ODBC_DRIVER_ENTRY NAMIFY1(ODBC_DRIVER_NAME)
79#define DRIVER_APU_VERSION_MAJOR APU_MAJOR_VERSION
80#define DRIVER_APU_VERSION_MINOR APU_MINOR_VERSION
89#define CHECK_ERROR(a,s,r,t,h) check_error(a,s,r,t,h, __LINE__)
91#define SOURCE_FILE __FILE__
92#define MAX_ERROR_STRING 1024
93#define MAX_COLUMN_NAME 256
94#define DEFAULT_BUFFER_SIZE 1024
97#define DEFAULTSEPS " \t\r\n,="
98#define CSINGLEQUOTE '\''
99#define SSINGLEQUOTE "\'"
107#define IS_LOB(t) (t == SQL_LONGVARCHAR \
108 || t == SQL_LONGVARBINARY || t == SQL_VARBINARY \
109 || t == -98 || t == -99)
115 (t == SQL_LONGVARCHAR || t == -98)
118#define APR_FROM_SQL_RESULT(rc) \
119 (SQL_SUCCEEDED(rc) ? APR_SUCCESS : APR_EGENERAL)
201 "ODBC_LOB", 5, APR_BUCKET_DATA,
249#define NUM_APR_DBD_TYPES (sizeof(sqlCtype) / sizeof(sqlCtype[0]))
282 sizeof(
unsigned char),
284 sizeof(
unsigned short),
286 sizeof(
unsigned int),
288 sizeof(
unsigned long),
315 if (
dbr &&
dbr->apr_dbd &&
dbr->apr_dbd->dbc) {
494 (*res)->stmt =
hstmt;
495 (*res)->dbc =
handle->dbc;
501 (*res)->ncols =
ncols;
512 (*res)->ncols =
ncols;
574 *(
unsigned char *)ptr =
657 int bufsize =
bd->row->res->apr_dbd->defaultBufferSize;
661 type =
bd->row->res->coltypes[
bd->col];
764 int state =
row->res->colstate[
col];
789 for (
i = 0;
i <
col;
i++) {
806 if (!
row->res->colptrs[
col])
824 return row->res->colptrs[
col];
940 char successMsg[] =
"[dbd_odbc] SQL_SUCCESS ";
951 res =
"SQL_INVALID_HANDLE";
957 res =
"SQL_SUCCESS_WITH_INFO";
960 res =
"SQL_STILL_EXECUTING";
963 res =
"SQL_NEED_DATA";
969 res =
"unrecognized SQL return code";
977 end =
p +
sizeof(
dbc->lastError);
978 dbc->lasterrorcode =
rc;
979 p +=
sprintf(
p,
"[dbd_odbc] %.64s returned %.30s (%d) at %.24s:%d ",
981 for (
i = 1,
rc = 0;
rc == 0;
i++) {
1004 sizeof handle->lastError);
1028 "Attempt to load APU version %d.%d driver with APU version %d.%d\n",
1037 step =
"SQLAllocHandle (SQL_HANDLE_ENV)";
1041 step =
"SQLSetEnvAttr";
1083 err_step =
"SQLAllocHandle (SQL_HANDLE_DBC)";
1088 err_step =
"Invalid DBD Parameters - open";
1097 err_step =
"SQLSetConnectAttr (from DBD Parameters)";
1132 handle->default_transaction_mode = 0;
1136 handle->transaction_mode =
handle->default_transaction_mode;
1191 if (
handle->transaction_mode) {
1206 (*trans)->dbc =
handle->dbc;
1207 (*trans)->apr_dbd =
handle;
1333 (*row)->stmt =
res->stmt;
1334 (*row)->dbc =
res->dbc;
1336 (*row)->pool =
res->pool;
1339 for (
c = 0;
c <
res->ncols;
c++) {
1344 if (
res->colptrs[
c])
1345 *(
char *)
res->colptrs[
c] = 0;
1357 (*row)->stmt =
res->stmt;
1376 if (
col >=
row->res->ncols)
1392 if (
p == (
void *)-1)
1399 *(
char**)
data = (
char *)
p;
1412 if (
col >=
row->res->ncols)
1418 if (
p ==
NULL ||
p == (
void *)-1)
1427 return (
handle) ?
handle->lastError :
"[dbd_odbc]No error message available";
1448 if ((*
dst++ = *
src) ==
'\'')
1468 (*statement)->dbc =
handle->dbc;
1469 (*statement)->apr_dbd =
handle;
1470 (*statement)->nargs =
nargs;
1471 (*statement)->nvals =
nvals;
1472 (*statement)->types =
1481 (*statement)->stmt);
1590 return res->colnames[
col];
1597 return res->colnames[
col];
1603 return (
int)
trans->apr_dbd->can_commit;
const char apr_size_t len
APR-UTIL Buckets/Bucket Brigades.
#define SQLSetConnectAttr(hdbc, fOption, ValuePtr, BufferLength)
#define SQLGetDiagRec(type, h, i, state, native, buffer, bufsize, reslen)
#define SQL_ATTR_CONNECTION_TIMEOUT
#define SQL_ATTR_TXN_ISOLATION
#define SQLFreeHandle(type, hndl)
#define SQLCloseCursor(stmt)
#define SQLAllocHandle(type, parent, hndl)
#define SQLFetchScroll(stmt, orient, rownum)
#define SQL_ATTR_CURSOR_SCROLLABLE
#define SQL_ATTR_LOGIN_TIMEOUT
#define SQL_DESC_DISPLAY_SIZE
#define SQL_ATTR_AUTOCOMMIT
#define SQL_ATTR_CONNECTION_DEAD
#define SQLEndTran(hType, hdbc, type)
#define SQLSetStmtAttr(hstmt, fOption, ValuePtr, BufferLength)
#define SQL_DESC_CONCISE_TYPE
#define SQLSetEnvAttr(henv, Attribute, Value, StringLength)
#define SQLColAttribute(s, c, f, a, l, m, n)
#define SQL_ATTR_ACCESS_MODE
#define SQL_SUCCEEDED(rc)
#define SQL_DESC_OCTET_LENGTH
#define SQLGetConnectAttr(hdbc, fOption, ValuePtr, BufferLength, NULL)
#define SQL_DESC_UNSIGNED
APR Environment functions.
apr_size_t const unsigned char unsigned int unsigned int d
APR Thread and Process Library.
APR-util Versioning Interface.
const unsigned char * buf
#define APR_BUCKET_INIT(e)
#define APR_BUCKET_INSERT_AFTER(a, b)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define APR_BUCKET_BUFF_SIZE
apr_bucket apr_bucket_brigade * a
apr_pool_t apr_dbd_t const char * query
apr_pool_t const char apr_dbd_t const char ** error
struct apr_dbd_prepared_t apr_dbd_prepared_t
apr_pool_t apr_dbd_t const char const char * label
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
struct apr_dbd_t apr_dbd_t
apr_dbd_t int const char * statement
apr_dbd_transaction_t int mode
#define APR_DBD_TRANSACTION_ROLLBACK
struct apr_dbd_results_t apr_dbd_results_t
apr_pool_t const char apr_dbd_t ** handle
apr_pool_t apr_dbd_results_t apr_dbd_row_t int rownum
apr_pool_t apr_dbd_t int apr_dbd_prepared_t int nargs
struct apr_dbd_transaction_t apr_dbd_transaction_t
apr_pool_t apr_dbd_results_t apr_dbd_row_t ** row
apr_pool_t const char * params
struct apr_dbd_row_t apr_dbd_row_t
#define APR_DBD_TRANSACTION_IGNORE_ERRORS
#define APR_DBD_TRANSACTION_COMMIT
const char apr_hash_t ** values
const char int apr_pool_t * pool
const apr_array_header_t * list
apr_vformatter_buff_t * c
#define apr_pcalloc(p, size)
const char const char * password
const char const char *const * args
#define DEFAULT_BUFFER_SIZE
static const char *const types[]
static const char *const trans[040]
apr_bucket_alloc_t * bucket_alloc
apr_bucket_alloc_t * list
apr_status_t apr_ctime(char *date_str, apr_time_t t)
typedef int(WSAAPI *apr_winapi_fpt_WSAPoll)(IN OUT LPWSAPOLLFD fdArray