2 * A MergeOperator for rocksdb that implements string append.
3 * @author Deon Nicholas (dnicholas@fb.com)
4 * Copyright 2013 Facebook
7 #include "stringappend.h"
13 #include "rocksdb/merge_operator.h"
14 #include "rocksdb/slice.h"
15 #include "rocksdb/utilities/options_type.h"
16 #include "utilities/merge_operators.h"
18 namespace ROCKSDB_NAMESPACE
{
20 static std::unordered_map
<std::string
, OptionTypeInfo
>
21 stringappend_merge_type_info
= {
24 {0, OptionType::kString
, OptionVerificationType::kNormal
,
25 OptionTypeFlags::kNone
}},
26 #endif // ROCKSDB_LITE
29 // Constructor: also specify the delimiter character.
30 StringAppendOperator::StringAppendOperator(char delim_char
)
31 : delim_(1, delim_char
) {
32 RegisterOptions("Delimiter", &delim_
, &stringappend_merge_type_info
);
35 StringAppendOperator::StringAppendOperator(const std::string
& delim
)
37 RegisterOptions("Delimiter", &delim_
, &stringappend_merge_type_info
);
40 // Implementation for the merge operation (concatenates two strings)
41 bool StringAppendOperator::Merge(const Slice
& /*key*/,
42 const Slice
* existing_value
,
43 const Slice
& value
, std::string
* new_value
,
44 Logger
* /*logger*/) const {
45 // Clear the *new_value for writing.
49 if (!existing_value
) {
50 // No existing_value. Set *new_value = value
51 new_value
->assign(value
.data(), value
.size());
53 // Generic append (existing_value != null).
54 // Reserve *new_value to correct size, and apply concatenation.
55 new_value
->reserve(existing_value
->size() + delim_
.size() + value
.size());
56 new_value
->assign(existing_value
->data(), existing_value
->size());
57 new_value
->append(delim_
);
58 new_value
->append(value
.data(), value
.size());
64 std::shared_ptr
<MergeOperator
> MergeOperators::CreateStringAppendOperator() {
65 return std::make_shared
<StringAppendOperator
>(',');
68 std::shared_ptr
<MergeOperator
> MergeOperators::CreateStringAppendOperator(
70 return std::make_shared
<StringAppendOperator
>(delim_char
);
73 std::shared_ptr
<MergeOperator
> MergeOperators::CreateStringAppendOperator(
74 const std::string
& delim
) {
75 return std::make_shared
<StringAppendOperator
>(delim
);
78 } // namespace ROCKSDB_NAMESPACE