00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00016 #include "common.h"
00017
00018 drizzle_result_st *drizzle_query(drizzle_con_st *con, drizzle_result_st *result,
00019 const char *query, size_t size,
00020 drizzle_return_t *ret_ptr)
00021 {
00022 return drizzle_command_write(con, result, DRIZZLE_COMMAND_QUERY,
00023 (uint8_t *)query, size, size, ret_ptr);
00024 }
00025
00026 drizzle_result_st *drizzle_query_str(drizzle_con_st *con,
00027 drizzle_result_st *result,
00028 const char *query,
00029 drizzle_return_t *ret_ptr)
00030 {
00031 size_t size;
00032
00033 size= strlen(query);
00034
00035 return drizzle_command_write(con, result, DRIZZLE_COMMAND_QUERY,
00036 (uint8_t *)query, size, size, ret_ptr);
00037 }
00038
00039 drizzle_result_st *drizzle_query_inc(drizzle_con_st *con,
00040 drizzle_result_st *result,
00041 const char *query, size_t size,
00042 size_t total, drizzle_return_t *ret_ptr)
00043 {
00044 return drizzle_command_write(con, result, DRIZZLE_COMMAND_QUERY,
00045 (uint8_t *)query, size, total, ret_ptr);
00046 }
00047
00048 drizzle_query_st *drizzle_query_add(drizzle_st *drizzle,
00049 drizzle_query_st *query,
00050 drizzle_con_st *con,
00051 drizzle_result_st *result,
00052 const char *query_string, size_t size,
00053 drizzle_query_options_t options,
00054 const void *data)
00055 {
00056 query= drizzle_query_create(drizzle, query);
00057 if (query == NULL)
00058 return NULL;
00059
00060 drizzle_query_set_con(query, con);
00061 drizzle_query_set_result(query, result);
00062 drizzle_query_set_string(query, query_string, size);
00063 drizzle_query_add_options(query, options);
00064 drizzle_query_set_data(query, data);
00065
00066 return query;
00067 }
00068
00069 drizzle_query_st *drizzle_query_create(drizzle_st *drizzle,
00070 drizzle_query_st *query)
00071 {
00072 if (query == NULL)
00073 {
00074 query= malloc(sizeof(drizzle_query_st));
00075 if (query == NULL)
00076 {
00077 DRIZZLE_ERROR_SET(drizzle, "drizzle_query_create", "malloc")
00078 return NULL;
00079 }
00080
00081 memset(query, 0, sizeof(drizzle_query_st));
00082 query->options|= DRIZZLE_CON_ALLOCATED;
00083 }
00084 else
00085 memset(query, 0, sizeof(drizzle_query_st));
00086
00087 query->drizzle= drizzle;
00088
00089 if (drizzle->query_list)
00090 drizzle->query_list->prev= query;
00091 query->next= drizzle->query_list;
00092 drizzle->query_list= query;
00093 drizzle->query_count++;
00094 drizzle->query_new++;
00095
00096 return query;
00097 }
00098
00099 void drizzle_query_free(drizzle_query_st *query)
00100 {
00101 if (query->data != NULL && query->data_free_fn != NULL)
00102 (*(query->data_free_fn))(query, (void *)(query->data));
00103
00104 if (query->drizzle->query_list == query)
00105 query->drizzle->query_list= query->next;
00106 if (query->prev)
00107 query->prev->next= query->next;
00108 if (query->next)
00109 query->next->prev= query->prev;
00110 query->drizzle->query_count--;
00111
00112 if (query->options & DRIZZLE_QUERY_ALLOCATED)
00113 free(query);
00114 }
00115
00116 drizzle_con_st *drizzle_query_con(drizzle_query_st *query)
00117 {
00118 return query->con;
00119 }
00120
00121 void drizzle_query_set_con(drizzle_query_st *query, drizzle_con_st *con)
00122 {
00123 query->con= con;
00124 }
00125
00126 drizzle_result_st *drizzle_query_result(drizzle_query_st *query)
00127 {
00128 return query->result;
00129 }
00130
00131 void drizzle_query_set_result(drizzle_query_st *query,
00132 drizzle_result_st *result)
00133 {
00134 query->result= result;
00135 }
00136
00137 char *drizzle_query_string(drizzle_query_st *query, size_t *size)
00138 {
00139 *size= query->size;
00140 return (char *)(query->string);
00141 }
00142
00143 void drizzle_query_set_string(drizzle_query_st *query, const char *string,
00144 size_t size)
00145 {
00146 query->string= string;
00147 query->size= size;
00148 }
00149
00150 drizzle_query_options_t drizzle_query_options(drizzle_query_st *query)
00151 {
00152 return query->options;
00153 }
00154
00155 void drizzle_query_set_options(drizzle_query_st *query,
00156 drizzle_query_options_t options)
00157 {
00158 query->options= options;
00159 }
00160
00161 void drizzle_query_add_options(drizzle_query_st *query,
00162 drizzle_query_options_t options)
00163 {
00164 query->options|= options;
00165 }
00166
00167 void drizzle_query_remove_options(drizzle_query_st *query,
00168 drizzle_query_options_t options)
00169 {
00170 query->options&= ~options;
00171 }
00172
00173 void *drizzle_query_data(drizzle_query_st *query)
00174 {
00175 return (void *)(query->data);
00176 }
00177
00178 void drizzle_query_set_data(drizzle_query_st *query, const void *data)
00179 {
00180 query->data= data;
00181 }
00182
00183 void drizzle_query_set_data_free(drizzle_query_st *query,
00184 drizzle_query_data_free_fn *free_fn)
00185 {
00186 query->data_free_fn= free_fn;
00187 }
00188
00189 drizzle_query_st *drizzle_query_run(drizzle_st *drizzle,
00190 drizzle_return_t *ret_ptr)
00191 {
00192 drizzle_options_t options;
00193 drizzle_query_st *query;
00194 drizzle_con_st *con;
00195
00196 if (drizzle->query_new == 0 && drizzle->query_running == 0)
00197 {
00198 *ret_ptr= DRIZZLE_RETURN_OK;
00199 return NULL;
00200 }
00201
00202 options= drizzle->options;
00203 drizzle->options|= DRIZZLE_NON_BLOCKING;
00204
00205
00206 if (drizzle->query_new > 0)
00207 {
00208 for (query= drizzle->query_list; query != NULL; query= query->next)
00209 {
00210 if (query->state != DRIZZLE_QUERY_STATE_INIT)
00211 continue;
00212
00213 query->result= drizzle_query(query->con, query->result, query->string,
00214 query->size, ret_ptr);
00215 if (*ret_ptr != DRIZZLE_RETURN_IO_WAIT && *ret_ptr != DRIZZLE_RETURN_OK)
00216 {
00217 drizzle->options= options;
00218
00219 if (*ret_ptr == DRIZZLE_RETURN_ERROR_CODE)
00220 {
00221 query->state= DRIZZLE_QUERY_STATE_DONE;
00222 drizzle->query_new--;
00223 return query;
00224 }
00225
00226 return NULL;
00227 }
00228
00229 query->state= DRIZZLE_QUERY_STATE_QUERY;
00230 drizzle->query_running++;
00231 query->con->query= query;
00232 drizzle->query_new--;
00233 }
00234 }
00235
00236 while (1)
00237 {
00238
00239 while ((con= drizzle_con_ready(drizzle)) != NULL)
00240 {
00241 query= con->query;
00242
00243 switch (query->state)
00244 {
00245 case DRIZZLE_QUERY_STATE_INIT:
00246 case DRIZZLE_QUERY_STATE_QUERY:
00247 query->result= drizzle_query(query->con, query->result, query->string,
00248 query->size, ret_ptr);
00249 if (*ret_ptr == DRIZZLE_RETURN_IO_WAIT)
00250 break;
00251 else if (*ret_ptr == DRIZZLE_RETURN_ERROR_CODE)
00252 {
00253 query->state= DRIZZLE_QUERY_STATE_DONE;
00254 drizzle->query_running--;
00255 drizzle->options= options;
00256 return query;
00257 }
00258 else if (*ret_ptr != DRIZZLE_RETURN_OK)
00259 {
00260 drizzle->options= options;
00261 return NULL;
00262 }
00263
00264 query->state= DRIZZLE_QUERY_STATE_RESULT;
00265
00266 case DRIZZLE_QUERY_STATE_RESULT:
00267 *ret_ptr= drizzle_result_buffer(query->result);
00268 if (*ret_ptr == DRIZZLE_RETURN_IO_WAIT)
00269 break;
00270 if (*ret_ptr != DRIZZLE_RETURN_OK)
00271 {
00272 drizzle->options= options;
00273 return NULL;
00274 }
00275
00276 query->state= DRIZZLE_QUERY_STATE_DONE;
00277 drizzle->query_running--;
00278 drizzle->options= options;
00279 return query;
00280
00281 default:
00282 case DRIZZLE_QUERY_STATE_DONE:
00283 break;
00284 }
00285 }
00286
00287 if (options & DRIZZLE_NON_BLOCKING)
00288 {
00289 *ret_ptr= DRIZZLE_RETURN_IO_WAIT;
00290 return NULL;
00291 }
00292
00293 *ret_ptr= drizzle_con_wait(drizzle);
00294 if (*ret_ptr != DRIZZLE_RETURN_OK)
00295 {
00296 drizzle->options= options;
00297 return NULL;
00298 }
00299 }
00300 }
00301
00302 drizzle_return_t drizzle_query_run_all(drizzle_st *drizzle)
00303 {
00304 drizzle_return_t ret;
00305
00306 while (drizzle->query_new > 0 || drizzle->query_running > 0)
00307 {
00308 (void)drizzle_query_run(drizzle, &ret);
00309 if (ret != DRIZZLE_RETURN_OK && ret != DRIZZLE_RETURN_ERROR_CODE)
00310 return ret;
00311 }
00312
00313 return DRIZZLE_RETURN_OK;
00314 }
00315
00316 uint64_t drizzle_escape_string(char *to, const char *from, uint64_t from_size)
00317 {
00318 uint64_t to_size= 0;
00319
00320 while (from_size > 0)
00321 {
00322
00323 if (!(*from & 0x80))
00324 {
00325 switch (*from)
00326 {
00327 case 0:
00328 case '\n':
00329 case '\r':
00330 case '\\':
00331 case '\'':
00332 case '"':
00333 case '\032':
00334 *to++= '\\';
00335 to_size++;
00336 default:
00337 break;
00338 }
00339 }
00340
00341 *to++= *from++;
00342 from_size--;
00343 to_size++;
00344 }
00345
00346 *to= 0;
00347
00348 return to_size;
00349 }
00350
00351 uint64_t drizzle_hex_string(char *to, const char *from, uint64_t from_size)
00352 {
00353 static const char hex_map[]= "0123456789ABCDEF";
00354 const char *from_end;
00355
00356 for (from_end= from + from_size; from != from_end; from++)
00357 {
00358 *to++= hex_map[((unsigned char) *from) >> 4];
00359 *to++= hex_map[((unsigned char) *from) & 0xF];
00360 }
00361
00362 *to= 0;
00363
00364 return from_size * 2;
00365 }