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
123void 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
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 {
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
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
216 return DRIZZLE_RETURN_OK;
217}
System Include Files.
static void drizzle_state_pop(drizzle_con_st *con)
Definition conn_local.h:73
static void drizzle_state_push(drizzle_con_st *con, drizzle_state_fn *function)
Definition conn_local.h:57
static bool drizzle_state_none(drizzle_con_st *con)
Definition conn_local.h:45
#define DRIZZLE_MAX_BUFFER_SIZE
Definition constants.h:55
drizzle_return_t
Definition constants.h:69
@ DRIZZLE_RETURN_OK
Definition constants.h:70
@ DRIZZLE_RETURN_IO_WAIT
Definition constants.h:71
@ DRIZZLE_RETURN_ROW_END
Definition constants.h:89
@ DRIZZLE_RETURN_MEMORY
Definition constants.h:74
drizzle_field_t drizzle_field_buffer(drizzle_result_st *result, size_t *total, drizzle_return_t *ret_ptr)
Definition field.c:51
void drizzle_field_free(drizzle_field_t field)
Definition field.c:97
static void drizzle_log_debug(drizzle_st *drizzle, const char *format,...)
void drizzle_set_error(drizzle_st *drizzle, const char *function, const char *format,...)
Definition drizzle.c:633
#define drizzle_set_byte3(__buffer, __int)
Definition constants.h:478
#define drizzle_get_byte2(__buffer)
Definition constants.h:452
drizzle_result_options_t
Definition constants.h:290
@ DRIZZLE_RESULT_ROW_BREAK
Definition constants.h:297
uint64_t drizzle_row_current(drizzle_result_st *result)
Definition row.c:137
size_t * drizzle_row_field_sizes(drizzle_result_st *result)
Definition row.c:98
uint64_t drizzle_row_read(drizzle_result_st *result, drizzle_return_t *ret_ptr)
Definition row.c:22
drizzle_row_t drizzle_row_prev(drizzle_result_st *result)
Definition row.c:113
drizzle_row_t drizzle_row_next(drizzle_result_st *result)
Definition row.c:103
drizzle_row_t drizzle_row_buffer(drizzle_result_st *result, drizzle_return_t *ret_ptr)
Definition row.c:35
drizzle_row_t drizzle_row_index(drizzle_result_st *result, uint64_t row)
Definition row.c:129
void drizzle_row_free(drizzle_result_st *result, drizzle_row_t row)
Definition row.c:88
void drizzle_row_seek(drizzle_result_st *result, uint64_t row)
Definition row.c:123
drizzle_return_t drizzle_row_write(drizzle_result_st *result)
Definition row.c:146
drizzle_return_t drizzle_state_packet_read(drizzle_con_st *con)
Definition state.c:40
drizzle_return_t drizzle_state_write(drizzle_con_st *con)
Definition conn.c:975
drizzle_return_t drizzle_state_read(drizzle_con_st *con)
Definition conn.c:897
drizzle_return_t drizzle_state_row_write(drizzle_con_st *con)
Definition row.c:196
drizzle_return_t drizzle_state_loop(drizzle_con_st *con)
Definition state.c:18
drizzle_return_t drizzle_state_result_read(drizzle_con_st *con)
Definition result.c:384
drizzle_return_t drizzle_state_row_read(drizzle_con_st *con)
Definition row.c:158
drizzle_field_t * drizzle_row_t
Definition constants.h:413
char * drizzle_field_t
Definition constants.h:412
uint8_t packet_number
Definition structs.h:76
uint8_t buffer[DRIZZLE_MAX_BUFFER_SIZE]
Definition structs.h:115
drizzle_st * drizzle
Definition structs.h:103
drizzle_result_st * result
Definition structs.h:107
drizzle_con_status_t status
Definition structs.h:86
size_t packet_size
Definition structs.h:96
uint8_t * buffer_ptr
Definition structs.h:98
size_t buffer_size
Definition structs.h:92
size_t ** field_sizes_list
Definition structs.h:179
uint64_t row_current
Definition structs.h:166
drizzle_row_t row
Definition structs.h:176
drizzle_row_t * row_list
Definition structs.h:177
size_t * field_sizes
Definition structs.h:178
uint16_t field_current
Definition structs.h:168
uint64_t row_count
Definition structs.h:165
uint16_t warning_count
Definition structs.h:156
drizzle_con_st * con
Definition structs.h:147
drizzle_result_options_t options
Definition structs.h:150
uint16_t column_count
Definition structs.h:159