17#if __DCL_HAVE_ALLOC_DEBUG
18#undef __DCL_ALLOC_LEVEL
19#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
33#define __DCL_TRACE0_N __DCL_TRACE0
34#define __DCL_TRACE1_N __DCL_TRACE1
35#define __DCL_TRACE2_N __DCL_TRACE2
36#define __DCL_TRACE3_N __DCL_TRACE3
37#define __DCL_TRACE4_N __DCL_TRACE4
39#define __DCL_TRACE0_N(fmt)
40#define __DCL_TRACE1_N(fmt, arg)
41#define __DCL_TRACE2_N(fmt, arg1, arg2)
42#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
43#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
51#define __SET_ERROR(_error) \
52 ((SQL::Connection*)conn())->setErrorStatus(_error, __THIS_FILE__, __LINE__)
53#define __SET_ERROR_MSG(_msg) \
54 conn()->setErrorMessage(_msg, __THIS_FILE__, __LINE__)
55#define __SET_ERROR_HANDLE(_rc, _htype, _handle) \
56 conn()->setErrorHandle(_rc, _htype, _handle, __THIS_FILE__, __LINE__)
67 switch (_bind->
type) {
102 case SQL_TYPE_TIMESTAMP: {
108 case SQL_TYPE_DATE: {
114 case SQL_TYPE_TIME: {
120 case SQL_INTERVAL_YEAR:
121 case SQL_INTERVAL_MONTH:
122 case SQL_INTERVAL_DAY:
123 case SQL_INTERVAL_HOUR:
124 case SQL_INTERVAL_MINUTE:
125 case SQL_INTERVAL_SECOND:
126 case SQL_INTERVAL_YEAR_TO_MONTH:
127 case SQL_INTERVAL_DAY_TO_HOUR:
128 case SQL_INTERVAL_DAY_TO_MINUTE:
129 case SQL_INTERVAL_DAY_TO_SECOND:
130 case SQL_INTERVAL_HOUR_TO_MINUTE:
131 case SQL_INTERVAL_HOUR_TO_SECOND:
132 case SQL_INTERVAL_MINUTE_TO_SECOND: {
146 case SQL_LONGVARCHAR: {
153 case SQL_WLONGVARCHAR: {
160 case SQL_LONGVARBINARY: {
175 case SQL_SS_TIMESTAMPOFFSET: {
181 case SQL_UNKNOWN_TYPE: {
192#define SQLTYPE_NAME(SQL_TYPE, name) case SQL_TYPE : return name
204#if (ODBCVER >= 0x0300)
208#if (ODBCVER >= 0x0300)
214#if (ODBCVER < 0x0300)
217#if (ODBCVER >= 0x0300)
220#if (ODBCVER < 0x0300)
231#if (ODBCVER >= 0x0300)
240 SQLTYPE_NAME(SQL_INTERVAL_YEAR_TO_MONTH, L
"INTERVAL_YEAR_TO_MONTH");
241 SQLTYPE_NAME(SQL_INTERVAL_DAY_TO_HOUR, L
"INTERVAL_DAY_TO_HOUR");
242 SQLTYPE_NAME(SQL_INTERVAL_DAY_TO_MINUTE, L
"INTERVAL_DAY_TO_MINUTE");
243 SQLTYPE_NAME(SQL_INTERVAL_DAY_TO_SECOND, L
"INTERVAL_DAY_TO_SECOND");
244 SQLTYPE_NAME(SQL_INTERVAL_HOUR_TO_MINUTE, L
"INTERVAL_HOUR_TO_MINUTE");
245 SQLTYPE_NAME(SQL_INTERVAL_HOUR_TO_SECOND, L
"INTERVAL_HOUR_TO_SECOND");
246 SQLTYPE_NAME(SQL_INTERVAL_MINUTE_TO_SECOND, L
"INTERVAL_MINUTE_TO_SECOND");
254 SQLTYPE_NAME(SQL_SS_TIMESTAMPOFFSET, L
"SS_TIMESTAMPOFFSET");
257 default:
return L
"Unknown Type (Binary Mapped)";
267 size =
sizeof(int8_t);
270 size =
sizeof(int16_t);
273 size =
sizeof(int32_t);
277 size =
sizeof(int64_t);
280 size =
sizeof(float);
284 size =
sizeof(double);
287 size =
sizeof(DATE_STRUCT);
290 size =
sizeof(TIME_STRUCT);
292 case SQL_TYPE_TIMESTAMP:
293 size =
sizeof(TIMESTAMP_STRUCT);
296 size =
sizeof(SQL_SS_TIME2_STRUCT);
298 case SQL_SS_TIMESTAMPOFFSET:
299 size =
sizeof(SQL_SS_TIMESTAMPOFFSET_STRUCT);
301 case SQL_INTERVAL_YEAR:
302 case SQL_INTERVAL_MONTH:
303 case SQL_INTERVAL_DAY:
304 case SQL_INTERVAL_HOUR:
305 case SQL_INTERVAL_MINUTE:
306 case SQL_INTERVAL_SECOND:
307 case SQL_INTERVAL_YEAR_TO_MONTH:
308 case SQL_INTERVAL_DAY_TO_HOUR:
309 case SQL_INTERVAL_DAY_TO_MINUTE:
310 case SQL_INTERVAL_DAY_TO_SECOND:
311 case SQL_INTERVAL_HOUR_TO_MINUTE:
312 case SQL_INTERVAL_HOUR_TO_SECOND:
313 case SQL_INTERVAL_MINUTE_TO_SECOND:
314 size =
sizeof(SQL_INTERVAL_STRUCT);
318 case SQL_LONGVARCHAR:
321 size = 0 < _size && _size <= 12000 ? _size + 1 : 0;
325 size = _size + 2 + 1;
332 case SQL_WLONGVARCHAR:
336 size = 0 < _size && _size <= 4000 ? (_size + 1) * 3 : 0;
340 case SQL_LONGVARBINARY:
345 size = 0 < _size && _size <= 12000 ? _size : 0;
356 size =
sizeof(int8_t);
359 size =
sizeof(int16_t);
362 size =
sizeof(int32_t);
366 size =
sizeof(int64_t);
369 size =
sizeof(float);
373 size =
sizeof(double);
377 case SQL_TYPE_TIMESTAMP:
378 case SQL_INTERVAL_YEAR:
379 case SQL_INTERVAL_MONTH:
380 case SQL_INTERVAL_DAY:
381 case SQL_INTERVAL_HOUR:
382 case SQL_INTERVAL_MINUTE:
383 case SQL_INTERVAL_SECOND:
384 case SQL_INTERVAL_YEAR_TO_MONTH:
385 case SQL_INTERVAL_DAY_TO_HOUR:
386 case SQL_INTERVAL_DAY_TO_MINUTE:
387 case SQL_INTERVAL_DAY_TO_SECOND:
388 case SQL_INTERVAL_HOUR_TO_MINUTE:
389 case SQL_INTERVAL_HOUR_TO_SECOND:
390 case SQL_INTERVAL_MINUTE_TO_SECOND:
392 case SQL_SS_TIMESTAMPOFFSET:
398 return (_offset + size - 1) & ~(size - 1);
403 SQLSMALLINT valueType = SQL_C_DEFAULT;
405#if __USE_POSTGRES_FIX
409 valueType = SQL_C_DOUBLE;
413#if __USE_INFORMIX_FIX
419 valueType = SQL_C_SBIGINT;
423#if __USE_POSTGRES_FIX
429 case SQL_LONGVARCHAR:
432 case SQL_WLONGVARCHAR: {
433 valueType = SQL_C_CHAR;
438 case SQL_LONGVARBINARY: {
439 valueType = SQL_C_BINARY;
443 valueType = SQL_C_DEFAULT;
466#if __USE_POSTGRES_FIX
469 String::tryString((
const char*)
__bind->valuePtr,
__bind->size).data());
474 *_size =
__bind->lenORind;
477 * _size =
__bind->lenORind;
488 if (
__bind->valueMax == 0) {
493 SQLSMALLINT targetType;
497 case SQL_LONGVARCHAR: {
498 targetType = SQL_C_CHAR;
503 case SQL_WLONGVARCHAR: {
504 targetType = SQL_C_WCHAR;
509 case SQL_LONGVARBINARY:
511 targetType = SQL_C_BINARY;
514 SQLRETURN rc = SQLGetData(
query()->stmtHandle(),
__bind->number,
515 targetType, &c, 0, &(
__bind->lenORind));
517 __name.data(), rc,
__bind->lenORind,
sizeof(WCHAR));
518 if (!SQL_SUCCEEDED(rc)) {
529 if (
__bind->lenORind >= 0) {
533 case SQL_LONGVARCHAR: {
539 case SQL_WLONGVARCHAR: {
540 __bind->lenORind = (
__bind->lenORind /
sizeof(SQLWCHAR)) * 3;
546 case SQL_LONGVARBINARY:
555 *_size =
__bind->lenORind;
559#define __TYPE_IS(_type) (__bind->type == _type)
601 case sizeof(int8_t) : {
602 *(int8_t*)_buf = *(int8_t*)
__bind->valuePtr;
605 case sizeof(int16_t) : {
606 *(int16_t*)_buf = *(int8_t*)
__bind->valuePtr;
609 case sizeof(int32_t) : {
610 *(int32_t*)_buf = *(int8_t*)
__bind->valuePtr;
613 case sizeof(int64_t) : {
614 *(int64_t*)_buf = *(int8_t*)
__bind->valuePtr;
618 *_size =
sizeof(int8_t);
627 case sizeof(int16_t) : {
628 *(int16_t*)_buf = *(int16_t*)
__bind->valuePtr;
631 case sizeof(int32_t) : {
632 *(int32_t*)_buf = *(int16_t*)
__bind->valuePtr;
635 case sizeof(int64_t) : {
636 *(int64_t*)_buf = *(int16_t*)
__bind->valuePtr;
640 *_size =
sizeof(int16_t);
649 case sizeof(int32_t) : {
650 *(int32_t*)_buf = *(int32_t*)
__bind->valuePtr;
653 case sizeof(int64_t) : {
654 *(int64_t*)_buf = *(int32_t*)
__bind->valuePtr;
658 *_size =
sizeof(int32_t);
668 case sizeof(int64_t) : {
669 *(int64_t*)_buf = *(int64_t*)
__bind->valuePtr;
673 *_size =
sizeof(int64_t);
686 n = strtoll((
char*)
__bind->valuePtr, &endptr, 10);
687 if (errno == ERANGE) {
689 n == LLONG_MAX || n == LLONG_MIN
697 else if (errno == EINVAL) {
705 double d = strtod((
char*)
__bind->valuePtr, &endptr);
706 if (errno == ERANGE) {
708 +HUGE_VAL == d || -HUGE_VAL == d
716 else if (errno == EINVAL) {
724 if (i < (
double)LLONG_MIN || (
double)LLONG_MAX < i) {
732 case sizeof(int8_t) : {
737 *(int8_t*)_buf = (int8_t)n;
740 case sizeof(int16_t) : {
745 *(int16_t*)_buf = (int16_t)n;
748 case sizeof(int32_t) : {
753 *(int32_t*)_buf = (int32_t)n;
756 case sizeof(int64_t) : {
757 *(int64_t*)_buf = (int64_t)n;
761 *_size =
sizeof(int64_t);
782 case sizeof(uint8_t) : {
783 *(uint8_t*)_buf = *(uint8_t*)
__bind->valuePtr;
786 case sizeof(uint16_t) : {
787 *(uint16_t*)_buf = *(uint8_t*)
__bind->valuePtr;
790 case sizeof(uint32_t) : {
791 *(uint32_t*)_buf = *(uint8_t*)
__bind->valuePtr;
794 case sizeof(uint64_t) : {
795 *(uint64_t*)_buf = *(uint8_t*)
__bind->valuePtr;
799 *_size =
sizeof(uint8_t);
808 case sizeof(uint16_t) : {
809 *(uint16_t*)_buf = *(uint16_t*)
__bind->valuePtr;
812 case sizeof(uint32_t) : {
813 *(uint32_t*)_buf = *(uint16_t*)
__bind->valuePtr;
816 case sizeof(uint64_t) : {
817 *(uint64_t*)_buf = *(uint16_t*)
__bind->valuePtr;
821 *_size =
sizeof(uint16_t);
830 case sizeof(uint32_t) : {
831 *(uint32_t*)_buf = *(uint32_t*)
__bind->valuePtr;
834 case sizeof(uint64_t) : {
835 *(uint64_t*)_buf = *(uint32_t*)
__bind->valuePtr;
839 *_size =
sizeof(uint32_t);
849 case sizeof(uint64_t) : {
850 *(uint64_t*)_buf = *(uint64_t*)
__bind->valuePtr;
854 *_size =
sizeof(uint32_t);
865 unsigned long long u;
867 u = strtoull((
char*)
__bind->valuePtr, &endptr, 10);
868 if (errno == ERANGE) {
877 else if (errno == EINVAL) {
885 double d = strtod((
char*)
__bind->valuePtr, &endptr);
886 if (errno == ERANGE) {
888 +HUGE_VAL == d || -HUGE_VAL == d
896 else if (errno == EINVAL) {
904 if (i < 0 || (
double)ULONG_MAX < i) {
908 u = (
unsigned long long)i;
912 case sizeof(uint8_t) : {
917 *(uint8_t*)_buf = (uint8_t)u;
920 case sizeof(uint16_t) : {
925 *(uint16_t*)_buf = (uint16_t)u;
928 case sizeof(uint32_t) : {
933 *(uint32_t*)_buf = (uint32_t)u;
936 case sizeof(uint64_t) : {
937 *(uint64_t*)_buf = (uint64_t)u;
941 *_size =
sizeof(uint64_t);
961 case sizeof(float) : {
962 *(
float*)_buf = *(
float*)
__bind->valuePtr;
965 case sizeof(double) : {
966 *(
double*)_buf = *(
float*)
__bind->valuePtr;
970 *_size =
sizeof(float);
980 case sizeof(double) : {
981 *(
double*)_buf = *(
double*)
__bind->valuePtr;
985 *_size =
sizeof(double);
996 double d = strtod((
char*)
__bind->valuePtr, &endptr);
997 if (errno == ERANGE) {
999 +HUGE_VAL == d || -HUGE_VAL == d
1007 else if (errno == EINVAL) {
1014 case sizeof(float) : {
1015 if (d < -FLT_MAX || FLT_MAX < d) {
1019 *(
float*)_buf = (
float)d;
1022 case sizeof(double) : {
1023 *(
double*)_buf = (
double)d;
1027 *_size =
sizeof(double);
1052 DATE_STRUCT* s = (DATE_STRUCT*)
__bind->valuePtr;
1053 _buf->
year = s->year;
1054 _buf->
month = s->month;
1071 if (
__bind->type == SQL_TYPE_TIME) {
1072 TIME_STRUCT* s = (TIME_STRUCT*)
__bind->valuePtr;
1073 _buf->
hour = s->hour;
1074 _buf->
min = s->minute;
1075 _buf->
sec = s->second;
1080 SQL_SS_TIME2_STRUCT* s =
1081 (SQL_SS_TIME2_STRUCT*)
__bind->valuePtr;
1082 _buf->
hour = s->hour;
1083 _buf->
min = s->minute;
1084 _buf->
sec = s->second;
1085 _buf->
frac = s->fraction;
1102 if (
__bind->type == SQL_TYPE_TIME) {
1103 TIMESTAMP_STRUCT* s =
1104 (TIMESTAMP_STRUCT*)
__bind->valuePtr;
1105 _buf->
year = s->year;
1106 _buf->
month = s->month;
1108 _buf->
hour = s->hour;
1109 _buf->
min = s->minute;
1110 _buf->
sec = s->second;
1111 _buf->
frac = s->fraction;
1115 SQL_SS_TIMESTAMPOFFSET_STRUCT* s =
1116 (SQL_SS_TIMESTAMPOFFSET_STRUCT*)
__bind->valuePtr;
1117 _buf->
year = s->year;
1118 _buf->
month = s->month;
1120 _buf->
hour = s->hour;
1121 _buf->
min = s->minute;
1122 _buf->
sec = s->second;
1123 _buf->
frac = s->fraction;
1124 _buf->
tzoff = s->timezone_hour * 60 + s->timezone_minute;
1144 SQL_INTERVAL_STRUCT* s = (SQL_INTERVAL_STRUCT*)
__bind->valuePtr;
1146 __bind->type, s->interval_type, s->interval_sign);
1148 int8_t sign = s->interval_sign ? -1 : 1;
1150 case SQL_INTERVAL_YEAR:
1151 case SQL_INTERVAL_MONTH:
1152 case SQL_INTERVAL_YEAR_TO_MONTH: {
1153 SQL_YEAR_MONTH_STRUCT* intval = &(s->intval.year_month);
1154 _buf->
years = intval->year * sign;
1155 _buf->
months = intval->month * sign;
1163 case SQL_INTERVAL_DAY:
1164 case SQL_INTERVAL_HOUR:
1165 case SQL_INTERVAL_MINUTE:
1166 case SQL_INTERVAL_SECOND:
1167 case SQL_INTERVAL_DAY_TO_HOUR:
1168 case SQL_INTERVAL_DAY_TO_MINUTE:
1169 case SQL_INTERVAL_DAY_TO_SECOND:
1170 case SQL_INTERVAL_HOUR_TO_MINUTE:
1171 case SQL_INTERVAL_HOUR_TO_SECOND:
1172 case SQL_INTERVAL_MINUTE_TO_SECOND: {
1173 SQL_DAY_SECOND_STRUCT* intval = &(s->intval.day_second);
1176 _buf->
days = intval->day * sign;
1177 _buf->
hours = intval->hour * sign;
1178 _buf->
mins = intval->minute * sign;
1179 _buf->
secs = intval->second * sign;
1180 _buf->
fracs = intval->fraction * sign;
1192 if (
__bind->valueMax == 0) {
1199 if (size == (
size_t)-1) {
1213 if ((
size_t)
__bind->lenORind < *_size) {
1214 *(_buf +
__bind->lenORind) =
'\0';
1216 *_size =
__bind->lenORind;
1224 SQLRETURN rc = SQLGetData(
query()->stmtHandle(),
__bind->number,
1225 __bind->valueType, _buf, *_size, &lenORind);
1226 if (!SQL_SUCCEEDED(rc)) {
1234 if (rc == SQL_SUCCESS_WITH_INFO
1235 &&
__bind->valueType == SQL_C_CHAR
1236 && *_size == (
size_t)
__bind->lenORind
1242 *_size, lenORind, *(_buf + *_size - 1),
1243 String::tryString((
const char*)_buf,
__MIN(*_size, 40)).data()
1245 __DCL_ASSERT(((
size_t)lenORind == *_size || lenORind == SQL_NO_TOTAL)
1246 && (*(_buf + *_size - 3) ==
'\0'
1247 || *(_buf + *_size - 2) ==
'\0'
1248 || *(_buf + *_size - 1) ==
'\0')
1263 rc = SQLGetData(
query()->stmtHandle(),
__bind->number,
1264 __bind->valueType, buf,
sizeof(buf), &lenORind_);
1265 if (rc != SQL_SUCCESS) {
1270 memcpy(_buf + *_size - lenORind_, buf, lenORind_);
1273 lenORind, String::tryString((
const char*)_buf,
__MIN(*_size, 40)).data());
1274 if (0 <= lenORind && (
size_t)lenORind < *_size) {
1276 *(_buf + *_size) =
'\0';
1283 if (
__bind->valueMax == 0) {
1288 if (n == (
size_t)-1) {
1298 if ((
size_t)
__bind->lenORind < *_size) {
1299 *_size =
__bind->lenORind;
1306 _output->write(
__bind->valuePtr, *_size);
1321 while (total < *_size) {
1324 SQLRETURN rc = SQLGetData(
query()->stmtHandle(),
__bind->number,
1325 __bind->valueType, buf,
sizeof(buf), &lenORind);
1326 if (SQL_SUCCEEDED(rc)) {
1327 if (rc == SQL_SUCCESS_WITH_INFO
1328 &&
__bind->valueType == SQL_C_CHAR
1333 (lenORind ==
sizeof(buf) || lenORind == SQL_NO_TOTAL)
1334 && buf[
sizeof(buf) - 1] ==
'\0'
1336 lenORind =
sizeof(buf) - 1;
1338 lenORind =
__MIN(lenORind, *_size - total);
1339 _output->write(buf, lenORind);
1342 else if (rc == SQL_NO_DATA) {
1347 __DCL_TRACE2_N(L
"SQLGetData rc[%d] lenORind[%d]\n", rc, lenORind);
#define __DCL_TRACE1_N(fmt, arg)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
#define __SET_ERROR_MSG(_message)
#define __SET_ERROR_HANDLE(_SQLCODE)
#define SQLTYPE_NAME(_dataType, name)
#define __DCL_ASSERT(expr)
#define __SET_ERROR(_errorCode)
String toStringAll() const
bool getBytes(byte_t *_buf, size_t *_size)
bool getTimeStamp(SQL::TimeStamp *_buf, size_t *_size)
virtual ODBCQuery * query() const =0
bool getFloat(void *_buf, size_t *_size)
bool __getData(void *_buf, size_t *_size, SQL::DataType _bufType)
static const wchar_t * __TYPE_NAME(SQLSMALLINT _type)
static SQLULEN __TYPE_SIZE(SQLSMALLINT _type, SQLULEN _size)
SQL::DataType init(BIND *_bind)
bool getUInteger(void *_buf, size_t *_size)
bool getInterval(SQL::Interval *_buf, size_t *_size)
const wchar_t * serverDataTypeName() const
static SQLSMALLINT __VALUE_TYPE(SQLSMALLINT _type)
bool getDate(SQL::Date *_buf, size_t *_size)
bool writeTo(OutputStream *_output, size_t *_size)
bool __getDataSize(size_t *_size, bool _maxsize)
static size_t __TYPE_ALIGN(size_t _offset, SQLSMALLINT _type)
bool getTime(SQL::Time *_buf, size_t *_size)
bool getInteger(void *_buf, size_t *_size)
size_t __MIN(size_t x, size_t y)