60 unsigned int _index, MYSQL_FIELD* _field, MYSQL_BIND* _bind)
64 Field::__queryHandle = _queryHandle;
70 Field::__name = UTF8Decoder::decode(_field->name).toUpperCase();
79 Field::__scale = _field->decimals;
81 enum enum_field_types _type = __field->type;
82 unsigned int _flags = __field->flags;
85 case MYSQL_TYPE_TINY: {
86 if (_flags & UNSIGNED_FLAG) {
87 Field::__precision = _field->length;
91 Field::__precision = _field->length - 1;
94 __maxsize =
sizeof(int8_t);
98 case MYSQL_TYPE_SHORT: {
99 if (_flags & UNSIGNED_FLAG) {
100 Field::__precision = _field->length;
104 Field::__precision = _field->length - 1;
107 __maxsize =
sizeof(int16_t);
110 case MYSQL_TYPE_INT24:
111 case MYSQL_TYPE_LONG: {
112 if (_flags & UNSIGNED_FLAG) {
113 Field::__precision = _field->length;
117 Field::__precision = _field->length - 1;
120 __maxsize =
sizeof(int32_t);
123 case MYSQL_TYPE_LONGLONG: {
124 if (_flags & UNSIGNED_FLAG) {
125 Field::__precision = _field->length;
129 Field::__precision = _field->length - 1;
132 __maxsize =
sizeof(int64_t);
135 case MYSQL_TYPE_FLOAT: {
136 Field::__precision = _field->length - 1;
138 __maxsize =
sizeof(float);
141 case MYSQL_TYPE_DOUBLE: {
142 Field::__precision = _field->length - 1;
144 __maxsize =
sizeof(double);
147 case MYSQL_TYPE_NULL: {
152 case MYSQL_TYPE_TIMESTAMP:
153 case MYSQL_TYPE_DATETIME:
154 case MYSQL_TYPE_TIMESTAMP2:
155 case MYSQL_TYPE_DATETIME2: {
156 Field::__precision = _field->length;
161 case MYSQL_TYPE_DATE:
162 case MYSQL_TYPE_NEWDATE : {
163 Field::__precision = _field->length;
168 case MYSQL_TYPE_TIME:
169 case MYSQL_TYPE_TIME2: {
170 Field::__precision = _field->length - 2;
175 case MYSQL_TYPE_DECIMAL:
176 case MYSQL_TYPE_NEWDECIMAL: {
177 Field::__precision = _field->length - (_field->decimals == 0 ? 1 : 2);
179 __maxsize = _field->length;
182 case MYSQL_TYPE_BIT: {
183 Field::__precision = _field->length;
185 __maxsize =
sizeof(int64_t);
188 case MYSQL_TYPE_JSON:
189 case MYSQL_TYPE_ENUM:
191 case MYSQL_TYPE_VAR_STRING:
192 case MYSQL_TYPE_STRING:
193 case MYSQL_TYPE_GEOMETRY: {
194 Field::__dataType = _flags & BINARY_FLAG ?
196 __maxsize = _field->length;
199 case MYSQL_TYPE_TINY_BLOB :
200 case MYSQL_TYPE_BLOB :
201 case MYSQL_TYPE_MEDIUM_BLOB :
202 case MYSQL_TYPE_LONG_BLOB: {
203 if (_flags & BINARY_FLAG) {
204 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
208 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
211 __maxsize = _field->length;
377 if (*_psize < __bind->length_value) {
381 if (__bind->buffer_length) {
383 memcpy(_pv, __bind->buffer, __bind->length_value);
387 __bind->buffer_length, __bind->length_value);
389 memset(&bind, 0,
sizeof(bind));
391 bind.buffer_length = *_psize;
392 if (mysql_stmt_fetch_column(
query()->stmt(), &bind, __index, 0)) {
394 mysql_stmt_errno(
query()->stmt()),
395 mysql_stmt_error(
query()->stmt())));
399 if (*_psize > __bind->length_value)
400 *((
char*)_pv + __bind->length_value) =
'\0';
401 *_psize = __bind->length_value;
419 if (__bind->length_value < *_psize) {
420 *_psize = __bind->length_value;
425 memset(&bind, 0,
sizeof(bind));
427 bind.length = &bind.length_value;
428 unsigned long total = 0;
429 while (total < *_psize) {
430 bind.buffer_length =
__MIN(
sizeof(
buf), *_psize - total);
431 if (mysql_stmt_fetch_column(
query()->stmt(),
432 &bind, __index, total)) {
434 mysql_stmt_errno(
query()->stmt()),
435 mysql_stmt_error(
query()->stmt())));
438 ((
OutputStream*)_pv)->write(bind.buffer, bind.buffer_length);
439 total += bind.buffer_length;
441 bind.buffer_length, bind.length_value);
462 switch (__field->type) {
463 case MYSQL_TYPE_TINY: {
465 case sizeof(int8_t) : {
466 *(int8_t*)_pv = *(int8_t*)__bind->buffer;
469 case sizeof(int16_t) : {
470 *(int16_t*)_pv = *(int8_t*)__bind->buffer;
473 case sizeof(int32_t) : {
474 *(int32_t*)_pv = *(int8_t*)__bind->buffer;
477 case sizeof(int64_t) : {
478 *(int64_t*)_pv = *(int8_t*)__bind->buffer;
482 *_psize =
sizeof(int8_t);
489 case MYSQL_TYPE_YEAR :
490 case MYSQL_TYPE_SHORT : {
492 case sizeof(int16_t) : {
493 *(int16_t*)_pv = *(int16_t*)__bind->buffer;
496 case sizeof(int32_t) : {
497 *(int32_t*)_pv = *(int16_t*)__bind->buffer;
500 case sizeof(int64_t) : {
501 *(int64_t*)_pv = *(int16_t*)__bind->buffer;
505 *_psize =
sizeof(int16_t);
512 case MYSQL_TYPE_INT24 :
513 case MYSQL_TYPE_LONG : {
515 case sizeof(int32_t) : {
516 *(int32_t*)_pv = *(int32_t*)__bind->buffer;
519 case sizeof(int64_t) : {
520 *(int64_t*)_pv = *(int32_t*)__bind->buffer;
524 *_psize =
sizeof(int32_t);
531 case MYSQL_TYPE_LONGLONG : {
533 case sizeof(int64_t) : {
534 *(int64_t*)_pv = *(int64_t*)__bind->buffer;
538 *_psize =
sizeof(int64_t);
545 case MYSQL_TYPE_DECIMAL:
546 case MYSQL_TYPE_NEWDECIMAL: {
549 if ((Field::__precision - Field::__scale) < 20) {
550 n = strtoll((
char*)__bind->buffer, &endptr, 10);
551 if (
n == LLONG_MAX ||
n == LLONG_MIN) {
558 double d = strtod((
char*)__bind->buffer, &endptr);
559 if (+HUGE_VAL == d || -HUGE_VAL == d || !(DBL_MIN < d)) {
567 if (i < LLONG_MIN || LLONG_MAX < i) {
575 case sizeof(int8_t) : {
580 *(int8_t*)_pv = (int8_t)
n;
583 case sizeof(int16_t) : {
588 *(int16_t*)_pv = (int16_t)
n;
591 case sizeof(int32_t) : {
596 *(int32_t*)_pv = (int32_t)
n;
599 case sizeof(int64_t) : {
600 *(int64_t*)_pv = (int64_t)
n;
604 *_psize =
sizeof(int64_t);
623 switch (__field->type) {
624 case MYSQL_TYPE_TINY : {
626 case sizeof(uint8_t) : {
627 *(uint8_t*)_pv = *(uint8_t*)__bind->buffer;
630 case sizeof(uint16_t) : {
631 *(uint16_t*)_pv = *(uint8_t*)__bind->buffer;
634 case sizeof(uint32_t) : {
635 *(uint32_t*)_pv = *(uint8_t*)__bind->buffer;
638 case sizeof(uint64_t) : {
639 *(uint64_t*)_pv = *(uint8_t*)__bind->buffer;
643 *_psize =
sizeof(uint8_t);
650 case MYSQL_TYPE_YEAR :
651 case MYSQL_TYPE_SHORT: {
653 case sizeof(uint16_t) : {
654 *(uint16_t*)_pv = *(uint16_t*)__bind->buffer;
657 case sizeof(uint32_t) : {
658 *(uint32_t*)_pv = *(uint16_t*)__bind->buffer;
661 case sizeof(uint64_t) : {
662 *(uint64_t*)_pv = *(uint16_t*)__bind->buffer;
666 *_psize =
sizeof(uint16_t);
673 case MYSQL_TYPE_INT24:
674 case MYSQL_TYPE_LONG: {
676 case sizeof(uint32_t) : {
677 *(uint32_t*)_pv = *(uint32_t*)__bind->buffer;
680 case sizeof(uint64_t) : {
681 *(uint64_t*)_pv = *(uint32_t*)__bind->buffer;
685 *_psize =
sizeof(uint32_t);
692 case MYSQL_TYPE_LONGLONG: {
694 case sizeof(uint64_t) : {
695 *(uint64_t*)_pv = *(uint64_t*)__bind->buffer;
699 *_psize =
sizeof(uint32_t);
706 case MYSQL_TYPE_DECIMAL :
707 case MYSQL_TYPE_NEWDECIMAL : {
709 unsigned long long u;
710 if ((Field::__precision - Field::__scale) < 20) {
711 u = strtoull((
char*)__bind->buffer, &endptr, 10);
712 if (u == ULONG_MAX) {
719 double d = strtod((
char*)__bind->buffer, &endptr);
720 if (+HUGE_VAL == d || -HUGE_VAL == d || !(DBL_MIN < d)) {
728 if (i < 0 || ULONG_MAX < i) {
732 u = (
unsigned long long)i;
736 case sizeof(uint8_t): {
741 *(uint8_t*)_pv = (uint8_t)u;
744 case sizeof(uint16_t): {
749 *(uint16_t*)_pv = (uint16_t)u;
752 case sizeof(uint32_t): {
757 *(uint32_t*)_pv = (uint32_t)u;
760 case sizeof(uint64_t): {
761 *(uint64_t*)_pv = (uint64_t)u;
765 *_psize =
sizeof(uint64_t);