70 unsigned int _index, MYSQL_FIELD* _field, MYSQL_BIND* _bind)
74 Field::__queryHandle = _queryHandle;
80 Field::__name = UTF8Decoder::decode(_field->name).toUpperCase();
89 _field->length, _field->decimals,
__name.data());
91 switch(_field->type) {
92 case MYSQL_TYPE_TINY: {
93 if (_field->flags & UNSIGNED_FLAG) {
94 Field::__precision = _field->length;
98 Field::__precision = _field->length - 1;
101 __maxsize =
sizeof(int8_t);
104 case MYSQL_TYPE_YEAR:
105 case MYSQL_TYPE_SHORT: {
106 if (_field->flags & UNSIGNED_FLAG) {
107 Field::__precision = _field->length;
111 Field::__precision = _field->length - 1;
114 __maxsize =
sizeof(int16_t);
117 case MYSQL_TYPE_INT24:
118 case MYSQL_TYPE_LONG: {
119 if (_field->flags & UNSIGNED_FLAG) {
120 Field::__precision = _field->length;
124 Field::__precision = _field->length - 1;
127 __maxsize =
sizeof(int32_t);
130 case MYSQL_TYPE_LONGLONG: {
131 if (_field->flags & UNSIGNED_FLAG) {
132 Field::__precision = _field->length;
136 Field::__precision = _field->length - 1;
139 __maxsize =
sizeof(int64_t);
142 case MYSQL_TYPE_FLOAT: {
144 __maxsize =
sizeof(float);
147 case MYSQL_TYPE_DOUBLE: {
149 __maxsize =
sizeof(double);
152 case MYSQL_TYPE_NULL: {
157 case MYSQL_TYPE_TIMESTAMP:
158 case MYSQL_TYPE_DATETIME:
159 case MYSQL_TYPE_TIMESTAMP2:
160 case MYSQL_TYPE_DATETIME2: {
161 Field::__precision = _field->length;
162 Field::__scale = _field->decimals;
167 case MYSQL_TYPE_DATE:
168 case MYSQL_TYPE_NEWDATE : {
169 Field::__precision = _field->length;
170 Field::__scale = _field->decimals;
175 case MYSQL_TYPE_TIME:
176 case MYSQL_TYPE_TIME2: {
177 Field::__precision = _field->length;
178 Field::__scale = _field->decimals;
183 case MYSQL_TYPE_DECIMAL:
184 case MYSQL_TYPE_NEWDECIMAL: {
185 Field::__precision = _field->length - (_field->decimals == 0 ? 1 : 2);
186 Field::__scale = _field->decimals;
188 __maxsize = _field->length;
191 case MYSQL_TYPE_BIT: {
192 Field::__scale = _field->length;
194 __maxsize =
sizeof(int64_t);
197 case MYSQL_TYPE_JSON:
198 case MYSQL_TYPE_ENUM:
200 case MYSQL_TYPE_VAR_STRING:
201 case MYSQL_TYPE_STRING:
202 case MYSQL_TYPE_GEOMETRY: {
203 Field::__dataType = _field->flags & BINARY_FLAG ?
205 __maxsize = _field->length;
208 case MYSQL_TYPE_TINY_BLOB :
209 case MYSQL_TYPE_BLOB :
210 case MYSQL_TYPE_MEDIUM_BLOB :
211 case MYSQL_TYPE_LONG_BLOB: {
212 if (_field->flags & BINARY_FLAG) {
213 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
217 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
220 __maxsize = _field->length;
384 if (*_size < __bind->length_value) {
388 if (__bind->buffer_length) {
390 memcpy(_buf, __bind->buffer, __bind->length_value);
394 __bind->buffer_length, __bind->length_value);
396 memset(&bind, 0,
sizeof(bind));
398 bind.buffer_length = *_size;
399 if (mysql_stmt_fetch_column(
query()->stmtHandle(), &bind, __index, 0)) {
401 mysql_stmt_errno(
query()->stmtHandle()),
402 mysql_stmt_error(
query()->stmtHandle()))
407 if (*_size > __bind->length_value)
408 *((
char*)_buf + __bind->length_value) =
'\0';
409 *_size = __bind->length_value;
427 if (__bind->length_value < *_size) {
428 *_size = __bind->length_value;
433 memset(&bind, 0,
sizeof(bind));
435 bind.length = &bind.length_value;
436 unsigned long total = 0;
437 while (total < *_size) {
438 bind.buffer_length =
__MIN(
sizeof(buf), *_size - total);
439 if (mysql_stmt_fetch_column(
query()->stmtHandle(),
440 &bind, __index, total
443 mysql_stmt_errno(
query()->stmtHandle()),
444 mysql_stmt_error(
query()->stmtHandle()))
448 ((
OutputStream*)_buf)->write(bind.buffer, bind.buffer_length);
449 total += bind.buffer_length;
451 bind.buffer_length, bind.length_value);
472 switch (__field->type) {
473 case MYSQL_TYPE_TINY: {
475 case sizeof(int8_t) : {
476 *(int8_t*)_buf = *(int8_t*)__bind->buffer;
479 case sizeof(int16_t) : {
480 *(int16_t*)_buf = *(int8_t*)__bind->buffer;
483 case sizeof(int32_t) : {
484 *(int32_t*)_buf = *(int8_t*)__bind->buffer;
487 case sizeof(int64_t) : {
488 *(int64_t*)_buf = *(int8_t*)__bind->buffer;
492 *_size =
sizeof(int8_t);
499 case MYSQL_TYPE_YEAR :
500 case MYSQL_TYPE_SHORT : {
502 case sizeof(int16_t) : {
503 *(int16_t*)_buf = *(int16_t*)__bind->buffer;
506 case sizeof(int32_t) : {
507 *(int32_t*)_buf = *(int16_t*)__bind->buffer;
510 case sizeof(int64_t) : {
511 *(int64_t*)_buf = *(int16_t*)__bind->buffer;
515 *_size =
sizeof(int16_t);
522 case MYSQL_TYPE_INT24 :
523 case MYSQL_TYPE_LONG : {
525 case sizeof(int32_t) : {
526 *(int32_t*)_buf = *(int32_t*)__bind->buffer;
529 case sizeof(int64_t) : {
530 *(int64_t*)_buf = *(int32_t*)__bind->buffer;
534 *_size =
sizeof(int32_t);
541 case MYSQL_TYPE_LONGLONG : {
543 case sizeof(int64_t) : {
544 *(int64_t*)_buf = *(int64_t*)__bind->buffer;
548 *_size =
sizeof(int64_t);
555 case MYSQL_TYPE_DECIMAL:
556 case MYSQL_TYPE_NEWDECIMAL: {
560 if ((Field::__precision - Field::__scale) < 20) {
561 n = strtoll((
char*)__bind->buffer, &endptr, 10);
562 if (errno == ERANGE) {
564 n == LLONG_MAX || n == LLONG_MIN
572 else if (errno == EINVAL) {
580 double d = strtod((
char*)__bind->buffer, &endptr);
581 if (errno == ERANGE) {
583 +HUGE_VAL == d || -HUGE_VAL == d
591 else if (errno == EINVAL) {
599 if (i < (
double)LLONG_MIN || (
double)LLONG_MAX < i) {
607 case sizeof(int8_t) : {
612 *(int8_t*)_buf = (int8_t)n;
615 case sizeof(int16_t) : {
620 *(int16_t*)_buf = (int16_t)n;
623 case sizeof(int32_t) : {
628 *(int32_t*)_buf = (int32_t)n;
631 case sizeof(int64_t) : {
632 *(int64_t*)_buf = (int64_t)n;
636 *_size =
sizeof(int64_t);
655 switch (__field->type) {
656 case MYSQL_TYPE_TINY : {
658 case sizeof(uint8_t) : {
659 *(uint8_t*)_buf = *(uint8_t*)__bind->buffer;
662 case sizeof(uint16_t) : {
663 *(uint16_t*)_buf = *(uint8_t*)__bind->buffer;
666 case sizeof(uint32_t) : {
667 *(uint32_t*)_buf = *(uint8_t*)__bind->buffer;
670 case sizeof(uint64_t) : {
671 *(uint64_t*)_buf = *(uint8_t*)__bind->buffer;
675 *_size =
sizeof(uint8_t);
682 case MYSQL_TYPE_YEAR :
683 case MYSQL_TYPE_SHORT: {
685 case sizeof(uint16_t) : {
686 *(uint16_t*)_buf = *(uint16_t*)__bind->buffer;
689 case sizeof(uint32_t) : {
690 *(uint32_t*)_buf = *(uint16_t*)__bind->buffer;
693 case sizeof(uint64_t) : {
694 *(uint64_t*)_buf = *(uint16_t*)__bind->buffer;
698 *_size =
sizeof(uint16_t);
705 case MYSQL_TYPE_INT24:
706 case MYSQL_TYPE_LONG: {
708 case sizeof(uint32_t) : {
709 *(uint32_t*)_buf = *(uint32_t*)__bind->buffer;
712 case sizeof(uint64_t) : {
713 *(uint64_t*)_buf = *(uint32_t*)__bind->buffer;
717 *_size =
sizeof(uint32_t);
724 case MYSQL_TYPE_LONGLONG: {
726 case sizeof(uint64_t) : {
727 *(uint64_t*)_buf = *(uint64_t*)__bind->buffer;
731 *_size =
sizeof(uint32_t);
738 case MYSQL_TYPE_DECIMAL :
739 case MYSQL_TYPE_NEWDECIMAL : {
742 unsigned long long u;
743 if ((Field::__precision - Field::__scale) <= 20) {
744 u = strtoull((
char*)__bind->buffer, &endptr, 10);
745 if (errno == ERANGE) {
754 else if (errno == EINVAL) {
762 double d = strtod((
char*)__bind->buffer, &endptr);
763 if (errno == ERANGE) {
765 +HUGE_VAL == d || -HUGE_VAL == d
773 else if (errno == EINVAL) {
781 if (i < 0 || (
double)ULONG_MAX < i) {
785 u = (
unsigned long long)i;
789 case sizeof(uint8_t): {
794 *(uint8_t*)_buf = (uint8_t)u;
797 case sizeof(uint16_t): {
802 *(uint16_t*)_buf = (uint16_t)u;
805 case sizeof(uint32_t): {
810 *(uint32_t*)_buf = (uint32_t)u;
813 case sizeof(uint64_t): {
814 *(uint64_t*)_buf = (uint64_t)u;
818 *_size =
sizeof(uint64_t);