49 drizzle_field_t drizzle_field_read(drizzle_result_st *result,
size_t *offset,
50 size_t *size,
size_t *total,
51 drizzle_return_t *ret_ptr)
53 drizzle_return_t unused_ret;
61 *ret_ptr= DRIZZLE_RETURN_INVALID_ARGUMENT;
62 return drizzle_field_t();
67 if (result->field_current == result->column_count)
69 *ret_ptr= DRIZZLE_RETURN_ROW_END;
77 if (*ret_ptr == DRIZZLE_RETURN_OK and
78 result->options & DRIZZLE_RESULT_ROW_BREAK)
80 *ret_ptr= DRIZZLE_RETURN_ROW_BREAK;
85 *offset= result->field_offset;
90 *size= result->field_size;
95 *total= result->field_total;
101 drizzle_field_t drizzle_field_buffer(drizzle_result_st *result,
size_t *total,
102 drizzle_return_t *ret_ptr)
107 drizzle_return_t unused_ret;
110 ret_ptr= &unused_ret;
115 *ret_ptr= DRIZZLE_RETURN_INVALID_ARGUMENT;
116 return drizzle_field_t();
119 drizzle_field_t field= drizzle_field_read(result, &offset, &size, total, ret_ptr);
121 if (*ret_ptr != DRIZZLE_RETURN_OK)
132 if (result->field_buffer == NULL)
134 result->field_buffer= (drizzle_field_t)realloc(NULL, (*total) +1);
135 if (result->field_buffer == NULL)
138 *ret_ptr= DRIZZLE_RETURN_MEMORY;
143 memcpy(result->field_buffer + offset, field, size);
145 while ((offset + size) != (*total))
147 field= drizzle_field_read(result, &offset, &size, total, ret_ptr);
148 if (*ret_ptr != DRIZZLE_RETURN_OK)
153 memcpy(result->field_buffer + offset, field, size);
156 field= result->field_buffer;
157 result->field_buffer= NULL;
163 void drizzle_field_free(drizzle_field_t field)
175 drizzle_return_t drizzle_field_write(drizzle_result_st *result,
176 const drizzle_field_t field,
size_t size,
181 return DRIZZLE_RETURN_INVALID_ARGUMENT;
184 drizzle_return_t ret;
188 if (result->options & DRIZZLE_RESULT_ROW_BREAK)
190 result->options&= int(~DRIZZLE_RESULT_ROW_BREAK);
191 result->field= field;
192 result->field_size= size;
196 result->field= field;
197 result->field_size= size;
198 result->field_offset= 0;
199 result->field_total= total;
204 else if (result->field == NULL)
206 result->field= field;
207 result->field_size= size;
211 if (ret == DRIZZLE_RETURN_PAUSE)
212 ret= DRIZZLE_RETURN_OK;
221 drizzle_return_t drizzle_state_field_read(drizzle_con_st *con)
225 return DRIZZLE_RETURN_INVALID_ARGUMENT;
229 if (con->buffer_size == 0)
232 return DRIZZLE_RETURN_OK;
235 con->result->field_offset+= con->result->field_size;
236 if (con->result->field_offset == con->result->field_total)
238 con->result->field_offset= 0;
239 con->result->field_size= 0;
241 drizzle_return_t ret;
243 if (ret == DRIZZLE_RETURN_NULL_SIZE)
245 con->result->field= NULL;
246 con->result->field_current++;
248 return DRIZZLE_RETURN_OK;
250 else if (ret != DRIZZLE_RETURN_OK)
252 if (ret == DRIZZLE_RETURN_IO_WAIT)
255 return DRIZZLE_RETURN_OK;
262 "field_offset= %zu, field_size= %zu, field_total= %zu",
263 con->result->field_offset, con->result->field_size,
264 con->result->field_total);
266 if ((
size_t)(con->buffer_size) >= con->result->field_total)
268 con->result->field_size= con->result->field_total;
272 con->result->field_size= con->buffer_size;
277 if ((con->result->field_offset + con->buffer_size) >=
278 con->result->field_total)
280 con->result->field_size= (con->result->field_total -
281 con->result->field_offset);
285 con->result->field_size= con->buffer_size;
290 if (con->result->field_size > (
size_t)con->packet_size)
292 con->result->field_size= con->packet_size;
294 if (con->options & DRIZZLE_CON_RAW_PACKET)
296 con->result->options|= DRIZZLE_RESULT_ROW_BREAK;
306 con->result->field= (
char *)con->buffer_ptr;
307 con->buffer_ptr+= con->result->field_size;
308 con->buffer_size-= con->result->field_size;
309 con->packet_size-= con->result->field_size;
312 "field_offset= %zu, field_size= %zu, field_total= %zu",
313 con->result->field_offset, con->result->field_size,
314 con->result->field_total);
316 if ((con->result->field_offset + con->result->field_size) ==
317 con->result->field_total)
319 if (con->result->column_buffer != NULL &&
320 con->result->column_buffer[con->result->field_current].max_size <
321 con->result->field_total)
323 con->result->column_buffer[con->result->field_current].max_size=
324 con->result->field_total;
327 con->result->field_current++;
330 if (con->result->field_total == 0 || con->result->field_size > 0 ||
331 con->packet_size == 0)
336 return DRIZZLE_RETURN_OK;
339 drizzle_return_t drizzle_state_field_write(drizzle_con_st *con)
343 return DRIZZLE_RETURN_INVALID_ARGUMENT;
346 uint8_t *start= con->buffer_ptr + con->buffer_size;
349 drizzle_result_st *result= con->result;
353 if (result->field == NULL && result->field_total != 0)
355 return DRIZZLE_RETURN_PAUSE;
358 free_size= (size_t)DRIZZLE_MAX_BUFFER_SIZE - (
size_t)(start - con->buffer);
361 if (result->field_offset == 0)
367 return DRIZZLE_RETURN_OK;
370 if (result->field == NULL)
375 else if (result->field_total == 0)
383 free_size-= (size_t)(ptr - start);
384 con->buffer_size+= (size_t)(ptr - start);
385 con->packet_size-= (size_t)(ptr - start);
387 else if (result->field_size > DRIZZLE_BUFFER_COPY_THRESHOLD)
390 if (con->buffer_size != 0)
393 return DRIZZLE_RETURN_OK;
397 con->buffer_ptr= (uint8_t *)result->field;
398 con->buffer_size= result->field_size;
399 con->packet_size-= result->field_size;
400 result->field_offset+= result->field_size;
403 if (result->field_offset == result->field_total)
407 else if (con->packet_size == 0)
409 con->result->options|= DRIZZLE_RESULT_ROW_BREAK;
415 return DRIZZLE_RETURN_OK;
418 if (result->field_size == 0)
424 if (result->field_size < free_size)
425 free_size= result->field_size;
427 memcpy(ptr, result->field, free_size);
428 result->field_offset+= free_size;
429 con->buffer_size+= free_size;
430 con->packet_size-= free_size;
432 if (result->field_offset == result->field_total)
439 if (con->packet_size == 0)
441 con->result->options|= DRIZZLE_RESULT_ROW_BREAK;
445 if (result->field_size == free_size)
451 result->field+= free_size;
452 result->field_size-= free_size;
458 return DRIZZLE_RETURN_OK;