Esempio n. 1
1
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;
}
Esempio n. 2
0
 static CassError get(const CassValue* value, CassBytes* output) {
   return cass_value_get_bytes(value, &output->data, &output->size);
 }