drizzle_return_t drizzle_state_field_read(drizzle_con_st *con) { drizzle_return_t ret; drizzle_log_debug(con->drizzle, "drizzle_state_field_read"); if (con->buffer_size == 0) { drizzle_state_push(con, drizzle_state_read); return DRIZZLE_RETURN_OK; } con->result->field_offset+= con->result->field_size; if (con->result->field_offset == con->result->field_total) { con->result->field_offset= 0; con->result->field_size= 0; con->result->field_total= (size_t)drizzle_unpack_length(con, &ret); if (ret == DRIZZLE_RETURN_NULL_SIZE) { con->result->field= NULL; con->result->field_current++; drizzle_state_pop(con); return DRIZZLE_RETURN_OK; } else if (ret != DRIZZLE_RETURN_OK) { if (ret == DRIZZLE_RETURN_IO_WAIT) { drizzle_state_push(con, drizzle_state_read); return DRIZZLE_RETURN_OK; } return ret; } drizzle_log_debug(con->drizzle, "field_offset= %zu, field_size= %zu, field_total= %zu", con->result->field_offset, con->result->field_size, con->result->field_total); if ((size_t)(con->buffer_size) >= con->result->field_total) con->result->field_size= con->result->field_total; else con->result->field_size= con->buffer_size; } else { if ((con->result->field_offset + con->buffer_size) >= con->result->field_total) { con->result->field_size= (con->result->field_total - con->result->field_offset); } else con->result->field_size= con->buffer_size; } /* This is a special case when a row is larger than the packet size. */ if (con->result->field_size > (size_t)con->packet_size) { con->result->field_size= con->packet_size; if (con->options & DRIZZLE_CON_RAW_PACKET) con->result->options|= DRIZZLE_RESULT_ROW_BREAK; else { drizzle_state_pop(con); drizzle_state_push(con, drizzle_state_packet_read); drizzle_state_push(con, drizzle_state_field_read); } } con->result->field= (char *)con->buffer_ptr; con->buffer_ptr+= con->result->field_size; con->buffer_size-= con->result->field_size; con->packet_size-= con->result->field_size; drizzle_log_debug(con->drizzle, "field_offset= %zu, field_size= %zu, field_total= %zu", con->result->field_offset, con->result->field_size, con->result->field_total); if ((con->result->field_offset + con->result->field_size) == con->result->field_total) { if (con->result->column_buffer != NULL && con->result->column_buffer[con->result->field_current].max_size < con->result->field_total) { con->result->column_buffer[con->result->field_current].max_size= con->result->field_total; } con->result->field_current++; } if (con->result->field_total == 0 || con->result->field_size > 0 || con->packet_size == 0) { drizzle_state_pop(con); } return DRIZZLE_RETURN_OK; }
drizzle_return_t drizzle_state_result_read(drizzle_con_st *con) { drizzle_return_t ret; drizzle_log_debug(con->drizzle, "drizzle_state_result_read"); /* Assume the entire result packet will fit in the buffer. */ if (con->buffer_size < con->packet_size) { drizzle_state_push(con, drizzle_state_read); return DRIZZLE_RETURN_OK; } if (con->buffer_ptr[0] == 0) { con->buffer_ptr++; /* We can ignore the returns since we've buffered the entire packet. */ con->result->affected_rows= drizzle_unpack_length(con, &ret); con->result->insert_id= drizzle_unpack_length(con, &ret); con->status= drizzle_get_byte2(con->buffer_ptr); con->result->warning_count= drizzle_get_byte2(con->buffer_ptr + 2); con->buffer_ptr+= 4; con->buffer_size-= 5; con->packet_size-= 5; if (con->packet_size > 0) { /* Skip one byte for message size. */ con->buffer_ptr+= 1; con->buffer_size-= 1; con->packet_size-= 1; } ret= DRIZZLE_RETURN_OK; } else if (con->buffer_ptr[0] == 254) { con->result->options= DRIZZLE_RESULT_EOF_PACKET; con->result->warning_count= drizzle_get_byte2(con->buffer_ptr + 1); con->status= drizzle_get_byte2(con->buffer_ptr + 3); con->buffer_ptr+= 5; con->buffer_size-= 5; con->packet_size-= 5; ret= DRIZZLE_RETURN_OK; } else if (con->buffer_ptr[0] == 255) { con->result->error_code= drizzle_get_byte2(con->buffer_ptr + 1); con->drizzle->error_code= con->result->error_code; /* Byte 3 is always a '#' character, skip it. */ memcpy(con->result->sqlstate, con->buffer_ptr + 4, DRIZZLE_MAX_SQLSTATE_SIZE); con->result->sqlstate[DRIZZLE_MAX_SQLSTATE_SIZE]= 0; memcpy(con->drizzle->sqlstate, con->result->sqlstate, DRIZZLE_MAX_SQLSTATE_SIZE + 1); con->buffer_ptr+= 9; con->buffer_size-= 9; con->packet_size-= 9; ret= DRIZZLE_RETURN_ERROR_CODE; } else { /* We can ignore the return since we've buffered the entire packet. */ con->result->column_count= (uint16_t)drizzle_unpack_length(con, &ret); ret= DRIZZLE_RETURN_OK; } if (con->packet_size > 0) { snprintf(con->drizzle->last_error, DRIZZLE_MAX_ERROR_SIZE, "%.*s", (int32_t)con->packet_size, con->buffer_ptr); con->drizzle->last_error[DRIZZLE_MAX_ERROR_SIZE-1]= 0; snprintf(con->result->info, DRIZZLE_MAX_INFO_SIZE, "%.*s", (int32_t)con->packet_size, con->buffer_ptr); con->result->info[DRIZZLE_MAX_INFO_SIZE-1]= 0; con->buffer_ptr+= con->packet_size; con->buffer_size-= con->packet_size; con->packet_size= 0; } drizzle_state_pop(con); return ret; }