unsigned char* CassandraFS::read_block(CassUuid* physical_file_id, int block, int* bytes_read) { CassStatement* statement = cass_statement_new("SELECT data, size FROM file_blocks WHERE physical_file_id = ? AND block_number = ?", 2); cass_statement_bind_uuid(statement, 0, *physical_file_id); cass_statement_bind_int32(statement, 1, block); unsigned char* return_data = NULL; CassFuture* result_future = cass_session_execute(ctxt->session, statement); cass_statement_free(statement); if (cass_future_error_code(result_future) == CASS_OK) { const CassResult* result = cass_future_get_result(result_future); CassIterator* rows = cass_iterator_from_result(result); if (cass_iterator_next(rows)) { const CassRow* row = cass_iterator_get_row(rows); const CassValue* data_value = cass_row_get_column_by_name(row, "data"); const CassValue* size_value = cass_row_get_column_by_name(row, "size"); const cass_byte_t* cass_data; size_t size; int size2; cass_value_get_bytes(data_value, &cass_data, &size); cass_value_get_int32(size_value, &size2); // Let's use the value from "size" field unless bigger than the actual data. if (size2>size) { warning("Problem: size field is showing value %d which is bigger than the actual block data length %zu", size2, size); size2 = size; } return_data = (unsigned char*)malloc(size2); memcpy(return_data, cass_data, size2); (*bytes_read) = size2; } cass_result_free(result); cass_iterator_free(rows); } else { /* Handle error */ cassandra_log_error(result_future); } cass_future_free(result_future); return return_data; }
static CassError get(const CassValue* value, CassBytes* output) { return cass_value_get_bytes(value, &output->data, &output->size); }