10#if __DCL_HAVE_ALLOC_DEBUG
11#undef __DCL_ALLOC_LEVEL
12#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
26#define __DCL_TRACE0_N __DCL_TRACE0
27#define __DCL_TRACE1_N __DCL_TRACE1
28#define __DCL_TRACE2_N __DCL_TRACE2
29#define __DCL_TRACE3_N __DCL_TRACE3
30#define __DCL_TRACE4_N __DCL_TRACE4
32#define __DCL_TRACE0_N(fmt)
33#define __DCL_TRACE1_N(fmt, arg)
34#define __DCL_TRACE2_N(fmt, arg1, arg2)
35#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
36#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
44#define __SET_ERROR(_error) \
45 conn()->setErrorHandle(_error, __THIS_FILE__, __LINE__)
46#define __SET_ERROR_MSG(_msg) \
47 conn()->setErrorMessage(_msg, __THIS_FILE__, __LINE__)
51#define __SQLTYPE_IS(__sqltype) ((__sqlvar->sqltype & ~1) == __sqltype)
74 Field::__queryHandle = _queryHandle;
76 __sqlvar->sqlind = &__indicator;
79 Field::__name = UTF8Decoder::decode(__sqlvar->sqlname,
80 __sqlvar->sqlname_length).toUpperCase();
88#ifndef FIREBIRD_IBASE_H
89 Field::__precision = __sqlvar->sqlprecision;
91 Field::__scale = __sqlvar->sqlscale;
93 switch(__sqlvar->sqltype & ~1) {
96 __maxDataSize =
sizeof(int8_t);
100 if (__sqlvar->sqlscale == 0) {
102 __maxDataSize =
sizeof(int16_t);
106 __maxDataSize = 5 + 2;
111 if (__sqlvar->sqlscale == 0) {
113 __maxDataSize =
sizeof(int32_t);
117 __maxDataSize = 10 + 2;
122 if (__sqlvar->sqlscale == 0) {
124 __maxDataSize =
sizeof(int64_t);
128 __maxDataSize = 19 + 2;
135 __maxDataSize =
sizeof(float);
140 __maxDataSize =
sizeof(double);
143 case SQL_TYPE_DATE: {
148 case SQL_TYPE_TIME: {
153 case SQL_TIMESTAMP: {
158#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
159 case SQL_TIME_TZ_EX: {
164 case SQL_TIMESTAMP_TZ_EX: {
172 __maxDataSize = __sqlvar->sqllen;
177 __maxDataSize = __sqlvar->sqllen;
181 if (__sqlvar->sqlsubtype == isc_blob_text)
185 __maxDataSize = 64 * 1024;
195static size_t __get_decimal_length(
void* _buf,
short _sqltype,
short _sqlscale);
199 if (__indicator != -1) {
202 __dataSize = __get_decimal_length(__sqlvar->sqldata,
203 __sqlvar->sqltype, __sqlvar->sqlscale);
210 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
213 conn()->statusVector(),
214 conn()->dbHandlePtr(),
215 conn()->trHandlePtr(),
225 bool b =
getBlobInfo(&hBlob, isc_info_blob_total_length, &__dataSize);
227 isc_close_blob(status2, &hBlob);
238#define SQLTYPE_NAME(_dataType, name) case _dataType : return L ## name
242 switch(_sqlvar->sqltype & ~1) {
247 if (_sqlvar->sqlscale) {
248 switch (_sqlvar->sqltype & ~1) {
255 switch (_sqlvar->sqltype & ~1) {
267#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
269 SQLTYPE_NAME(SQL_TIMESTAMP_TZ_EX,
"TIMESTAMP WITH TIMEZONE");
274 if (_sqlvar->sqlsubtype == 1)
275 return L
"BLOB(TEXT)";
280 return L
"Unknown Type: Driver is not Support";
291 *_size = __maxDataSize;
295 if (__indicator == -1) {
299 switch (Field::__dataType) {
302 *_size = __sqlvar->sqllen;
305 *_size = *(
short*)(__sqlvar->sqldata);
319 *_size = __sqlvar->sqllen;
333 if (
query()->stmtType() == isc_info_sql_stmt_select) {
377static int32_t __divider32 [] =
391static int64_t __divider64 [] =
410 10000000000000000I64,
411 100000000000000000I64,
412 1000000000000000000I64
431 100000000000000000LL,
432 1000000000000000000LL
445 if (__sqlvar->sqlscale == 0) {
447 switch(__sqlvar->sqltype & ~1) {
450 case sizeof(int8_t) : {
451 *(int8_t*)_buf = *(int8_t*)(__sqlvar->sqldata);
454 case sizeof(int16_t) : {
455 *(int16_t*)_buf = *(int8_t*)(__sqlvar->sqldata);
458 case sizeof(int32_t) : {
459 *(int32_t*)_buf = *(int8_t*)(__sqlvar->sqldata);
462 case sizeof(int64_t) : {
463 *(int64_t*)_buf = *(int8_t*)(__sqlvar->sqldata);
467 *_size =
sizeof(int8_t);
476 case sizeof(int16_t) : {
477 *(int16_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
480 case sizeof(int32_t) : {
481 *(int32_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
484 case sizeof(int64_t) : {
485 *(int64_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
489 *_size =
sizeof(int16_t);
498 case sizeof(int32_t) : {
499 *(int32_t*)_buf = *(int32_t*)(__sqlvar->sqldata);
502 case sizeof(int64_t) : {
503 *(int64_t*)_buf = *(int32_t*)(__sqlvar->sqldata);
507 *_size =
sizeof(int32_t);
516 case sizeof(int64_t) : {
517 *(int64_t*)_buf = *(int64_t*)(__sqlvar->sqldata);
521 *_size =
sizeof(int64_t);
536 switch(__sqlvar->sqltype & ~1) {
539 (*(int16_t*)(__sqlvar->sqldata))
540 / __divider32[-(__sqlvar->sqlscale)]
543 case sizeof(int8_t) : {
548 *(int8_t*)_buf = (int8_t)n.
i16;
551 case sizeof(int16_t) : {
552 *(int16_t*)_buf = n.
i16;
555 case sizeof(int32_t) : {
556 *(int32_t*)_buf = (int32_t)n.
i16;
559 case sizeof(int64_t) : {
560 *(int64_t*)_buf = (int64_t)n.
i16;
564 *_size =
sizeof(int16_t);
573 (*(int32_t*)(__sqlvar->sqldata))
574 / __divider32[-(__sqlvar->sqlscale)]
577 case sizeof(int8_t) : {
582 *(int8_t*)_buf = (int8_t)n.
i32;
585 case sizeof(int16_t) : {
590 *(int16_t*)_buf = (int16_t)n.
i32;
593 case sizeof(int32_t) : {
594 *(int32_t*)_buf = n.
i32;
597 case sizeof(int64_t) : {
598 *(int64_t*)_buf = (int64_t)n.
i32;
602 *_size =
sizeof(int32_t);
610 n.
i64 = *(int64_t*)(__sqlvar->sqldata)
611 / __divider64[-(__sqlvar->sqlscale)];
613 case sizeof(int8_t) : {
618 *(int8_t*)_buf = (int8_t)n.
i64;
621 case sizeof(int16_t) : {
626 *(int16_t*)_buf = (int16_t)n.
i64;
629 case sizeof(int32_t) : {
634 *(int32_t*)_buf = (int32_t)n.
i64;
637 case sizeof(int64_t) : {
638 *(int64_t*)_buf = n.
i64;
642 *_size =
sizeof(int64_t);
659 if (__sqlvar->sqlscale == 0) {
661 switch(__sqlvar->sqltype & ~1) {
664 case sizeof(uint8_t) : {
665 *(uint8_t*)_buf = *(uint8_t*)(__sqlvar->sqldata);
668 case sizeof(uint16_t) : {
669 *(uint16_t*)_buf = *(uint8_t*)(__sqlvar->sqldata);
672 case sizeof(uint32_t) : {
673 *(uint32_t*)_buf = *(uint8_t*)(__sqlvar->sqldata);
676 case sizeof(uint64_t) : {
677 *(uint64_t*)_buf = *(uint8_t*)(__sqlvar->sqldata);
681 *_size =
sizeof(uint8_t);
690 case sizeof(uint16_t) : {
691 *(uint16_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
694 case sizeof(uint32_t) : {
695 *(uint32_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
698 case sizeof(uint64_t) : {
699 *(uint64_t*)_buf = *(int16_t*)(__sqlvar->sqldata);
703 *_size =
sizeof(uint16_t);
712 case sizeof(uint32_t) : {
713 *(uint32_t*)_buf = *(int32_t*)(__sqlvar->sqldata);
716 case sizeof(int64_t) : {
717 *(uint64_t*)_buf = *(int32_t*)(__sqlvar->sqldata);
721 *_size =
sizeof(uint32_t);
730 case sizeof(uint64_t) : {
731 *(uint64_t*)_buf = *(int64_t*)(__sqlvar->sqldata);
735 *_size =
sizeof(uint64_t);
750 switch(__sqlvar->sqltype & ~1) {
753 (*(int16_t*)(__sqlvar->sqldata))
754 / __divider32[-(__sqlvar->sqlscale)]
757 case sizeof(int8_t) : {
762 *(uint8_t*)_buf = (uint8_t)n.
i16;
765 case sizeof(int16_t) : {
766 *(uint16_t*)_buf = (uint16_t)n.
i16;
769 case sizeof(int32_t) : {
770 *(uint32_t*)_buf = (uint32_t)n.
i16;
773 case sizeof(int64_t) : {
774 *(uint64_t*)_buf = (uint64_t)n.
i16;
778 *_size =
sizeof(uint16_t);
787 (*(int32_t*)(__sqlvar->sqldata))
788 / __divider32[-(__sqlvar->sqlscale)]
791 case sizeof(int8_t) : {
796 *(uint8_t*)_buf = (uint8_t)n.
i32;
799 case sizeof(int16_t) : {
804 *(uint16_t*)_buf = (uint16_t)n.
i32;
807 case sizeof(int32_t) : {
808 *(uint32_t*)_buf = (uint32_t)n.
i32;
811 case sizeof(int64_t) : {
812 *(uint64_t*)_buf = (uint64_t)n.
i32;
816 *_size =
sizeof(uint32_t);
824 n.
i64 = *(int64_t*)(__sqlvar->sqldata)
825 / __divider64[-(__sqlvar->sqlscale)];
827 case sizeof(int8_t) : {
832 *(uint8_t*)_buf = (uint8_t)n.
i64;
835 case sizeof(int16_t) : {
840 *(uint16_t*)_buf = (uint16_t)n.
i64;
843 case sizeof(int32_t) : {
848 *(uint32_t*)_buf = (uint32_t)n.
i64;
851 case sizeof(int64_t) : {
852 *(uint64_t*)_buf = (uint64_t)n.
i64;
856 *_size =
sizeof(int64_t);
873 switch(__sqlvar->sqltype & ~1) {
876 case sizeof(float) : {
878 *(
float*)(__sqlvar->sqldata);
881 case sizeof(double) : {
882 *(
double*)_buf = *(
float*)(__sqlvar->sqldata);
886 *_size =
sizeof(float);
895 case sizeof(double) : {
896 *(
double*)_buf = *(
double*)(__sqlvar->sqldata);
900 *_size =
sizeof(double);
911 case sizeof(float) : {
913 (
float)(*(int16_t*)(__sqlvar->sqldata))
914 / (float)__divider32[-(__sqlvar->sqlscale)];
917 case sizeof(double) : {
918 *(
double*)_buf = (
double)(*(int16_t*)(__sqlvar->sqldata))
919 / (double)__divider32[-(__sqlvar->sqlscale)];
923 *_size =
sizeof(float);
934 case sizeof(float) : {
936 (
float)(*(int32_t*)(__sqlvar->sqldata))
937 / (float)__divider32[-(__sqlvar->sqlscale)];
940 case sizeof(double) : {
941 *(
double*)_buf = (
double)(*(int32_t*)(__sqlvar->sqldata))
942 / (double)__divider32[-(__sqlvar->sqlscale)];
946 *_size =
sizeof(double);
957 case sizeof(float) : {
959 (
float)(*(int64_t*)(__sqlvar->sqldata))
960 / (float)__divider32[-(__sqlvar->sqlscale)];
963 case sizeof(double) : {
964 *(
double*)_buf = (
double)(*(int64_t*)(__sqlvar->sqldata))
965 / (double)__divider64[-(__sqlvar->sqlscale)];
969 *_size =
sizeof(double);
992 switch(__sqlvar->sqltype & ~1) {
993#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
994 case SQL_TIMESTAMP_TZ_EX:
997 case SQL_TYPE_DATE: {
998 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
1002 case SQL_TIMESTAMP: {
1003 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1012 _buf->
year = tm.tm_year + 1900;
1013 _buf->
month = tm.tm_mon + 1;
1014 _buf->
day = tm.tm_mday;
1030 switch(__sqlvar->sqltype & ~1) {
1031#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1032 case SQL_TIME_TZ_EX: {
1033 _buf->
tzoff = ((ISC_TIME_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1036 case SQL_TYPE_TIME: {
1037 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
1038 t = *(ISC_TIME*)(__sqlvar->sqldata);
1041#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1042 case SQL_TIMESTAMP_TZ_EX: {
1043 _buf->
tzoff = ((ISC_TIMESTAMP_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1046 case SQL_TIMESTAMP: {
1047 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1048 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
1056 _buf->
hour = tm.tm_hour;
1057 _buf->
min = tm.tm_min;
1058 _buf->
sec = tm.tm_sec;
1061 _buf->
frac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1078 switch(__sqlvar->sqltype & ~1) {
1079 case SQL_TYPE_DATE : {
1080 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
1083#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1084 case SQL_TIME_TZ_EX: {
1085 _buf->
tzoff = ((ISC_TIME_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1088 case SQL_TYPE_TIME: {
1089 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
1090 t = *(ISC_TIME*)(__sqlvar->sqldata);
1093#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1094 case SQL_TIMESTAMP_TZ_EX: {
1095 _buf->
tzoff = ((ISC_TIMESTAMP_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1098 case SQL_TIMESTAMP: {
1099 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1100 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
1108 _buf->
year = tm.tm_year + 1900;
1109 _buf->
month = tm.tm_mon + 1;
1110 _buf->
day = tm.tm_mday;
1111 _buf->
hour = tm.tm_hour;
1112 _buf->
min = tm.tm_min;
1113 _buf->
sec = tm.tm_sec;
1116 _buf->
frac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1123 return _n < 0 ? -_n : _n;
1126static size_t __get_decimal_length(
void* _buf,
short _sqltype,
short _sqlscale)
1128 unsigned int scale = _sqlscale < 0 ? -_sqlscale : _sqlscale;
1130 switch (_sqltype & ~1) {
1132 n = (int32_t) * (
short*)_buf;
1136 n = *(int32_t*)_buf;
1140 n = *(int64_t*)_buf;
1147 int64_t u = n < 0 ? -n : n;
1148 unsigned int count = 1;
1149 while ((u /= 10)) count++;
1153 return count + (n < 0 ? 1 : 0) + (scale < count ? 1 : (scale - count + 2));
1156static ByteString __get_decimal_string(
void* _buf,
short _sqltype,
short _sqlscale)
1160 switch (_sqltype & ~1) {
1162 n = (int32_t) * (
short*)_buf;
1166 n = *(int32_t*)_buf;
1170 n = *(int64_t*)_buf;
1177 int64_t u = n < 0 ? -n : n;
1179 ByteStringBuilder sb;
1183 if (num.length() <=
__ABS(_sqlscale)) {
1184 ByteString pad(
'0',
__ABS((
int) num.length() + _sqlscale - 1));
1188 sb.insert(sb.length() + _sqlscale,
'.');
1190 return sb.toByteString();
1196 ByteString
r = __get_decimal_string(
1201 if (*_size < (
size_t)
r.length()) {
1203 *_size,
r.length(),
r.data());
1207 strncpy(_buf,
r.data(),
r.length());
1208 if (*_size > (
size_t)
r.length()) {
1209 *_size = (size_t)
r.length();
1210 _buf[*_size] =
'\0';
1219 char* pSrc = (
char*)(__sqlvar->sqldata);
1220 size_t nCopy = (size_t)(__sqlvar->sqllen);
1222 pSrc +=
sizeof(short);
1223 nCopy = (size_t)(*(
short*)pSrc);
1230 memcpy(_buf, pSrc, nCopy);
1232 *(_buf + nCopy) =
'\0';
1250 char* pSrc = (
char*)(__sqlvar->sqldata);
1251 size_t nCopy = (size_t)(__sqlvar->sqllen);
1253 pSrc +=
sizeof(short);
1254 nCopy = (size_t)(*(
short*)pSrc);
1262 _buf->write(pSrc, nCopy);
1293 isc_blob_handle* _blobHandle,
1294 char _blob_info_item,
size_t* _buf
1297 char res_buffer[10];
1299 conn()->statusVector(),
1301 sizeof(_blob_info_item),
1310 char* p = res_buffer;
1313 unsigned short length = (
unsigned short)isc_vax_integer(p, 2);
1315 *_buf = isc_vax_integer(p, length);
1322 return x < y ? x : y;
1328 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1331 conn()->statusVector(),
1332 conn()->dbHandlePtr(),
1333 conn()->trHandlePtr(),
1343 size_t nMaxSegment = 0;
1344 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1346 isc_close_blob(status2, &hBlob);
1352 size_t nRemain = *_size;
1353 unsigned short nRead = 0;
1354 unsigned short nActualRead = 0;
1355 char* pch = (
char*)_buf;
1358 nRead = (
unsigned short)
__MIN(nRemain, nMaxSegment);
1359 rs = isc_get_segment(
1360 conn()->statusVector(),
1376 nRemain -= nActualRead;
1380 if ((
conn()->statusVector()[0])
1381 && (
conn()->statusVector()[1])
1382 && (
conn()->statusVector()[1] != isc_segstr_eof)
1385 isc_close_blob(status2, &hBlob);
1392 if (isc_close_blob(
conn()->statusVector(), &hBlob)) {
1405 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1408 conn()->statusVector(),
1409 conn()->dbHandlePtr(),
1410 conn()->trHandlePtr(),
1420 size_t nMaxSegment = 0;
1421 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1423 isc_close_blob(status2, &hBlob);
1429 char* _buf = (
char*)malloc(nMaxSegment);
1433 isc_close_blob(status2, &hBlob);
1438 size_t nRemain = *_size;
1439 unsigned short nActualRead = 0;
1440 unsigned short nRead = 0;
1443 nRead = (
unsigned short)
__MIN(nRemain, nMaxSegment);
1444 rs = isc_get_segment(
1445 conn()->statusVector(),
1454 _output->write(_buf, nActualRead);
1461 isc_close_blob(status2, &hBlob);
1464 nRemain -= nActualRead;
1474 if ((
conn()->statusVector()[0])
1475 && (
conn()->statusVector()[1])
1476 && (
conn()->statusVector()[1] != isc_segstr_eof)
1479 isc_close_blob(status2, &hBlob);
1486 if (isc_close_blob(
conn()->statusVector(), &hBlob)) {
#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
#define ISC_STATUS_VECTOR_LENGTH
const wchar_t * __dataTypeName(const XSQLVAR *_sqlvar)
size_t __MIN(size_t x, size_t y)
#define SQLTYPE_NAME(_dataType, name)
const wchar_t * __dataTypeName(const XSQLVAR *_sqlvar)
#define __SET_ERROR_MSG(_message)
#define __SQLTYPE_IS(_sqltype)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
#define __SET_ERROR(_errorCode)
String toStringAll() const
bool getBlobInfo(isc_blob_handle *_blobHandle, char _blob_info_item, size_t *_buf)
bool getInteger(void *_buf, size_t *_size)
bool getDecimal(char *_buf, size_t *_size)
bool writeToFromBlob(OutputStream *_output, size_t *_size)
bool getUInteger(void *_buf, size_t *_size)
bool writeTo(OutputStream *_output, size_t *_size)
virtual bool __getDataSize(size_t *_size, bool _maxsize)
bool getBytesFromBlob(byte_t *_buf, size_t *_size)
bool getBytes(byte_t *_buf, size_t *_size)
bool init(SQL::Query *_query, XSQLVAR *_sqlvar)
bool getTimeStamp(SQL::TimeStamp *_buf, size_t *_size)
bool getTime(SQL::Time *_buf, size_t *_size)
bool getFloat(void *_buf, size_t *_size)
virtual const wchar_t * serverDataTypeName() const
bool getDate(SQL::Date *_buf, size_t *_size)
IBConnection * conn() const
virtual bool __getData(void *_buf, size_t *_size, SQL::DataType _bufType)
static ByteString toByteString(uint64_t _u, unsigned _base=10)
size_t __MIN(size_t x, size_t y)