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 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
#include "rocksdb/merge_operator.h"
using std::string;
using std::deque;
using rocksdb::Slice;
using rocksdb::Logger;
using rocksdb::MergeOperator;
using rocksdb::AssociativeMergeOperator;
namespace py_rocks {
class AssociativeMergeOperatorWrapper: public AssociativeMergeOperator {
public:
typedef bool (*merge_func)(
void*,
const Slice& key,
const Slice* existing_value,
const Slice& value,
std::string* new_value,
Logger* logger);
AssociativeMergeOperatorWrapper(
string name,
void* merge_context,
merge_func merge_callback):
name(name),
merge_context(merge_context),
merge_callback(merge_callback)
{}
virtual bool Merge(
const Slice& key,
const Slice* existing_value,
const Slice& value,
std::string* new_value,
Logger* logger) const
{
return this->merge_callback(
this->merge_context,
key,
existing_value,
value,
new_value,
logger);
}
virtual const char* Name() const {
return this->name.c_str();
}
private:
string name;
void* merge_context;
merge_func merge_callback;
};
class MergeOperatorWrapper: public MergeOperator {
public:
typedef bool (*full_merge_func)(
void* ctx,
const Slice& key,
const Slice* existing_value,
const deque<string>& operand_list,
string* new_value,
Logger* logger);
typedef bool (*partial_merge_func)(
void* ctx,
const Slice& key,
const Slice& left_op,
const Slice& right_op,
string* new_value,
Logger* logger);
MergeOperatorWrapper(
string name,
void* full_merge_context,
void* partial_merge_context,
full_merge_func full_merge_callback,
partial_merge_func partial_merge_callback):
name(name),
full_merge_context(full_merge_context),
partial_merge_context(partial_merge_context),
full_merge_callback(full_merge_callback),
partial_merge_callback(partial_merge_callback)
{}
virtual bool FullMerge(
const Slice& key,
const Slice* existing_value,
const deque<string>& operand_list,
string* new_value,
Logger* logger) const
{
return this->full_merge_callback(
this->full_merge_context,
key,
existing_value,
operand_list,
new_value,
logger);
}
virtual bool PartialMerge (
const Slice& key,
const Slice& left_operand,
const Slice& right_operand,
string* new_value,
Logger* logger) const
{
return this->partial_merge_callback(
this->partial_merge_context,
key,
left_operand,
right_operand,
new_value,
logger);
}
virtual const char* Name() const {
return this->name.c_str();
}
private:
string name;
void* full_merge_context;
void* partial_merge_context;
full_merge_func full_merge_callback;
partial_merge_func partial_merge_callback;
};
}
|