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: {
135 __maxDataSize = __sqlvar->sqllen;
140 __maxDataSize = __sqlvar->sqllen;
144 if (__sqlvar->sqlsubtype == isc_blob_text)
148 __maxDataSize = 64 * 1024;
160 if (__indicator == -1)
170 isc_blob_handle hBlob =
NULL;
171 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
185 bool b =
getBlobInfo(&hBlob, isc_info_blob_total_length, &__dataSize);
187 isc_close_blob(status2, &hBlob);
197#define SQLTYPE_NAME(_dataType, name) case _dataType : return L ## name
201 switch(_sqlvar->sqltype & ~1) {
205 if (_sqlvar->sqlscale) {
207 switch (_sqlvar->sqltype & ~1) {
217 switch (_sqlvar->sqltype & ~1) {
232 if (_sqlvar->sqlsubtype == 1)
233 return L
"BLOB(TEXT)";
238 return L
"Unknown Type: Driver is not Support";
251 if (
query()->stmtType() == isc_info_sql_stmt_select) {
256 return __indicator == -1;
262 *_size = __maxDataSize;
266 if (
query()->stmtType() == isc_info_sql_stmt_select) {
275 switch(Field::__dataType) {
278 *_size = __sqlvar->sqllen;
282 *_size = *(
short*)(__sqlvar->sqldata);
294 *_size = __maxDataSize;
307 if (
query()->stmtType() == isc_info_sql_stmt_select) {
339static int32_t __divider32 [] =
353static int64_t __divider64 [] =
372 10000000000000000I64,
373 100000000000000000I64,
374 1000000000000000000I64
393 100000000000000000LL,
394 1000000000000000000LL
407 if (__sqlvar->sqlscale == 0) {
409 switch(__sqlvar->sqltype & ~1) {
412 case sizeof(int16_t) : {
414 *(int16_t*)(__sqlvar->sqldata);
417 case sizeof(int32_t) : {
420 *(int16_t*)(__sqlvar->sqldata)
424 case sizeof(int64_t) : {
427 *(int16_t*)(__sqlvar->sqldata)
432 *_size =
sizeof(int16_t);
441 case sizeof(int32_t) : {
443 *(int32_t*)(__sqlvar->sqldata);
446 case sizeof(int64_t) : {
449 *(int32_t*)(__sqlvar->sqldata)
454 *_size =
sizeof(int32_t);
463 case sizeof(int64_t) : {
465 *(int64_t*)(__sqlvar->sqldata);
469 *_size =
sizeof(int64_t);
484 switch(__sqlvar->sqltype & ~1) {
487 (*(int16_t*)(__sqlvar->sqldata))
488 / __divider32[-(__sqlvar->sqlscale)]
491 case sizeof(int8_t) : {
496 *(int8_t*)_pv = (int8_t)
n.i16;
499 case sizeof(int16_t) : {
500 *(int16_t*)_pv =
n.i16;
503 case sizeof(int32_t) : {
504 *(int32_t*)_pv = (int32_t)
n.i16;
507 case sizeof(int64_t) : {
508 *(int64_t*)_pv = (int64_t)
n.i16;
512 *_size =
sizeof(int16_t);
521 (*(int32_t*)(__sqlvar->sqldata))
522 / __divider32[-(__sqlvar->sqlscale)]
525 case sizeof(int8_t) : {
530 *(int8_t*)_pv = (int8_t)
n.i32;
533 case sizeof(int16_t) : {
538 *(int16_t*)_pv = (int16_t)
n.i32;
541 case sizeof(int32_t) : {
542 *(int32_t*)_pv =
n.i32;
545 case sizeof(int64_t) : {
546 *(int64_t*)_pv = (int64_t)
n.i32;
550 *_size =
sizeof(int32_t);
558 n.i64 = *(int64_t*)(__sqlvar->sqldata)
559 / __divider64[-(__sqlvar->sqlscale)];
561 case sizeof(int8_t) : {
566 *(int8_t*)_pv = (int8_t)
n.i64;
569 case sizeof(int16_t) : {
574 *(int16_t*)_pv = (int16_t)
n.i64;
577 case sizeof(int32_t) : {
582 *(int32_t*)_pv = (int32_t)
n.i64;
585 case sizeof(int64_t) : {
586 *(int64_t*)_pv =
n.i64;
590 *_size =
sizeof(int64_t);
607 if (__sqlvar->sqlscale == 0) {
609 switch(__sqlvar->sqltype & ~1) {
612 case sizeof(uint16_t) : {
615 *(int16_t*)(__sqlvar->sqldata)
619 case sizeof(uint32_t) : {
622 *(int16_t*)(__sqlvar->sqldata)
626 case sizeof(uint64_t) : {
629 *(int16_t*)(__sqlvar->sqldata)
634 *_size =
sizeof(uint16_t);
643 case sizeof(uint32_t) : {
646 *(int32_t*)(__sqlvar->sqldata)
650 case sizeof(int64_t) : {
653 *(int32_t*)(__sqlvar->sqldata)
658 *_size =
sizeof(uint32_t);
667 case sizeof(uint64_t) : {
670 *(int64_t*)(__sqlvar->sqldata)
675 *_size =
sizeof(uint64_t);
690 switch(__sqlvar->sqltype & ~1) {
693 (*(int16_t*)(__sqlvar->sqldata))
694 / __divider32[-(__sqlvar->sqlscale)]
697 case sizeof(int8_t) : {
702 *(uint8_t*)_pv = (uint8_t)
n.i16;
705 case sizeof(int16_t) : {
706 *(uint16_t*)_pv = (uint16_t)
n.i16;
709 case sizeof(int32_t) : {
710 *(uint32_t*)_pv = (uint32_t)
n.i16;
713 case sizeof(int64_t) : {
714 *(uint64_t*)_pv = (uint64_t)
n.i16;
718 *_size =
sizeof(uint16_t);
727 (*(int32_t*)(__sqlvar->sqldata))
728 / __divider32[-(__sqlvar->sqlscale)]
731 case sizeof(int8_t) : {
736 *(uint8_t*)_pv = (uint8_t)
n.i32;
739 case sizeof(int16_t) : {
744 *(uint16_t*)_pv = (uint16_t)
n.i32;
747 case sizeof(int32_t) : {
748 *(uint32_t*)_pv = (uint32_t)
n.i32;
751 case sizeof(int64_t) : {
752 *(uint64_t*)_pv = (uint64_t)
n.i32;
756 *_size =
sizeof(uint32_t);
764 n.i64 = *(int64_t*)(__sqlvar->sqldata)
765 / __divider64[-(__sqlvar->sqlscale)];
767 case sizeof(int8_t) : {
772 *(uint8_t*)_pv = (uint8_t)
n.i64;
775 case sizeof(int16_t) : {
780 *(uint16_t*)_pv = (uint16_t)
n.i64;
783 case sizeof(int32_t) : {
788 *(uint32_t*)_pv = (uint32_t)
n.i64;
791 case sizeof(int64_t) : {
792 *(uint64_t*)_pv = (uint64_t)
n.i64;
796 *_size =
sizeof(int64_t);
813 switch(__sqlvar->sqltype & ~1) {
816 case sizeof(float) : {
818 *(
float*)(__sqlvar->sqldata);
821 case sizeof(double) : {
824 *(
float*)(__sqlvar->sqldata)
829 *_size =
sizeof(float);
838 case sizeof(double) : {
840 *(
double*)(__sqlvar->sqldata);
844 *_size =
sizeof(double);
855 case sizeof(float) : {
857 (
float)(*(int16_t*)(__sqlvar->sqldata))
858 / (float)__divider32[-(__sqlvar->sqlscale)];
861 case sizeof(double) : {
863 (
double)(*(int16_t*)(__sqlvar->sqldata))
864 / (double)__divider32[-(__sqlvar->sqlscale)];
868 *_size =
sizeof(float);
879 case sizeof(float) : {
881 (
float)(*(int32_t*)(__sqlvar->sqldata))
882 / (float)__divider32[-(__sqlvar->sqlscale)];
885 case sizeof(double) : {
887 (
double)(*(int32_t*)(__sqlvar->sqldata))
888 / (double)__divider32[-(__sqlvar->sqlscale)];
892 *_size =
sizeof(double);
903 case sizeof(float) : {
905 (
float)(*(int64_t*)(__sqlvar->sqldata))
906 / (float)__divider32[-(__sqlvar->sqlscale)];
909 case sizeof(double) : {
911 (
double)(*(int64_t*)(__sqlvar->sqldata))
912 / (double)__divider64[-(__sqlvar->sqlscale)];
916 *_size =
sizeof(double);
938 switch(__sqlvar->sqltype & ~1) {
939 case SQL_TYPE_DATE: {
940 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
943 case SQL_TIMESTAMP: {
944 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
952 p->
nYear = tm.tm_year + 1900;
953 p->
nMonth = tm.tm_mon + 1;
954 p->
nDay = tm.tm_mday;
967 switch(__sqlvar->sqltype & ~1) {
968 case SQL_TYPE_TIME: {
969 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
970 t = *(ISC_TIME*)(__sqlvar->sqldata);
973 case SQL_TIMESTAMP: {
974 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
975 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
983 p->
nHour = tm.tm_hour;
987 p->
nFrac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1000 switch(__sqlvar->sqltype & ~1) {
1001 case SQL_TYPE_DATE : {
1002 isc_decode_sql_date((ISC_DATE*)(__sqlvar->sqldata), &tm);
1005 case SQL_TYPE_TIME: {
1006 isc_decode_sql_time((ISC_TIME*)(__sqlvar->sqldata), &tm);
1007 t = *(ISC_TIME*)(__sqlvar->sqldata);
1010 case SQL_TIMESTAMP: {
1011 isc_decode_timestamp((ISC_TIMESTAMP*)(__sqlvar->sqldata), &tm);
1012 t = ((ISC_TIMESTAMP*)(__sqlvar->sqldata))->timestamp_time;
1020 p->
nYear = tm.tm_year + 1900;
1021 p->
nMonth = tm.tm_mon + 1;
1022 p->
nDay = tm.tm_mday;
1023 p->
nHour = tm.tm_hour;
1024 p->
nMin = tm.tm_min;
1025 p->
nSec = tm.tm_sec;
1026 p->
nFrac = (t % ISC_TIME_SECONDS_PRECISION) * 100000;
1032 return n < 0 ? -
n :
n;
1035static ByteString __GetDecimalString(
void* _pv,
short sqltype,
short sqlscale)
1038 switch(sqltype & ~1) {
1056 ByteStringBuilder strNumber;
1057 if (str.length() > 0) {
1058 if (str[(
size_t)0] ==
'-') {
1064 int padLen = str.length() + sqlscale - 1;
1066 ByteString pad(
'0',
__ABS(padLen));
1076 strNumber.insert(strNumber.length() + sqlscale,
'.');
1078 size_t len = strNumber.length();
1079 for(;
len > 1 && strNumber[
len - 1] ==
'0';
len--) {
1080 if (strNumber[
len - 2] ==
'.')
1084 if (
len < strNumber.length()) {
1085 strNumber = strNumber.toByteString().left(
len);
1099 ByteString
r = __GetDecimalString(
1104 if (*_size < (
size_t)
r.length()) {
1111 strncpy(p,
r.data(),
r.length());
1112 if (*_size > (
size_t)
r.length()) {
1113 *_size = (size_t)
r.length();
1123 char* pSrc = (
char*)(__sqlvar->sqldata);
1124 size_t nCopy = (size_t)(__sqlvar->sqllen);
1126 pSrc +=
sizeof(short);
1127 nCopy = (size_t)(*(
short*)pSrc);
1134 memcpy(p, pSrc, nCopy);
1136 *(p + nCopy) =
'\0';
1154 char* pSrc = (
char*)(__sqlvar->sqldata);
1155 size_t nCopy = (size_t)(__sqlvar->sqllen);
1157 pSrc +=
sizeof(short);
1158 nCopy = (size_t)(*(
short*)pSrc);
1166 p->write(pSrc, nCopy);
1198 char res_buffer[10];
1202 sizeof(blob_info_item),
1213 char* p = res_buffer;
1216 unsigned short length = (
unsigned short)isc_vax_integer(p, 2);
1218 *pn = isc_vax_integer(p, length);
1225 return x < y ? x : y;
1232 isc_blob_handle hBlob =
NULL;
1233 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1247 size_t nMaxSegment = 0;
1248 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1250 isc_close_blob(statusVector, &hBlob);
1256 size_t nRemain = *_size;
1257 unsigned short nRead = 0;
1258 unsigned short nActualRead = 0;
1259 char* pch = (
char*)_pbuf;
1262 nRead =
__MIN(nRemain, nMaxSegment);
1263 rs = isc_get_segment(
1279 nRemain -= nActualRead;
1283 if (statusVector[0] && statusVector[1] && (statusVector[1] != isc_segstr_eof)) {
1285 isc_close_blob(statusVector, &hBlob);
1292 if (isc_close_blob(statusVector, &hBlob)) {
1307 isc_blob_handle hBlob =
NULL;
1308 ISC_QUAD* pBlobID = (ISC_QUAD*)(__sqlvar->sqldata);
1322 size_t nMaxSegment = 0;
1323 if(!
getBlobInfo(&hBlob, isc_info_blob_max_segment, &nMaxSegment)) {
1325 isc_close_blob(statusVector, &hBlob);
1331 char* _pbuf = (
char*)malloc(nMaxSegment);
1335 isc_close_blob(statusVector, &hBlob);
1340 size_t nRemain = *_size;
1341 unsigned short nActualRead = 0;
1342 unsigned short nRead = 0;
1345 nRead =
__MIN(nRemain, nMaxSegment);
1347 rs = isc_get_segment(
1356 pOutput->write(_pbuf, nActualRead);
1363 isc_close_blob(statusVector, &hBlob);
1366 nRemain -= nActualRead;
1376 if (statusVector[0] && statusVector[1] && (statusVector[1] != isc_segstr_eof)) {
1378 isc_close_blob(statusVector, &hBlob);
1385 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 writeToFromBlob(OutputStream *p, size_t *_size)
bool getDecimal(char *p, size_t *_size)
bool getBlobInfo(isc_blob_handle *phBlob, char blob_info_item, size_t *pn)
bool getTimeStamp(SQL::TimeStamp *p, size_t *_size)
bool getDate(SQL::Date *p, size_t *_size)
bool getTime(SQL::Time *p, size_t *_size)
virtual bool isNull() const
virtual bool __getData(void *_pv, size_t *_size, SQL::DataType _dataType)
bool getFloat(void *_pv, size_t *_size)
bool getUInteger(void *_pv, size_t *_size)
bool init(SQL::Query *_query, XSQLVAR *_sqlvar)
bool getBytesFromBlob(byte_t *p, size_t *_size)
bool getBytes(byte_t *p, size_t *_size)
bool getInteger(void *_pv, size_t *_size)
virtual const wchar_t * serverDataTypeName() const
bool writeTo(OutputStream *p, 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)