libdrizzle Developer Documentation

row.c
Go to the documentation of this file.
1 /*
2  * Drizzle Client & Protocol Library
3  *
4  * Copyright (C) 2008 Eric Day (eday@oddments.org)
5  * All rights reserved.
6  *
7  * Use and distribution licensed under the BSD license. See
8  * the COPYING file in this directory for full text.
9  */
10 
16 #include "common.h"
17 
18 /*
19  * Client definitions
20  */
21 
23 {
24  if (drizzle_state_none(result->con))
25  {
28  }
29 
30  *ret_ptr= drizzle_state_loop(result->con);
31 
32  return result->row_current;
33 }
34 
36  drizzle_return_t *ret_ptr)
37 {
38  size_t total;
39  drizzle_field_t field;
40  drizzle_row_t row;
41 
42  if (result->row == NULL)
43  {
44  if (drizzle_row_read(result, ret_ptr) == 0 || *ret_ptr != DRIZZLE_RETURN_OK)
45  return NULL;
46 
47  result->row= malloc((sizeof(drizzle_field_t) + sizeof(size_t)) *
48  result->column_count);
49  if (result->row == NULL)
50  {
51  drizzle_set_error(result->con->drizzle, "drizzle_row_buffer", "malloc");
52  *ret_ptr= DRIZZLE_RETURN_MEMORY;
53  return NULL;
54  }
55 
56  result->field_sizes= (size_t *)(result->row + result->column_count);
57  }
58 
59  while (1)
60  {
61  field= drizzle_field_buffer(result, &total, ret_ptr);
62  if (*ret_ptr == DRIZZLE_RETURN_ROW_END)
63  break;
64  if (*ret_ptr != DRIZZLE_RETURN_OK)
65  {
66  if (*ret_ptr != DRIZZLE_RETURN_IO_WAIT)
67  {
68  free(result->row);
69  result->row= NULL;
70  free(result->field_sizes);
71  result->field_sizes= NULL;
72  }
73 
74  return NULL;
75  }
76 
77  result->row[result->field_current - 1]= field;
78  result->field_sizes[result->field_current - 1]= total;
79  }
80 
81  *ret_ptr= DRIZZLE_RETURN_OK;
82  row= result->row;
83  result->row= NULL;
84 
85  return row;
86 }
87 
89 {
90  uint16_t x;
91 
92  for (x= 0; x < result->column_count; x++)
93  drizzle_field_free(row[x]);
94 
95  free(row);
96 }
97 
99 {
100  return result->field_sizes;
101 }
102 
104 {
105  if (result->row_current == result->row_count)
106  return NULL;
107 
108  result->field_sizes= result->field_sizes_list[result->row_current];
109  result->row_current++;
110  return result->row_list[result->row_current - 1];
111 }
112 
114 {
115  if (result->row_current == 0)
116  return NULL;
117 
118  result->row_current--;
119  result->field_sizes= result->field_sizes_list[result->row_current];
120  return result->row_list[result->row_current];
121 }
122 
123 void drizzle_row_seek(drizzle_result_st *result, uint64_t row)
124 {
125  if (row <= result->row_count)
126  result->row_current= row;
127 }
128 
130 {
131  if (row >= result->row_count)
132  return NULL;
133 
134  return result->row_list[row];
135 }
136 
138 {
139  return result->row_current;
140 }
141 
142 /*
143  * Server definitions
144  */
145 
147 {
148  if (drizzle_state_none(result->con))
150 
151  return drizzle_state_loop(result->con);
152 }
153 
154 /*
155  * Internal state functions.
156  */
157 
159 {
160  drizzle_log_debug(con->drizzle, "drizzle_state_row_read");
161 
162  if (con->packet_size == 5 && con->buffer_ptr[0] == 254)
163  {
164  if (con->buffer_size < 5)
165  {
167  return DRIZZLE_RETURN_OK;
168  }
169 
170  /* Got EOF packet, no more rows. */
171  con->result->row_current= 0;
173  con->status= drizzle_get_byte2(con->buffer_ptr + 3);
174  con->buffer_ptr+= 5;
175  con->buffer_size-= 5;
176  }
177  else if (con->buffer_ptr[0] == 255)
178  {
179  drizzle_state_pop(con);
181  return DRIZZLE_RETURN_OK;
182  }
183  else if (con->result->options & DRIZZLE_RESULT_ROW_BREAK)
185  else
186  {
187  con->result->row_count++;
188  con->result->row_current++;
189  con->result->field_current= 0;
190  }
191 
192  drizzle_state_pop(con);
193  return DRIZZLE_RETURN_OK;
194 }
195 
197 {
198  uint8_t *start= con->buffer_ptr + con->buffer_size;
199 
200  drizzle_log_debug(con->drizzle, "drizzle_state_row_write");
201 
202  /* Flush buffer if there is not enough room. */
203  if (((size_t)DRIZZLE_MAX_BUFFER_SIZE - (size_t)(start - con->buffer)) < 4)
204  {
206  return DRIZZLE_RETURN_OK;
207  }
208 
209  drizzle_set_byte3(start, con->packet_size);
210  start[3]= con->packet_number;
211  con->packet_number++;
212 
213  con->buffer_size+= 4;
214 
215  drizzle_state_pop(con);
216  return DRIZZLE_RETURN_OK;
217 }