VALUE rb_drizzle_query_row_next(VALUE self) { net_drizzle_query_st *context; Data_Get_Struct(self, net_drizzle_query_st, context); if ( context->query->result == NULL ) { // hmm. It should raise some Exception? return Qnil; } drizzle_row_t row = drizzle_row_next(context->query->result); if ( row == NULL ) { return Qnil; } uint16_t cnt = drizzle_result_column_count(context->query->result); VALUE result = rb_ary_new2(cnt); int i; for( i = 0; i < cnt; i++ ) { if ( row[i] ) { // FIXME: hmm. it may not be "UTF-8" string. rb_ary_push(result, rb_utf8_str_new(row[i], strlen(row[i]))); } else { rb_ary_push(result, Qnil); } } return result; }
int dbt2_sql_fetchrow(struct db_context_t *dbc, struct sql_result_t * sql_result) { sql_result->current_row= drizzle_row_next(sql_result->result_set); if (sql_result->current_row) { sql_result->lengths= drizzle_row_field_sizes(sql_result->result_set); return 1; } return 0; }
static void _client(drizzle_con_st *con, client_state_st *state) { drizzle_return_t ret; drizzle_column_st *column; drizzle_row_t row; size_t *field_sizes; switch(state->state) { case CLIENT_STATE_START: drizzle_test("drizzle_query_str"); (void)drizzle_query_str(con, &state->result, "SELECT", &ret); if (ret == DRIZZLE_RETURN_IO_WAIT) { state->state = CLIENT_STATE_START; return; } else if (ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) { state->state= CLIENT_STATE_DONE; return; } else if (ret != DRIZZLE_RETURN_OK) { drizzle_test_error("returned %s (%d)", drizzle_con_error(con), ret); } case CLIENT_STATE_RESULT: drizzle_test("drizzle_result_buffer"); ret = drizzle_result_buffer(&state->result); if (ret == DRIZZLE_RETURN_IO_WAIT) { state->state = CLIENT_STATE_RESULT; return; } else if (ret != DRIZZLE_RETURN_OK) { drizzle_test_error("returned %s (%d)", drizzle_con_error(con), ret); } drizzle_test("drizzle_con_protocol_version"); if (drizzle_con_protocol_version(con) != 10) { drizzle_test_error("no match"); } drizzle_test("drizzle_con_server_version"); if (strcmp(drizzle_con_server_version(con), "test_version")) drizzle_test_error("no match"); drizzle_test("drizzle_con_thread_id"); if (drizzle_con_thread_id(con) != 1) drizzle_test_error("no match"); drizzle_test("drizzle_con_scramble"); if (memcmp(drizzle_con_scramble(con), "ABCDEFGHIJKLMNOPQRST", DRIZZLE_MAX_SCRAMBLE_SIZE)) { drizzle_test_error("no match"); } /* We default to MySQL protocol right now, which sets this flag. */ drizzle_test("drizzle_con_capabilities"); if (drizzle_con_capabilities(con) != DRIZZLE_CAPABILITIES_PROTOCOL_41) drizzle_test_error("no match"); drizzle_test("drizzle_con_charset"); if (drizzle_con_charset(con) != 8) drizzle_test_error("no match"); drizzle_test("drizzle_con_status"); if (drizzle_con_status(con) != DRIZZLE_CON_STATUS_NONE) drizzle_test_error("no match"); drizzle_test("drizzle_con_packet_size"); if (drizzle_con_max_packet_size(con) != DRIZZLE_MAX_PACKET_SIZE) drizzle_test_error("no match"); drizzle_test("drizzle_column_next"); column= drizzle_column_next(&state->result); if (column == NULL) drizzle_test_error("column not found"); drizzle_test("drizzle_column_drizzle_result"); if (drizzle_column_drizzle_result(column) != &state->result) drizzle_test_error("no match"); drizzle_test("drizzle_column_catalog"); if (strcmp(drizzle_column_catalog(column), "test_catalog")) drizzle_test_error("no match"); drizzle_test("drizzle_column_db"); if (strcmp(drizzle_column_db(column), "test_db")) drizzle_test_error("no match"); drizzle_test("drizzle_column_table"); if (strcmp(drizzle_column_table(column), "test_table")) drizzle_test_error("no match"); drizzle_test("drizzle_column_orig_table"); if (strcmp(drizzle_column_orig_table(column), "test_orig_table")) drizzle_test_error("no match"); drizzle_test("drizzle_column_name"); if (strcmp(drizzle_column_name(column), "test_column_1")) drizzle_test_error("no match"); drizzle_test("drizzle_column_orig_name"); if (strcmp(drizzle_column_orig_name(column), "test_orig_column_1")) drizzle_test_error("no match"); drizzle_test("drizzle_column_charset"); if (drizzle_column_charset(column) != 8) drizzle_test_error("no match"); drizzle_test("drizzle_column_size"); if (drizzle_column_size(column) != 32) drizzle_test_error("no match"); drizzle_test("drizzle_column_max_size"); if (drizzle_column_max_size(column) != 12) drizzle_test_error("no match"); drizzle_test("drizzle_column_type_drizzle"); if (drizzle_column_type_drizzle(column) != DRIZZLE_COLUMN_TYPE_DRIZZLE_VARCHAR) drizzle_test_error("no match"); drizzle_test("drizzle_column_flags"); if (drizzle_column_flags(column) != DRIZZLE_COLUMN_FLAGS_NONE) drizzle_test_error("no match"); drizzle_test("drizzle_column_next"); column= drizzle_column_next(&state->result); if (column == NULL) drizzle_test_error("column not found"); drizzle_test("drizzle_column_name"); if (strcmp(drizzle_column_name(column), "test_column_2")) drizzle_test_error("no match"); drizzle_test("drizzle_column_next"); column= drizzle_column_next(&state->result); if (column != NULL) drizzle_test_error("column found"); drizzle_test("drizzle_column_prev"); column= drizzle_column_prev(&state->result); if (column == NULL) drizzle_test_error("column not found"); drizzle_test("drizzle_column_name"); if (strcmp(drizzle_column_name(column), "test_column_2")) drizzle_test_error("no match"); drizzle_test("drizzle_row_next"); row= drizzle_row_next(&state->result); if (row == NULL) drizzle_test_error("row not found"); if (strcmp(row[0], "test_field_1") || strcmp(row[1], "test_field_2")) drizzle_test_error("no match"); drizzle_test("drizzle_row_field_sizes"); field_sizes= drizzle_row_field_sizes(&state->result); if (field_sizes[0] != 12 || field_sizes[1] != 12) drizzle_test_error("no match"); drizzle_test("drizzle_row_prev"); row = drizzle_row_prev(&state->result); if (row == NULL) drizzle_test_error("row not found"); if (strcmp(row[0], "test_field_1") || strcmp(row[1], "test_field_2")) drizzle_test_error("no match"); drizzle_test("drizzle_row_next"); row = drizzle_row_next(&state->result); drizzle_test("drizzle_row_index"); row = drizzle_row_index(&state->result, 0); if (row == NULL) drizzle_test_error("row not found"); if (strcmp(row[0], "test_field_1") || strcmp(row[1], "test_field_2")) drizzle_test_error("no match"); drizzle_test("drizzle_row_index"); row = drizzle_row_index(&state->result, 1); if (row != NULL) drizzle_test_error("row found"); drizzle_test("drizzle_result_free"); drizzle_result_free(&state->result); state->state = CLIENT_STATE_DONE; case CLIENT_STATE_DONE: return; default: drizzle_test_error("invalid client state"); } }
int main(int argc, char *argv[]) { (void) argc; (void) argv; drizzle_row_t row; int num_fields; drizzle_result_st *result; int table_size; #ifdef TEST_PREPARED_STATEMENTS drizzle_stmt_st *sth; #endif drizzle_st *con= drizzle_create(getenv("MYSQL_SERVER"), getenv("MYSQL_PORT") ? atoi("MYSQL_PORT") : DRIZZLE_DEFAULT_TCP_PORT, getenv("MYSQL_USER"), getenv("MYSQL_PASSWORD"), getenv("MYSQL_SCHEMA"), 0); ASSERT_NOT_NULL_(con, "Drizzle connection object creation error"); drizzle_return_t driz_ret= drizzle_connect(con); if (driz_ret == DRIZZLE_RETURN_COULD_NOT_CONNECT) { char error[DRIZZLE_MAX_ERROR_SIZE]; strncpy(error, drizzle_error(con), DRIZZLE_MAX_ERROR_SIZE); drizzle_quit(con); SKIP_IF_(driz_ret == DRIZZLE_RETURN_COULD_NOT_CONNECT, "%s(%s)", error, drizzle_strerror(driz_ret)); } ASSERT_EQ_(DRIZZLE_RETURN_OK, driz_ret, "drizzle_connect(): %s(%s)", drizzle_error(con), drizzle_strerror(driz_ret)); CHECKED_QUERY("DROP SCHEMA IF EXISTS test_nulls"); CHECKED_QUERY("CREATE SCHEMA test_nulls"); driz_ret= drizzle_select_db(con, "test_nulls"); ASSERT_EQ_(DRIZZLE_RETURN_OK, driz_ret, "USE test_nulls"); CHECKED_QUERY("create table test_nulls.t1 (a int, b int, c int, d int, e int, f int, g int, h int, i int, j int, k int)"); #define NCOLS 11 char *querybuf = calloc(256 + 60*64, 1); strcpy(querybuf, "insert into test_nulls.t1 values "); char *p = querybuf + strlen(querybuf); for(int sym = 0; sym < 64; sym++) { int cn = 0; *p++ = '('; #define APPENDMAYBE(b) if (sym & b) { strcpy(p, "NULL"); p += 4; } else { p += sprintf(p, "%d", sym*NCOLS + cn); } APPENDMAYBE(0x01); *p++ = ','; cn++; APPENDMAYBE(0x02); *p++ = ','; cn++; APPENDMAYBE(0x04); cn++; p += sprintf(p, ",%d,%d,%d,%d,", sym*NCOLS + 3, sym*NCOLS + 4, sym*NCOLS + 5, sym*NCOLS + 6); cn += 4; APPENDMAYBE(0x08); cn++; p += sprintf(p, ",%d,", sym*NCOLS + 8); cn++; APPENDMAYBE(0x10); *p++ = ','; cn++; APPENDMAYBE(0x20); cn++; *p++ = ')'; if (sym < 63) *p++ = ','; #undef APPENDMAYBE } CHECKED_QUERY(querybuf); #ifdef TEST_PREPARED_STATEMENTS strcpy(querybuf, "insert into test_nulls.t1 values (?,?,?,?,?,?,?,?,?,?,?)"); sth = drizzle_stmt_prepare(con, querybuf, strlen(querybuf), &driz_ret); ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, preparing \"%s\"", drizzle_strerror(driz_ret), drizzle_error(con), querybuf); for(int sym = 0; sym < 64; sym++) { // driz_ret= drizzle_stmt_reset(sth); // ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, resetting statement", drizzle_strerror(driz_ret), drizzle_error(con)); #define SETMAYBE(cn,b) if (sym & b) driz_ret = drizzle_stmt_set_null(sth, cn); else SETALWAYS(cn); #define SETALWAYS(cn) driz_ret = drizzle_stmt_set_short(sth, cn, sym*NCOLS + cn + 1000, 0) ASSERT_EQ(driz_ret, DRIZZLE_RETURN_OK); SETMAYBE(0,0x01); SETMAYBE(1,0x02); SETMAYBE(2,0x04); SETALWAYS(3); SETALWAYS(4); SETALWAYS(5); SETALWAYS(6); SETMAYBE(7,0x08); SETALWAYS(8); SETMAYBE(9,0x10); SETMAYBE(10,0x20); #undef SETMAYBE driz_ret = drizzle_stmt_execute(sth); ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, executing insert, sym=%d", drizzle_strerror(driz_ret), drizzle_error(con), sym); driz_ret = drizzle_stmt_buffer(sth); ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, buffering result, sym=%d", drizzle_strerror(driz_ret), drizzle_error(con), sym); // ASSERT_EQ(drizzle_stmt_affected_rows, 1); } ASSERT_EQ(drizzle_stmt_close(sth), DRIZZLE_RETURN_OK); table_size = 128; #else table_size = 64; #endif CHECKED_QUERY("select a,b,c,d,e,f,g,h,i,j,k from test_nulls.t1 order by e"); drizzle_result_buffer(result); num_fields= drizzle_result_column_count(result); ASSERT_EQ_(num_fields, NCOLS, "Bad number of fields, expected %d, got %d", 11, num_fields); int cur_row = 0; char nbuf[16]; while ((row = drizzle_row_next(result))) { cur_row ++; int sym, rowbase; /* 'sym' is the value used to decide which fields have NULLs or not. * 'rowbase' is the number that would be stored in the first field of this * row (assuming it's non-NULL). */ if (cur_row <= 64) { sym = cur_row - 1; rowbase = sym*NCOLS; } else { sym = cur_row - 65; rowbase = 1000 + sym*NCOLS; } #define NULLMAYBE(cn, b) if (sym & b) { ASSERT_NULL_(row[cn], "Column %d, row %d should be NULL", cn+1, cur_row); } else { ASSERT_NOT_NULL_(row[cn], "Column %d, row %d should not be NULL", cn+1, cur_row); sprintf(nbuf, "%d", rowbase+cn); ASSERT_STREQ(row[cn], nbuf); } #define NULLNEVER(cn) NULLMAYBE(cn, 0) NULLMAYBE(0, 0x01); NULLMAYBE(1, 0x02); NULLMAYBE(2, 0x04); NULLNEVER(3); NULLNEVER(4); NULLNEVER(5); NULLNEVER(6); NULLMAYBE(7, 0x08); NULLNEVER(8); NULLMAYBE(9, 0x10); NULLMAYBE(10, 0x20); #undef NULLMAYBE #undef NULLNEVER } ASSERT_EQ(cur_row, table_size); drizzle_result_free(result); #ifdef TEST_PREPARED_STATEMENTS strcpy(querybuf, "select a,b,c,d,e,f,g,h,i,j,k from test_nulls.t1 order by e"); sth = drizzle_stmt_prepare(con, querybuf, strlen(querybuf), &driz_ret); ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, preparing \"%s\"", drizzle_strerror(driz_ret), drizzle_error(con), querybuf); driz_ret = drizzle_stmt_execute(sth); ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, executing \"%s\"", drizzle_strerror(driz_ret), drizzle_error(con), querybuf); cur_row = 0; for (;;) { driz_ret = drizzle_stmt_fetch(sth); if (driz_ret == DRIZZLE_RETURN_ROW_END) break; cur_row ++; ASSERT_EQ_(driz_ret, DRIZZLE_RETURN_OK, "Error (%s): %s, fetching row #%d", drizzle_strerror(driz_ret), drizzle_error(con), cur_row); /* 'sym' is the value used to decide which fields have NULLs or not. * 'rowbase' is the number that would be stored in the first field of this * row (assuming it's non-NULL). */ int sym, rowbase; if (cur_row <= 64) { sym = cur_row - 1; rowbase = sym*NCOLS; } else { sym = cur_row - 65; rowbase = 1000 + sym*NCOLS; } bool isNull; uint32_t rowvalue; #define GETNULLNESS(cn) isNull = drizzle_stmt_get_is_null(sth, cn, &driz_ret); ASSERT_EQ(driz_ret, DRIZZLE_RETURN_OK); #define NULLNOTNOW(cn) ASSERT_FALSE_(isNull, "Column %d, row %d should not be NULL", cn+1, cur_row); rowvalue = drizzle_stmt_get_int(sth, cn, &driz_ret); ASSERT_EQ(driz_ret,DRIZZLE_RETURN_OK); ASSERT_EQ_(rowvalue, (unsigned)(rowbase + cn), "Column %d, row %d has unexpected data, expected: %d, got: %d", cn+1, cur_row, rowbase+cn, rowvalue); #define NULLMAYBE(cn, b) GETNULLNESS(cn); if (sym & b) { ASSERT_TRUE_(isNull, "Column %d, row %d should be NULL", cn+1, cur_row); } else { NULLNOTNOW(cn); } #define NULLNEVER(cn) GETNULLNESS(cn); NULLNOTNOW(cn); NULLMAYBE(0, 0x01); NULLMAYBE(1, 0x02); NULLMAYBE(2, 0x04); NULLNEVER(3); NULLNEVER(4); NULLNEVER(5); NULLNEVER(6); NULLMAYBE(7, 0x08); NULLNEVER(8); NULLMAYBE(9, 0x10); NULLMAYBE(10, 0x20); #undef NULLMAYBE #undef NULLNEVER #undef GETNULLNESS #undef NULLNOTNOW } ASSERT_EQ_(cur_row, table_size, "Current row not equal to table size, expected %d, got %d", table_size, cur_row); ASSERT_EQ(drizzle_stmt_close(sth), DRIZZLE_RETURN_OK); #endif CHECKED_QUERY("DROP TABLE test_nulls.t1"); ASSERT_EQ_(DRIZZLE_RETURN_OK, driz_ret, "DROP TABLE test_nulls.t1"); CHECKED_QUERY("DROP SCHEMA IF EXISTS test_nulls"); driz_ret= drizzle_quit(con); ASSERT_EQ_(DRIZZLE_RETURN_OK, driz_ret, "%s", drizzle_strerror(driz_ret)); free(querybuf); return EXIT_SUCCESS; }
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; }