71{
73
74 Field::__queryHandle = _queryHandle;
75 __index = _index;
76 __field = _field;
77 __bind = _bind;
78
79 try {
80 Field::__name = UTF8Decoder::decode(_field->name).toUpperCase();
81 }
82 catch (CharsetConvertException* _e) {
85 return false;
86 }
87
89 _field->length, _field->decimals,
__name.data());
90
91 switch(_field->type) {
92 case MYSQL_TYPE_TINY: {
93 if (_field->flags & UNSIGNED_FLAG) {
94 Field::__precision = _field->length;
96 }
97 else {
98 Field::__precision = _field->length - 1;
100 }
101 __maxsize = sizeof(int8_t);
102 break;
103 }
104 case MYSQL_TYPE_YEAR:
105 case MYSQL_TYPE_SHORT: {
106 if (_field->flags & UNSIGNED_FLAG) {
107 Field::__precision = _field->length;
109 }
110 else {
111 Field::__precision = _field->length - 1;
113 }
114 __maxsize = sizeof(int16_t);
115 break;
116 }
117 case MYSQL_TYPE_INT24:
118 case MYSQL_TYPE_LONG: {
119 if (_field->flags & UNSIGNED_FLAG) {
120 Field::__precision = _field->length;
122 }
123 else {
124 Field::__precision = _field->length - 1;
126 }
127 __maxsize = sizeof(int32_t);
128 break;
129 }
130 case MYSQL_TYPE_LONGLONG: {
131 if (_field->flags & UNSIGNED_FLAG) {
132 Field::__precision = _field->length;
134 }
135 else {
136 Field::__precision = _field->length - 1;
138 }
139 __maxsize = sizeof(int64_t);
140 break;
141 }
142 case MYSQL_TYPE_FLOAT: {
144 __maxsize = sizeof(float);
145 break;
146 }
147 case MYSQL_TYPE_DOUBLE: {
149 __maxsize = sizeof(double);
150 break;
151 }
152 case MYSQL_TYPE_NULL: {
154 __maxsize = 0;
155 break;
156 }
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;
164 __maxsize = sizeof(SQL::TimeStamp);
165 break;
166 }
167 case MYSQL_TYPE_DATE:
168 case MYSQL_TYPE_NEWDATE : {
169 Field::__precision = _field->length;
170 Field::__scale = _field->decimals;
172 __maxsize = sizeof(SQL::Date);
173 break;
174 }
175 case MYSQL_TYPE_TIME:
176 case MYSQL_TYPE_TIME2: {
177 Field::__precision = _field->length;
178 Field::__scale = _field->decimals;
180 __maxsize = sizeof(SQL::Interval);
181 break;
182 }
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;
189 break;
190 }
191 case MYSQL_TYPE_BIT: {
192 Field::__scale = _field->length;
194 __maxsize = sizeof(int64_t);
195 break;
196 }
197 case MYSQL_TYPE_JSON:
198 case MYSQL_TYPE_ENUM:
199 case MYSQL_TYPE_SET:
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;
206 break;
207 }
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) ?
215 }
216 else {
217 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
219 }
220 __maxsize = _field->length;
221 break;
222 }
223 default: {
225 }
226 }
227
228 return true;
229}
#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)