4#include <libkern/OSByteOrder.h>
14#include <catalog/pg_type_d.h>
17#if __DCL_HAVE_ALLOC_DEBUG
18#undef __DCL_ALLOC_LEVEL
19#define __DCL_ALLOC_LEVEL __DCL_ALLOC_INTERNAL
34#define __DCL_TRACE0_N __DCL_TRACE0
35#define __DCL_TRACE1_N __DCL_TRACE1
36#define __DCL_TRACE2_N __DCL_TRACE2
37#define __DCL_TRACE3_N __DCL_TRACE3
38#define __DCL_TRACE4_N __DCL_TRACE4
39#define __DCL_TRACE5_N __DCL_TRACE5
40#define __DCL_TRACE6_N __DCL_TRACE6
42#define __DCL_TRACE0_N(fmt)
43#define __DCL_TRACE1_N(fmt, arg)
44#define __DCL_TRACE2_N(fmt, arg1, arg2)
45#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
46#define __DCL_TRACE4_N(fmt, arg1, arg2, arg3, arg4)
47#define __DCL_TRACE5_N(fmt, arg1, arg2, arg3, arg4, arg5)
48#define __DCL_TRACE6_N(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
56#define __SET_ERROR(_error) \
57 connection()->setErrorStatus(_error, __THIS_FILE__, __LINE__)
58#define __SET_ERROR_MSG(_message) \
59 conn()->setErrorMessage(_message, __THIS_FILE__, __LINE__)
83 Field::__queryHandle = _queryHandle;
86 Field::__name = UTF8Decoder::decode(PQfname(_res, _index)).toUpperCase();
95 __type = PQftype(_res, _index);
96 __size = PQfsize(_res, _index);
97 __format = PQfformat(_res, _index);
98 int mod = PQfmod(_res, _index);
103 Field::__precision = 1;
108 Field::__precision = 5;
113 Field::__precision = 10;
118 Field::__precision = 19;
131 Field::__precision = 19;
137 Field::__precision = mod >> 16;
138 Field::__scale = (mod - 4) & 0xffff;
164 case TIMESTAMPTZOID: {
172 Field::__precision = mod >> 16;
173 Field::__scale = (mod - 4) & 0xffff;
188 __maxDataSize = mod - 4;
218 if (__maxDataSize == 0) {
219 __maxDataSize = __size >= 0 ?
220 __size : 10 * 1024 * 1024;
237 *_size = __maxDataSize;
243 if (
query()->getValue(__index, value, length)) {
279 return getBytes((
char*)_buf, _size);
294 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
303 n = (int16_t)
__ntohs(*(uint16_t*)value);
307 n = (int32_t)
__ntohl(*(uint32_t*)value);
311 n = (int64_t)
__ntohll(*(uint64_t*)value);
315 n = (int64_t)
__ntohf(*(uint32_t*)value);
319 n = (int64_t)
__ntohd(*(uint64_t*)value);
336 n = strchr(
"fF0", *value) ? 0 : 1;
344 n = strtoll(value, &endptr, 10);
345 if (errno == ERANGE) {
347 n == LLONG_MAX || n == LLONG_MIN
355 else if (errno == EINVAL) {
367 double d = strtod(value, &endptr);
368 if (errno == ERANGE) {
370 +HUGE_VAL == d || -HUGE_VAL == d
378 else if (errno == EINVAL) {
386 if (i < (
double)LLONG_MIN || (
double)LLONG_MAX < i) {
394 s.assign(value, length);
395 s = s.replace_r(
"[^0-9\\.]",
"",
false);
401 if ((Field::__precision - Field::__scale) < 20) {
402 n = strtoll(value, &endptr, 10);
403 if (errno == ERANGE) {
405 n == LLONG_MAX || n == LLONG_MIN
412 else if (errno == EINVAL) {
420 double d = strtod(value, &endptr);
421 if (errno == ERANGE) {
423 +HUGE_VAL == d || -HUGE_VAL == d
431 else if (errno == EINVAL) {
439 if (i < (
double)LLONG_MIN || (
double)LLONG_MAX < i) {
455 case sizeof(int8_t) : {
460 *(int8_t*)_buf = (int8_t)n;
463 case sizeof(int16_t) : {
468 *(int16_t*)_buf = (int16_t)n;
471 case sizeof(int32_t) : {
476 *(int32_t*)_buf = (int32_t)n;
479 case sizeof(int64_t) : {
480 *(int64_t*)_buf = (int64_t)n;
484 *_size =
sizeof(int64_t);
497 unsigned long long u;
500 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
505 u = *(uint8_t*)value;
509 u = (uint16_t)
__ntohs(*(uint16_t*)value);
513 u = (uint32_t)
__ntohl(*(uint32_t*)value);
517 u = (uint64_t)
__ntohll(*(uint64_t*)value);
521 u = (uint64_t)
__ntohf(*(uint32_t*)value);
525 u = (uint64_t)
__ntohd(*(uint64_t*)value);
542 u = strchr(
"fF0", *value) ? 0 : 1;
550 u = strtoull(value, &endptr, 10);
551 if (errno == ERANGE) {
560 else if (errno == EINVAL) {
572 double d = strtod(value, &endptr);
573 if (errno == ERANGE) {
575 +HUGE_VAL == d || -HUGE_VAL == d
583 else if (errno == EINVAL) {
591 if (i < (
double)LLONG_MIN || (
double)LLONG_MAX < i) {
595 u = (
unsigned long long)i;
599 s.assign(value, length);
600 s = s.replace_r(
"[^0-9\\.]",
"",
false);
606 if ((Field::__precision - Field::__scale) <= 20) {
607 u = strtoull(value, &endptr, 10);
608 if (errno == ERANGE) {
617 else if (errno == EINVAL) {
625 double d = strtod(value, &endptr);
626 if (errno == ERANGE) {
628 +HUGE_VAL == d || -HUGE_VAL == d
636 else if (errno == EINVAL) {
644 if (i < 0 || (
double)ULONG_MAX < i) {
648 u = (
unsigned long long)i;
660 case sizeof(uint8_t) : {
665 *(uint8_t*)_buf = (uint8_t)u;
668 case sizeof(uint16_t) : {
673 *(uint16_t*)_buf = (uint16_t)u;
676 case sizeof(uint32_t) : {
681 *(uint32_t*)_buf = (uint32_t)u;
684 case sizeof(uint64_t) : {
685 *(uint64_t*)_buf = (uint64_t)u;
689 *_size =
sizeof(uint64_t);
704 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
709 d = (double)*(int8_t*)value;
713 d = (double)(int16_t)
__ntohs(*(uint16_t*)value);
717 d = (double)(int32_t)
__ntohl(*(uint32_t*)value);
721 d = (double)(int64_t)
__ntohll(*(uint64_t*)value);
725 d = (double)
__ntohf(*(uint32_t*)value);
729 d = (double)
__ntohd(*(uint64_t*)value);
746 d = strchr(
"fF0", *value) ? 0 : 1;
754 long long n = strtoll(value, &endptr, 10);
755 if (errno == ERANGE) {
757 n == LLONG_MAX || n == LLONG_MIN
764 else if (errno == EINVAL) {
777 d = strtod(value, &endptr);
778 if (errno == ERANGE) {
780 +HUGE_VAL == d || -HUGE_VAL == d
788 else if (errno == EINVAL) {
797 s.assign(value, length);
798 s = s.replace_r(
"[^0-9\\.]",
"",
false);
804 d = strtod(value, &endptr);
805 if (errno == ERANGE) {
807 +HUGE_VAL == d || -HUGE_VAL == d
815 else if (errno == EINVAL) {
831 case sizeof(float) : {
832 if (d < -FLT_MAX || FLT_MAX < d) {
836 *(
float*)_buf = (
float)d;
839 case sizeof(double) : {
840 *(
double*)_buf = (
double)d;
844 *_size =
sizeof(double);
863 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
893 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
925 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
951 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
973 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
979 if ((
size_t)length < *_size) {
980 *(_buf + length) =
'\0';
983 memcpy(_buf, value, *_size);
993 __DCL_TRACE2_N(L
"[%d][%ls]\n", length, String::tryString(value, length).data());
997 const char* srcend = value + length;
998 char* dstend = _buf + *_size;
1004 size_t dstlen = dstend - _buf;
1005 __DCL_TRACE2_N(L
"unescaped [%zd][%ls]\n", dstlen, String::valueOf(
r).data());
1007 if (dstlen < *_size) {
1008 *(_buf + dstlen) =
'\0';
1013 if ((
size_t) length < *_size) {
1014 *(_buf + length) =
'\0';
1017 memcpy(_buf, value, *_size);
1033 const char* src = value;
1034 const char* srcend = value + length;
1035 while (src < srcend && total < *_size) {
1036 char* dstend = buf +
sizeof(buf);
1040 size_t dstlen = dstend - buf;
1041 __DCL_TRACE2_N(L
"unescaped [%zd][%ls]\n", dstlen, String::valueOf(
r).data());
1043 _output->write(buf, dstlen);
1049 srcend = value + length;
1059 if ((
size_t)length < *_size) {
1063 _output->write(value, *_size);
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __SET_ERROR_MSG(_message)
const wchar_t * __dataTypeName(const ifx_sqlvar_t *_sqlvar)
#define __DCL_TRACE6_N(fmt, arg1, arg2, arg3, arg4, arg5, arg6)
#define __DCL_VERIFY(expr)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
bool __unescape_hex(const char *_src, const char *&_srcend, char *_dst, char *&_dstend)
bool __unescape_oct(const char *_src, const char *&_srcend, char *_dst, char *&_dstend)
bool __decode_timestamp_iso(const char *_s, const char **_endptr, SQL::TimeStamp &_r)
bool __decode_interval_iso(const char *_s, const char **_endptr, SQL::Interval &_r)
bool __is_hex_escaped(const char *_src)
float __ntohf(uint32_t _x)
double __ntohd(uint64_t _x)
#define __SET_ERROR(_errorCode)
String toStringAll() const
bool init(SQL::Query *_query, int _index, const PGresult *_res)
bool getTimeStamp(SQL::TimeStamp *_buf, size_t *_size)
bool writeTo(OutputStream *_output, size_t *_size)
bool getNumeric(char *_buf, size_t *_size)
virtual bool __getDataSize(size_t *_size, bool _maxsize)
virtual bool __getData(void *_buf, size_t *_size, SQL::DataType _bufType)
bool getDate(SQL::Date *_buf, size_t *_size)
virtual const wchar_t * serverDataTypeName() const
bool getFloat(void *_buf, size_t *_size)
bool getInteger(void *_buf, size_t *_size)
bool getBytes(char *_buf, size_t *_size)
bool getUInteger(void *_buf, size_t *_size)
bool getInterval(SQL::Interval *_buf, size_t *_size)
bool getTime(SQL::Time *_buf, size_t *_size)