61{
63
64 Field::__queryHandle = _queryHandle;
65 __index = _index;
66 __field = _field;
67 __bind = _bind;
68
69 try {
70 Field::__name = UTF8Decoder::decode(_field->name).toUpperCase();
71 }
72 catch (CharsetConvertException* _e) {
75 return false;
76 }
77
79 Field::__scale = _field->decimals;
80
81 enum enum_field_types _type = __field->type;
82 unsigned int _flags = __field->flags;
83
84 switch(_type) {
85 case MYSQL_TYPE_TINY: {
86 if (_flags & UNSIGNED_FLAG) {
87 Field::__precision = _field->length;
89 }
90 else {
91 Field::__precision = _field->length - 1;
93 }
94 __maxsize = sizeof(int8_t);
95 break;
96 }
97 case MYSQL_TYPE_YEAR:
98 case MYSQL_TYPE_SHORT: {
99 if (_flags & UNSIGNED_FLAG) {
100 Field::__precision = _field->length;
102 }
103 else {
104 Field::__precision = _field->length - 1;
106 }
107 __maxsize = sizeof(int16_t);
108 break;
109 }
110 case MYSQL_TYPE_INT24:
111 case MYSQL_TYPE_LONG: {
112 if (_flags & UNSIGNED_FLAG) {
113 Field::__precision = _field->length;
115 }
116 else {
117 Field::__precision = _field->length - 1;
119 }
120 __maxsize = sizeof(int32_t);
121 break;
122 }
123 case MYSQL_TYPE_LONGLONG: {
124 if (_flags & UNSIGNED_FLAG) {
125 Field::__precision = _field->length;
127 }
128 else {
129 Field::__precision = _field->length - 1;
131 }
132 __maxsize = sizeof(int64_t);
133 break;
134 }
135 case MYSQL_TYPE_FLOAT: {
136 Field::__precision = _field->length - 1;
138 __maxsize = sizeof(float);
139 break;
140 }
141 case MYSQL_TYPE_DOUBLE: {
142 Field::__precision = _field->length - 1;
144 __maxsize = sizeof(double);
145 break;
146 }
147 case MYSQL_TYPE_NULL: {
149 __maxsize = 0;
150 break;
151 }
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;
158 __maxsize = sizeof(SQL::TimeStamp);
159 break;
160 }
161 case MYSQL_TYPE_DATE:
162 case MYSQL_TYPE_NEWDATE : {
163 Field::__precision = _field->length;
165 __maxsize = sizeof(SQL::Date);
166 break;
167 }
168 case MYSQL_TYPE_TIME:
169 case MYSQL_TYPE_TIME2: {
170 Field::__precision = _field->length - 2;
172 __maxsize = sizeof(SQL::Interval);
173 break;
174 }
175 case MYSQL_TYPE_DECIMAL:
176 case MYSQL_TYPE_NEWDECIMAL: {
177 Field::__precision = _field->length - (_field->decimals == 0 ? 1 : 2);
179 __maxsize = _field->length;
180 break;
181 }
182 case MYSQL_TYPE_BIT: {
183 Field::__precision = _field->length;
185 __maxsize = sizeof(int64_t);
186 break;
187 }
188 case MYSQL_TYPE_JSON:
189 case MYSQL_TYPE_ENUM:
190 case MYSQL_TYPE_SET:
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;
197 break;
198 }
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) ?
206 }
207 else {
208 Field::__dataType = _field->length <= ((uint16_t)-1 * 3) ?
210 }
211 __maxsize = _field->length;
212 break;
213 }
214 default: {
216 }
217 }
218
219 return true;
220}