10#if __DCL_HAVE_ALLOC_DEBUG
11#undef __DCL_ALLOC_LEVEL
12#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
31#define __SQLTYPE_IS(__sqltype) ((__sqlvar->sqltype & ~1) == __sqltype)
54 Field::__queryHandle = _queryHandle;
56 __sqlvar->sqlind = &__indicator;
59 Field::__name = UTF8Decoder::decode(__sqlvar->sqlname,
60 __sqlvar->sqlname_length).toUpperCase();
68#ifndef FIREBIRD_IBASE_H
69 Field::__precision = __sqlvar->sqlprecision;
71 Field::__scale = __sqlvar->sqlscale;
73 switch(__sqlvar->sqltype & ~1) {
75 if (__sqlvar->sqlscale == 0) {
77 __maxDataSize =
sizeof(int16_t);
81 __maxDataSize = 5 + 2;
86 if (__sqlvar->sqlscale == 0) {
88 __maxDataSize =
sizeof(int32_t);
92 __maxDataSize = 10 + 2;
97 if (__sqlvar->sqlscale == 0) {
99 __maxDataSize =
sizeof(int64_t);
103 __maxDataSize = 19 + 2;
110 __maxDataSize =
sizeof(float);
115 __maxDataSize =
sizeof(double);
118 case SQL_TYPE_DATE: {
123 case SQL_TYPE_TIME: {
128 case SQL_TIMESTAMP: {
133#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
134 case SQL_TIME_TZ_EX: {
139 case SQL_TIMESTAMP_TZ_EX: {
147 __maxDataSize = __sqlvar->sqllen;
152 __maxDataSize = __sqlvar->sqllen;
156 if (__sqlvar->sqlsubtype == isc_blob_text)
160 __maxDataSize = 64 * 1024;
172 if (__indicator == -1)
182 isc_blob_handle hBlob =
NULL;
183 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
197 bool b =
getBlobInfo(&hBlob, isc_info_blob_total_length, &__dataSize);
199 isc_close_blob(status2, &hBlob);
209#define SQLTYPE_NAME(_dataType, name) case _dataType : return L ## name
213 switch(_sqlvar->sqltype & ~1) {
217 if (_sqlvar->sqlscale) {
218 switch (_sqlvar->sqltype & ~1) {
225 switch (_sqlvar->sqltype & ~1) {
237#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
239 SQLTYPE_NAME(SQL_TIMESTAMP_TZ_EX,
"TIMESTAMP WITH TIMEZONE");
244 if (_sqlvar->sqlsubtype == 1)
245 return L
"BLOB(TEXT)";
250 return L
"Unknown Type: Driver is not Support";
263 if (
query()->stmtType() == isc_info_sql_stmt_select) {
268 return __indicator == -1;
274 *_size = __maxDataSize;
278 if (
query()->stmtType() == isc_info_sql_stmt_select) {
287 switch(Field::__dataType) {
290 *_size = __sqlvar->sqllen;
294 *_size = *(
short*)(__sqlvar->sqldata);
306 *_size = __maxDataSize;
319 if (
query()->stmtType() == isc_info_sql_stmt_select) {
363static int32_t __divider32 [] =
377static int64_t __divider64 [] =
396 10000000000000000I64,
397 100000000000000000I64,
398 1000000000000000000I64
417 100000000000000000LL,
418 1000000000000000000LL
431 if (__sqlvar->sqlscale == 0) {
433 switch(__sqlvar->sqltype & ~1) {
436 case sizeof(int16_t) : {
438 *(int16_t*)(__sqlvar->sqldata);
441 case sizeof(int32_t) : {
444 *(int16_t*)(__sqlvar->sqldata)
448 case sizeof(int64_t) : {
451 *(int16_t*)(__sqlvar->sqldata)
456 *_size =
sizeof(int16_t);
465 case sizeof(int32_t) : {
467 *(int32_t*)(__sqlvar->sqldata);
470 case sizeof(int64_t) : {
473 *(int32_t*)(__sqlvar->sqldata)
478 *_size =
sizeof(int32_t);
487 case sizeof(int64_t) : {
489 *(int64_t*)(__sqlvar->sqldata);
493 *_size =
sizeof(int64_t);
508 switch(__sqlvar->sqltype & ~1) {
511 (*(int16_t*)(__sqlvar->sqldata))
512 / __divider32[-(__sqlvar->sqlscale)]
515 case sizeof(int8_t) : {
520 *(int8_t*)_buf = (int8_t)
n.i16;
523 case sizeof(int16_t) : {
524 *(int16_t*)_buf =
n.i16;
527 case sizeof(int32_t) : {
528 *(int32_t*)_buf = (int32_t)
n.i16;
531 case sizeof(int64_t) : {
532 *(int64_t*)_buf = (int64_t)
n.i16;
536 *_size =
sizeof(int16_t);
545 (*(int32_t*)(__sqlvar->sqldata))
546 / __divider32[-(__sqlvar->sqlscale)]
549 case sizeof(int8_t) : {
554 *(int8_t*)_buf = (int8_t)
n.i32;
557 case sizeof(int16_t) : {
562 *(int16_t*)_buf = (int16_t)
n.i32;
565 case sizeof(int32_t) : {
566 *(int32_t*)_buf =
n.i32;
569 case sizeof(int64_t) : {
570 *(int64_t*)_buf = (int64_t)
n.i32;
574 *_size =
sizeof(int32_t);
582 n.i64 = *(int64_t*)(__sqlvar->sqldata)
583 / __divider64[-(__sqlvar->sqlscale)];
585 case sizeof(int8_t) : {
590 *(int8_t*)_buf = (int8_t)
n.i64;
593 case sizeof(int16_t) : {
598 *(int16_t*)_buf = (int16_t)
n.i64;
601 case sizeof(int32_t) : {
606 *(int32_t*)_buf = (int32_t)
n.i64;
609 case sizeof(int64_t) : {
610 *(int64_t*)_buf =
n.i64;
614 *_size =
sizeof(int64_t);
631 if (__sqlvar->sqlscale == 0) {
633 switch(__sqlvar->sqltype & ~1) {
636 case sizeof(uint16_t) : {
639 *(int16_t*)(__sqlvar->sqldata)
643 case sizeof(uint32_t) : {
646 *(int16_t*)(__sqlvar->sqldata)
650 case sizeof(uint64_t) : {
653 *(int16_t*)(__sqlvar->sqldata)
658 *_size =
sizeof(uint16_t);
667 case sizeof(uint32_t) : {
670 *(int32_t*)(__sqlvar->sqldata)
674 case sizeof(int64_t) : {
677 *(int32_t*)(__sqlvar->sqldata)
682 *_size =
sizeof(uint32_t);
691 case sizeof(uint64_t) : {
694 *(int64_t*)(__sqlvar->sqldata)
699 *_size =
sizeof(uint64_t);
714 switch(__sqlvar->sqltype & ~1) {
717 (*(int16_t*)(__sqlvar->sqldata))
718 / __divider32[-(__sqlvar->sqlscale)]
721 case sizeof(int8_t) : {
726 *(uint8_t*)_buf = (uint8_t)
n.i16;
729 case sizeof(int16_t) : {
730 *(uint16_t*)_buf = (uint16_t)
n.i16;
733 case sizeof(int32_t) : {
734 *(uint32_t*)_buf = (uint32_t)
n.i16;
737 case sizeof(int64_t) : {
738 *(uint64_t*)_buf = (uint64_t)
n.i16;
742 *_size =
sizeof(uint16_t);
751 (*(int32_t*)(__sqlvar->sqldata))
752 / __divider32[-(__sqlvar->sqlscale)]
755 case sizeof(int8_t) : {
760 *(uint8_t*)_buf = (uint8_t)
n.i32;
763 case sizeof(int16_t) : {
768 *(uint16_t*)_buf = (uint16_t)
n.i32;
771 case sizeof(int32_t) : {
772 *(uint32_t*)_buf = (uint32_t)
n.i32;
775 case sizeof(int64_t) : {
776 *(uint64_t*)_buf = (uint64_t)
n.i32;
780 *_size =
sizeof(uint32_t);
788 n.i64 = *(int64_t*)(__sqlvar->sqldata)
789 / __divider64[-(__sqlvar->sqlscale)];
791 case sizeof(int8_t) : {
796 *(uint8_t*)_buf = (uint8_t)
n.i64;
799 case sizeof(int16_t) : {
804 *(uint16_t*)_buf = (uint16_t)
n.i64;
807 case sizeof(int32_t) : {
812 *(uint32_t*)_buf = (uint32_t)
n.i64;
815 case sizeof(int64_t) : {
816 *(uint64_t*)_buf = (uint64_t)
n.i64;
820 *_size =
sizeof(int64_t);
837 switch(__sqlvar->sqltype & ~1) {
840 case sizeof(float) : {
842 *(
float*)(__sqlvar->sqldata);
845 case sizeof(double) : {
848 *(
float*)(__sqlvar->sqldata)
853 *_size =
sizeof(float);
862 case sizeof(double) : {
864 *(
double*)(__sqlvar->sqldata);
868 *_size =
sizeof(double);
879 case sizeof(float) : {
881 (
float)(*(int16_t*)(__sqlvar->sqldata))
882 / (float)__divider32[-(__sqlvar->sqlscale)];
885 case sizeof(double) : {
887 (
double)(*(int16_t*)(__sqlvar->sqldata))
888 / (double)__divider32[-(__sqlvar->sqlscale)];
892 *_size =
sizeof(float);
903 case sizeof(float) : {
905 (
float)(*(int32_t*)(__sqlvar->sqldata))
906 / (float)__divider32[-(__sqlvar->sqlscale)];
909 case sizeof(double) : {
911 (
double)(*(int32_t*)(__sqlvar->sqldata))
912 / (double)__divider32[-(__sqlvar->sqlscale)];
916 *_size =
sizeof(double);
927 case sizeof(float) : {
929 (
float)(*(int64_t*)(__sqlvar->sqldata))
930 / (float)__divider32[-(__sqlvar->sqlscale)];
933 case sizeof(double) : {
935 (
double)(*(int64_t*)(__sqlvar->sqldata))
936 / (double)__divider64[-(__sqlvar->sqlscale)];
940 *_size =
sizeof(double);
963 switch(__sqlvar->sqltype & ~1) {
964#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
965 case SQL_TIMESTAMP_TZ_EX:
968 case SQL_TYPE_DATE: {
969 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
973 case SQL_TIMESTAMP: {
974 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
983 _buf->
year = tm.tm_year + 1900;
984 _buf->
month = tm.tm_mon + 1;
985 _buf->
day = tm.tm_mday;
1001 switch(__sqlvar->sqltype & ~1) {
1002#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1003 case SQL_TIME_TZ_EX: {
1004 _buf->
tzoff = ((ISC_TIME_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1007 case SQL_TYPE_TIME: {
1008 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
1009 t = *(ISC_TIME*)(__sqlvar->sqldata);
1012#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1013 case SQL_TIMESTAMP_TZ_EX: {
1014 _buf->
tzoff = ((ISC_TIMESTAMP_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1017 case SQL_TIMESTAMP: {
1018 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1019 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
1027 _buf->
hour = tm.tm_hour;
1028 _buf->
min = tm.tm_min;
1029 _buf->
sec = tm.tm_sec;
1032 _buf->
frac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1049 switch(__sqlvar->sqltype & ~1) {
1050 case SQL_TYPE_DATE : {
1051 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
1054#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1055 case SQL_TIME_TZ_EX: {
1056 _buf->
tzoff = ((ISC_TIME_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1059 case SQL_TYPE_TIME: {
1060 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
1061 t = *(ISC_TIME*)(__sqlvar->sqldata);
1064#if defined(FIREBIRD_IBASE_H) && FB_API_VER >= 40
1065 case SQL_TIMESTAMP_TZ_EX: {
1066 _buf->
tzoff = ((ISC_TIMESTAMP_TZ_EX*)(__sqlvar->sqldata))->ext_offset;
1069 case SQL_TIMESTAMP: {
1070 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1071 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
1079 _buf->
year = tm.tm_year + 1900;
1080 _buf->
month = tm.tm_mon + 1;
1081 _buf->
day = tm.tm_mday;
1082 _buf->
hour = tm.tm_hour;
1083 _buf->
min = tm.tm_min;
1084 _buf->
sec = tm.tm_sec;
1087 _buf->
frac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1093 return n < 0 ? -
n :
n;
1096static ByteString __GetDecimalString(
void* _buf,
short _sqltype,
short _sqlscale)
1099 switch(_sqltype & ~1) {
1117 ByteStringBuilder strNumber;
1118 if (str.length() > 0) {
1119 if (str[(
size_t)0] ==
'-') {
1125 int padLen = str.length() + _sqlscale - 1;
1127 ByteString pad(
'0',
__ABS(padLen));
1137 strNumber.insert(strNumber.length() + _sqlscale,
'.');
1139 size_t len = strNumber.length();
1140 for(;
len > 1 && strNumber[
len - 1] ==
'0';
len--) {
1141 if (strNumber[
len - 2] ==
'.')
1145 if (
len < strNumber.length()) {
1146 strNumber = strNumber.toByteString().left(
len);
1160 ByteString
r = __GetDecimalString(
1165 if (*_size < (
size_t)
r.length()) {
1172 strncpy(_buf,
r.data(),
r.length());
1173 if (*_size > (
size_t)
r.length()) {
1174 *_size = (size_t)
r.length();
1175 _buf[*_size] =
'\0';
1184 char* pSrc = (
char*)(__sqlvar->sqldata);
1185 size_t nCopy = (size_t)(__sqlvar->sqllen);
1187 pSrc +=
sizeof(short);
1188 nCopy = (size_t)(*(
short*)pSrc);
1195 memcpy(_buf, pSrc, nCopy);
1197 *(_buf + nCopy) =
'\0';
1215 char* pSrc = (
char*)(__sqlvar->sqldata);
1216 size_t nCopy = (size_t)(__sqlvar->sqllen);
1218 pSrc +=
sizeof(short);
1219 nCopy = (size_t)(*(
short*)pSrc);
1227 _buf->write(pSrc, nCopy);
1258 isc_blob_handle* _blobHandle,
1259 char _blob_info_item,
size_t* _buf
1262 char res_buffer[10];
1266 sizeof(_blob_info_item),
1277 char* p = res_buffer;
1280 unsigned short length = (
unsigned short)isc_vax_integer(p, 2);
1282 *_buf = isc_vax_integer(p, length);
1289 return x < y ? x : y;
1296 isc_blob_handle hBlob =
NULL;
1297 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1311 size_t nMaxSegment = 0;
1312 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1314 isc_close_blob(statusVector, &hBlob);
1320 size_t nRemain = *_size;
1321 unsigned short nRead = 0;
1322 unsigned short nActualRead = 0;
1323 char* pch = (
char*)_buf;
1326 nRead =
__MIN(nRemain, nMaxSegment);
1327 rs = isc_get_segment(
1343 nRemain -= nActualRead;
1347 if (statusVector[0] && statusVector[1] && (statusVector[1] != isc_segstr_eof)) {
1349 isc_close_blob(statusVector, &hBlob);
1356 if (isc_close_blob(statusVector, &hBlob)) {
1371 isc_blob_handle hBlob =
NULL;
1372 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1386 size_t nMaxSegment = 0;
1387 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1389 isc_close_blob(statusVector, &hBlob);
1395 char* _buf = (
char*)malloc(nMaxSegment);
1399 isc_close_blob(statusVector, &hBlob);
1404 size_t nRemain = *_size;
1405 unsigned short nActualRead = 0;
1406 unsigned short nRead = 0;
1409 nRead =
__MIN(nRemain, nMaxSegment);
1411 rs = isc_get_segment(
1420 _output->write(_buf, nActualRead);
1427 isc_close_blob(statusVector, &hBlob);
1430 nRemain -= nActualRead;
1440 if (statusVector[0] && statusVector[1] && (statusVector[1] != isc_segstr_eof)) {
1442 isc_close_blob(statusVector, &hBlob);
1449 if (isc_close_blob(statusVector, &hBlob)) {
#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)
#define __SET_ERROR_MSG(_message)
const wchar_t * __dataTypeName(const ifx_sqlvar_t *_sqlvar)
#define __SQLTYPE_IS(_sqltype)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
#define __SET_ERROR(_errorCode)
void CharsetConvertException *size_t n
String toStringAll() const
isc_tr_handle * trHandlePtr()
ISC_STATUS * statusVector()
isc_db_handle * dbHandlePtr()
virtual bool __getDataSize(size_t *_size, bool _maxSize)
bool getBlobInfo(isc_blob_handle *_blobHandle, char _blob_info_item, size_t *_buf)
bool getInteger(void *_buf, size_t *_size)
virtual bool __getData(void *_buf, size_t *_size, SQL::DataType _dataType)
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 isNull() const
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)
static ByteString toByteString(int32_t _n, unsigned _base=10)
static ByteString toByteString(int64_t _n, unsigned _base=10)
size_t __MIN(size_t x, size_t y)