Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00016 #include "common.h"
00017
00018
00019
00020
00021
00022 uint64_t drizzle_row_read(drizzle_result_st *result, drizzle_return_t *ret_ptr)
00023 {
00024 if (drizzle_state_none(result->con))
00025 {
00026 drizzle_state_push(result->con, drizzle_state_row_read);
00027 drizzle_state_push(result->con, drizzle_state_packet_read);
00028 }
00029
00030 *ret_ptr= drizzle_state_loop(result->con);
00031
00032 return result->row_current;
00033 }
00034
00035 drizzle_row_t drizzle_row_buffer(drizzle_result_st *result,
00036 drizzle_return_t *ret_ptr)
00037 {
00038 size_t total;
00039 drizzle_field_t field;
00040 drizzle_row_t row;
00041
00042 if (result->row == NULL)
00043 {
00044 if (drizzle_row_read(result, ret_ptr) == 0 || *ret_ptr != DRIZZLE_RETURN_OK)
00045 return NULL;
00046
00047 result->row= malloc((sizeof(drizzle_field_t) + sizeof(size_t)) *
00048 result->column_count);
00049 if (result->row == NULL)
00050 {
00051 drizzle_set_error(result->con->drizzle, "drizzle_row_buffer", "malloc");
00052 *ret_ptr= DRIZZLE_RETURN_MEMORY;
00053 return NULL;
00054 }
00055
00056 result->field_sizes= (size_t *)(result->row + result->column_count);
00057 }
00058
00059 while (1)
00060 {
00061 field= drizzle_field_buffer(result, &total, ret_ptr);
00062 if (*ret_ptr == DRIZZLE_RETURN_ROW_END)
00063 break;
00064 if (*ret_ptr != DRIZZLE_RETURN_OK)
00065 {
00066 if (*ret_ptr != DRIZZLE_RETURN_IO_WAIT)
00067 {
00068 free(result->row);
00069 result->row= NULL;
00070 result->field_sizes= NULL;
00071 }
00072
00073 return NULL;
00074 }
00075
00076 result->row[result->field_current - 1]= field;
00077 result->field_sizes[result->field_current - 1]= total;
00078 }
00079
00080 *ret_ptr= DRIZZLE_RETURN_OK;
00081 row= result->row;
00082 result->row= NULL;
00083
00084 return row;
00085 }
00086
00087 void drizzle_row_free(drizzle_result_st *result, drizzle_row_t row)
00088 {
00089 uint16_t x;
00090
00091 for (x= 0; x < result->column_count; x++)
00092 drizzle_field_free(row[x]);
00093
00094 free(row);
00095 }
00096
00097 size_t *drizzle_row_field_sizes(drizzle_result_st *result)
00098 {
00099 return result->field_sizes;
00100 }
00101
00102 drizzle_row_t drizzle_row_next(drizzle_result_st *result)
00103 {
00104 if (result->row_current == result->row_count)
00105 return NULL;
00106
00107 result->field_sizes= result->field_sizes_list[result->row_current];
00108 result->row_current++;
00109 return result->row_list[result->row_current - 1];
00110 }
00111
00112 drizzle_row_t drizzle_row_prev(drizzle_result_st *result)
00113 {
00114 if (result->row_current == 0)
00115 return NULL;
00116
00117 result->row_current--;
00118 result->field_sizes= result->field_sizes_list[result->row_current];
00119 return result->row_list[result->row_current];
00120 }
00121
00122 void drizzle_row_seek(drizzle_result_st *result, uint64_t row)
00123 {
00124 if (row <= result->row_count)
00125 result->row_current= row;
00126 }
00127
00128 drizzle_row_t drizzle_row_index(drizzle_result_st *result, uint64_t row)
00129 {
00130 if (row >= result->row_count)
00131 return NULL;
00132
00133 return result->row_list[row];
00134 }
00135
00136 uint64_t drizzle_row_current(drizzle_result_st *result)
00137 {
00138 return result->row_current;
00139 }
00140
00141
00142
00143
00144
00145 drizzle_return_t drizzle_row_write(drizzle_result_st *result)
00146 {
00147 if (drizzle_state_none(result->con))
00148 drizzle_state_push(result->con, drizzle_state_row_write);
00149
00150 return drizzle_state_loop(result->con);
00151 }
00152
00153
00154
00155
00156
00157 drizzle_return_t drizzle_state_row_read(drizzle_con_st *con)
00158 {
00159 drizzle_log_debug(con->drizzle, "drizzle_state_row_read");
00160
00161 if (con->packet_size == 5 && con->buffer_ptr[0] == 254)
00162 {
00163 if (con->buffer_size < 5)
00164 {
00165 drizzle_state_push(con, drizzle_state_read);
00166 return DRIZZLE_RETURN_OK;
00167 }
00168
00169
00170 con->result->row_current= 0;
00171 con->result->warning_count= drizzle_get_byte2(con->buffer_ptr + 1);
00172 con->status= drizzle_get_byte2(con->buffer_ptr + 3);
00173 con->buffer_ptr+= 5;
00174 con->buffer_size-= 5;
00175 }
00176 else if (con->buffer_ptr[0] == 255)
00177 {
00178 drizzle_state_pop(con);
00179 drizzle_state_push(con, drizzle_state_result_read);
00180 return DRIZZLE_RETURN_OK;
00181 }
00182 else if (con->result->options & DRIZZLE_RESULT_ROW_BREAK)
00183 con->result->options&= (drizzle_result_options_t)~DRIZZLE_RESULT_ROW_BREAK;
00184 else
00185 {
00186 con->result->row_count++;
00187 con->result->row_current++;
00188 con->result->field_current= 0;
00189 }
00190
00191 drizzle_state_pop(con);
00192 return DRIZZLE_RETURN_OK;
00193 }
00194
00195 drizzle_return_t drizzle_state_row_write(drizzle_con_st *con)
00196 {
00197 uint8_t *start= con->buffer_ptr + con->buffer_size;
00198
00199 drizzle_log_debug(con->drizzle, "drizzle_state_row_write");
00200
00201
00202 if (((size_t)DRIZZLE_MAX_BUFFER_SIZE - (size_t)(start - con->buffer)) < 4)
00203 {
00204 drizzle_state_push(con, drizzle_state_write);
00205 return DRIZZLE_RETURN_OK;
00206 }
00207
00208 drizzle_set_byte3(start, con->packet_size);
00209 start[3]= con->packet_number;
00210 con->packet_number++;
00211
00212 con->buffer_size+= 4;
00213
00214 drizzle_state_pop(con);
00215 return DRIZZLE_RETURN_OK;
00216 }