VALUE rb_drizzle_query_error_code(VALUE self) { net_drizzle_query_st *context; Data_Get_Struct(self, net_drizzle_query_st, context); int ret; if ( context->query->result == NULL ) { // hmm. It should raise some Exception? return Qnil; } ret = drizzle_result_error_code(context->query->result); return INT2FIX(ret); }
int main(int argc, char *argv[]) { const char *query= "SELECT table_schema,table_name FROM tables"; drizzle_st drizzle; drizzle_con_st con[SIMPLE_MULTI_COUNT]; drizzle_result_st result[SIMPLE_MULTI_COUNT]; drizzle_query_st ql[SIMPLE_MULTI_COUNT]; drizzle_return_t ret; drizzle_row_t row; int x; if (drizzle_create(&drizzle) == NULL) { printf("drizzle_create:NULL\n"); return 1; } /* Create SIMPLE_MULTI_COUNT connections and initialize query list. */ for (x= 0; x < SIMPLE_MULTI_COUNT; x++) { if (x == 0) { if (drizzle_con_create(&drizzle, &(con[0])) == NULL) { printf("drizzle_con_create:%s\n", drizzle_error(&drizzle)); return 1; } if (argc == 2 && !strcmp(argv[1], "-m")) drizzle_con_add_options(&(con[0]), DRIZZLE_CON_MYSQL); else if (argc != 1) { printf("usage: %s [-m]\n", argv[0]); return 1; } drizzle_con_set_db(&(con[0]), "information_schema"); } else { if (drizzle_con_clone(&drizzle, &(con[x]), &(con[0])) == NULL) { printf("drizzle_con_clone:%s\n", drizzle_error(&drizzle)); return 1; } } if (drizzle_query_add(&drizzle, &(ql[x]), &(con[x]), &(result[x]), query, strlen(query), 0, NULL) == NULL) { printf("drizzle_query_add:%s\n", drizzle_error(&drizzle)); return 1; } } ret= drizzle_query_run_all(&drizzle); if (ret != DRIZZLE_RETURN_OK) { printf("drizzle_query_run_all:%s\n", drizzle_error(&drizzle)); return 1; } for (x= 0; x < SIMPLE_MULTI_COUNT; x++) { if (drizzle_result_error_code(&(result[x])) != 0) { printf("%d:%s\n", drizzle_result_error_code(&(result[x])), drizzle_result_error(&(result[x]))); continue; } while ((row= drizzle_row_next(&(result[x]))) != NULL) printf("%d %s:%s\n", x, row[0], row[1]); } drizzle_free(&drizzle); return 0; }
ngx_int_t ngx_http_drizzle_output_result_header(ngx_http_request_t *r, drizzle_result_st *res) { u_char *pos, *last; ngx_int_t rc; ngx_http_upstream_t *u = r->upstream; const char *errstr; size_t size; uint16_t errstr_len; uint16_t col_count; unsigned last_buf; ngx_http_upstream_drizzle_peer_data_t *dp = u->peer.data; errstr = drizzle_result_error(res); errstr_len = (uint16_t) strlen(errstr); col_count = drizzle_result_column_count(res); size = sizeof(uint8_t) /* endian type */ + sizeof(uint32_t) /* format version */ + sizeof(uint8_t) /* result type */ + sizeof(uint16_t) /* standard error code */ + sizeof(uint16_t) /* driver-specific error code */ + sizeof(uint16_t) /* driver-specific errstr len */ + errstr_len /* driver-specific errstr data */ + sizeof(uint64_t) /* rows affected */ + sizeof(uint64_t) /* insert id */ + sizeof(uint16_t) /* column count */ ; pos = ngx_http_drizzle_request_mem(r, dp, size); if (pos == NULL) { return NGX_ERROR; } last = pos; #if NGX_HAVE_LITTLE_ENDIAN *last++ = 0; #else /* big endian */ *last++ = 1; #endif /* RDS format version */ *(uint32_t *) last = (uint32_t) resty_dbd_stream_version; last += sizeof(uint32_t); /* result type fixed to 0 */ *last++ = 0; /* standard error code * FIXME: define the standard error code set and map * libdrizzle's to it. */ *(uint16_t *) last = drizzle_result_error_code(res); last += sizeof(uint16_t); /* driver-specific error code */ *(uint16_t *) last = drizzle_result_error_code(res); last += sizeof(uint16_t); /* driver-specific errstr len */ *(uint16_t *) last = errstr_len; last += sizeof(uint16_t); /* driver-specific errstr data */ if (errstr_len) { last = ngx_copy(last, (u_char *) errstr, errstr_len); } /* affected rows */ *(uint64_t *) last = drizzle_result_affected_rows(res); last += sizeof(uint64_t); /* insert id */ *(uint64_t *) last = drizzle_result_insert_id(res); last += sizeof(uint64_t); /* column count */ *(uint16_t *) last = col_count; last += sizeof(uint16_t); if ((size_t) (last - pos) != size) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "drizzle: FATAL: output result header buffer error"); return NGX_ERROR; } if (col_count == 0) { /* we suppress row terminator here when there's no columns */ dp->seen_stream_end = 1; if (r == r->main) { last_buf = 1; } else { last_buf = 0; } rc = ngx_http_drizzle_submit_mem(r, dp, size, last_buf); if (rc != NGX_OK) { return NGX_ERROR; } ngx_http_upstream_drizzle_done(r, u, dp, NGX_OK); return NGX_DONE; } return ngx_http_drizzle_submit_mem(r, dp, size, 0 /* last_buf */); }
ngx_int_t ngx_http_drizzle_output_result_header(ngx_http_request_t *r, drizzle_result_st *res) { u_char *pos, *last; ngx_int_t rc; ngx_http_upstream_t *u = r->upstream; const char *errstr; size_t size; uint16_t errstr_len; uint16_t col_count; uint16_t errcode; ngx_http_upstream_drizzle_peer_data_t *dp = u->peer.data; errcode = drizzle_result_error_code(res); if (dp->enable_charset && ! dp->has_set_names) { if (errcode != 0) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "drizzle: FATAL: failed to set names 'utf8' " "(error %d)", (int) errcode); return NGX_ERROR; } if (dp->drizzle_con && dp->drizzle_res.con) { dd("before drizzle result free"); dd("%p vs. %p", dp->drizzle_res.con, dp->drizzle_con); drizzle_result_free(&dp->drizzle_res); dd("after drizzle result free"); } /* ngx_http_upstream_drizzle_done(r, u, dp, NGX_OK); */ dd("returning DONE when set names"); return NGX_DONE; } errstr = drizzle_result_error(res); errstr_len = (uint16_t) ngx_strlen(errstr); col_count = drizzle_result_column_count(res); size = sizeof(uint8_t) /* endian type */ + sizeof(uint32_t) /* format version */ + sizeof(uint8_t) /* result type */ + sizeof(uint16_t) /* standard error code */ + sizeof(uint16_t) /* driver-specific error code */ + sizeof(uint16_t) /* driver-specific errstr len */ + errstr_len /* driver-specific errstr data */ + sizeof(uint64_t) /* rows affected */ + sizeof(uint64_t) /* insert id */ + sizeof(uint16_t); /* column count */ pos = ngx_http_drizzle_request_mem(r, dp, size); if (pos == NULL) { return NGX_ERROR; } last = pos; #if NGX_HAVE_LITTLE_ENDIAN *last++ = 0; #else /* big endian */ *last++ = 1; #endif /* RDS format version */ *(uint32_t *) last = (uint32_t) resty_dbd_stream_version; last += sizeof(uint32_t); /* result type fixed to 0 */ *last++ = 0; /* standard error code * FIXME: define the standard error code set and map * libdrizzle's to it. */ *(uint16_t *) last = errcode; last += sizeof(uint16_t); /* driver-specific error code */ *(uint16_t *) last = drizzle_result_error_code(res); last += sizeof(uint16_t); /* driver-specific errstr len */ *(uint16_t *) last = errstr_len; last += sizeof(uint16_t); /* driver-specific errstr data */ if (errstr_len) { last = ngx_copy(last, (u_char *) errstr, errstr_len); } /* affected rows */ *(uint64_t *) last = drizzle_result_affected_rows(res); last += sizeof(uint64_t); /* insert id */ *(uint64_t *) last = drizzle_result_insert_id(res); last += sizeof(uint64_t); /* column count */ *(uint16_t *) last = col_count; last += sizeof(uint16_t); if ((size_t) (last - pos) != size) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "drizzle: FATAL: output result header buffer error"); return NGX_ERROR; } if (col_count == 0) { dd("Col count is ZERO"); /* we suppress row terminator here when there's no columns */ dp->seen_stream_end = 1; rc = ngx_http_drizzle_submit_mem(r, dp, size); if (rc != NGX_OK) { return NGX_ERROR; } dd("about to be done..."); ngx_http_upstream_drizzle_done(r, u, dp, NGX_DONE); dd("i am returning DONE"); return NGX_DONE; } return ngx_http_drizzle_submit_mem(r, dp, size); }