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;
381 if (*_psize < __bind->length_value) {
385 if (__bind->buffer_length) {
387 memcpy(_pv, __bind->buffer, __bind->length_value);
391 __bind->buffer_length, __bind->length_value);
393 memset(&bind, 0,
sizeof(bind));
395 bind.buffer_length = *_psize;
396 if (mysql_stmt_fetch_column(
query()->stmt(), &bind, __index, 0)) {
398 mysql_stmt_errno(
query()->stmt()),
399 mysql_stmt_error(
query()->stmt())));
403 if (*_psize > __bind->length_value)
404 *((
char*)_pv + __bind->length_value) =
'\0';
405 *_psize = __bind->length_value;
423 if (__bind->length_value < *_psize) {
424 *_psize = __bind->length_value;
429 memset(&bind, 0,
sizeof(bind));
431 bind.length = &bind.length_value;
432 unsigned long total = 0;
433 while (total < *_psize) {
434 bind.buffer_length =
__MIN(
sizeof(
buf), *_psize - total);
435 if (mysql_stmt_fetch_column(
query()->stmt(),
436 &bind, __index, total)) {
438 mysql_stmt_errno(
query()->stmt()),
439 mysql_stmt_error(
query()->stmt())));
442 ((
OutputStream*)_pv)->write(bind.buffer, bind.buffer_length);
443 total += bind.buffer_length;
445 bind.buffer_length, bind.length_value);
466 switch (__field->type) {
467 case MYSQL_TYPE_TINY: {
469 case sizeof(int8_t) : {
470 *(int8_t*)_pv = *(int8_t*)__bind->buffer;
473 case sizeof(int16_t) : {
474 *(int16_t*)_pv = *(int8_t*)__bind->buffer;
477 case sizeof(int32_t) : {
478 *(int32_t*)_pv = *(int8_t*)__bind->buffer;
481 case sizeof(int64_t) : {
482 *(int64_t*)_pv = *(int8_t*)__bind->buffer;
486 *_psize =
sizeof(int8_t);
493 case MYSQL_TYPE_YEAR :
494 case MYSQL_TYPE_SHORT : {
496 case sizeof(int16_t) : {
497 *(int16_t*)_pv = *(int16_t*)__bind->buffer;
500 case sizeof(int32_t) : {
501 *(int32_t*)_pv = *(int16_t*)__bind->buffer;
504 case sizeof(int64_t) : {
505 *(int64_t*)_pv = *(int16_t*)__bind->buffer;
509 *_psize =
sizeof(int16_t);
516 case MYSQL_TYPE_INT24 :
517 case MYSQL_TYPE_LONG : {
519 case sizeof(int32_t) : {
520 *(int32_t*)_pv = *(int32_t*)__bind->buffer;
523 case sizeof(int64_t) : {
524 *(int64_t*)_pv = *(int32_t*)__bind->buffer;
528 *_psize =
sizeof(int32_t);
535 case MYSQL_TYPE_LONGLONG : {
537 case sizeof(int64_t) : {
538 *(int64_t*)_pv = *(int64_t*)__bind->buffer;
542 *_psize =
sizeof(int64_t);
549 case MYSQL_TYPE_DECIMAL:
550 case MYSQL_TYPE_NEWDECIMAL: {
553 if ((Field::__precision - Field::__scale) < 20) {
554 n = strtoll((
char*)__bind->buffer, &endptr, 10);
555 if (
n == LLONG_MAX ||
n == LLONG_MIN) {
562 double d = strtod((
char*)__bind->buffer, &endptr);
563 if (+HUGE_VAL == d || -HUGE_VAL == d || !(DBL_MIN < d)) {
571 if (i < LLONG_MIN || LLONG_MAX < i) {
579 case sizeof(int8_t) : {
584 *(int8_t*)_pv = (int8_t)
n;
587 case sizeof(int16_t) : {
592 *(int16_t*)_pv = (int16_t)
n;
595 case sizeof(int32_t) : {
600 *(int32_t*)_pv = (int32_t)
n;
603 case sizeof(int64_t) : {
604 *(int64_t*)_pv = (int64_t)
n;
608 *_psize =
sizeof(int64_t);
627 switch (__field->type) {
628 case MYSQL_TYPE_TINY : {
630 case sizeof(uint8_t) : {
631 *(uint8_t*)_pv = *(uint8_t*)__bind->buffer;
634 case sizeof(uint16_t) : {
635 *(uint16_t*)_pv = *(uint8_t*)__bind->buffer;
638 case sizeof(uint32_t) : {
639 *(uint32_t*)_pv = *(uint8_t*)__bind->buffer;
642 case sizeof(uint64_t) : {
643 *(uint64_t*)_pv = *(uint8_t*)__bind->buffer;
647 *_psize =
sizeof(uint8_t);
654 case MYSQL_TYPE_YEAR :
655 case MYSQL_TYPE_SHORT: {
657 case sizeof(uint16_t) : {
658 *(uint16_t*)_pv = *(uint16_t*)__bind->buffer;
661 case sizeof(uint32_t) : {
662 *(uint32_t*)_pv = *(uint16_t*)__bind->buffer;
665 case sizeof(uint64_t) : {
666 *(uint64_t*)_pv = *(uint16_t*)__bind->buffer;
670 *_psize =
sizeof(uint16_t);
677 case MYSQL_TYPE_INT24:
678 case MYSQL_TYPE_LONG: {
680 case sizeof(uint32_t) : {
681 *(uint32_t*)_pv = *(uint32_t*)__bind->buffer;
684 case sizeof(uint64_t) : {
685 *(uint64_t*)_pv = *(uint32_t*)__bind->buffer;
689 *_psize =
sizeof(uint32_t);
696 case MYSQL_TYPE_LONGLONG: {
698 case sizeof(uint64_t) : {
699 *(uint64_t*)_pv = *(uint64_t*)__bind->buffer;
703 *_psize =
sizeof(uint32_t);
710 case MYSQL_TYPE_DECIMAL :
711 case MYSQL_TYPE_NEWDECIMAL : {
713 unsigned long long u;
714 if ((Field::__precision - Field::__scale) < 20) {
715 u = strtoull((
char*)__bind->buffer, &endptr, 10);
716 if (u == ULONG_MAX) {
723 double d = strtod((
char*)__bind->buffer, &endptr);
724 if (+HUGE_VAL == d || -HUGE_VAL == d || !(DBL_MIN < d)) {
732 if (i < 0 || ULONG_MAX < i) {
736 u = (
unsigned long long)i;
740 case sizeof(uint8_t): {
745 *(uint8_t*)_pv = (uint8_t)u;
748 case sizeof(uint16_t): {
753 *(uint16_t*)_pv = (uint16_t)u;
756 case sizeof(uint32_t): {
761 *(uint32_t*)_pv = (uint32_t)u;
764 case sizeof(uint64_t): {
765 *(uint64_t*)_pv = (uint64_t)u;
769 *_psize =
sizeof(uint64_t);