1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| struct rocksdb_mergeoperator_t : public MergeOperator { void* state_; void (*destructor_)(void*); const char* (*name_)(void*); char* (*full_merge_)( void*, const char* key, size_t key_length, const char* existing_value, size_t existing_value_length, const char* const* operands_list, const size_t* operands_list_length, int num_operands, unsigned char* success, size_t* new_value_length); char* (*partial_merge_)(void*, const char* key, size_t key_length, const char* const* operands_list, const size_t* operands_list_length, int num_operands, unsigned char* success, size_t* new_value_length); void (*delete_value_)( void*, const char* value, size_t value_length);
~rocksdb_mergeoperator_t() override { (*destructor_)(state_); }
const char* Name() const override { return (*name_)(state_); }
bool FullMergeV2(const MergeOperationInput& merge_in, MergeOperationOutput* merge_out) const override { size_t n = merge_in.operand_list.size(); std::vector<const char*> operand_pointers(n); std::vector<size_t> operand_sizes(n); for (size_t i = 0; i < n; i++) { Slice operand(merge_in.operand_list[i]); operand_pointers[i] = operand.data(); operand_sizes[i] = operand.size(); }
const char* existing_value_data = nullptr; size_t existing_value_len = 0; if (merge_in.existing_value != nullptr) { existing_value_data = merge_in.existing_value->data(); existing_value_len = merge_in.existing_value->size(); }
unsigned char success; size_t new_value_len; char* tmp_new_value = (*full_merge_)( state_, merge_in.key.data(), merge_in.key.size(), existing_value_data, existing_value_len, &operand_pointers[0], &operand_sizes[0], static_cast<int>(n), &success, &new_value_len); merge_out->new_value.assign(tmp_new_value, new_value_len);
if (delete_value_ != nullptr) { (*delete_value_)(state_, tmp_new_value, new_value_len); } else { free(tmp_new_value); }
return success; }
bool PartialMergeMulti(const Slice& key, const std::deque<Slice>& operand_list, std::string* new_value, Logger* ) const override { size_t operand_count = operand_list.size(); std::vector<const char*> operand_pointers(operand_count); std::vector<size_t> operand_sizes(operand_count); for (size_t i = 0; i < operand_count; ++i) { Slice operand(operand_list[i]); operand_pointers[i] = operand.data(); operand_sizes[i] = operand.size(); }
unsigned char success; size_t new_value_len; char* tmp_new_value = (*partial_merge_)( state_, key.data(), key.size(), &operand_pointers[0], &operand_sizes[0], static_cast<int>(operand_count), &success, &new_value_len); new_value->assign(tmp_new_value, new_value_len);
if (delete_value_ != nullptr) { (*delete_value_)(state_, tmp_new_value, new_value_len); } else { free(tmp_new_value); }
return success; } };
|