X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;ds=sidebyside;f=ceph%2Fsrc%2Frocksdb%2Futilities%2Fmerge_operators%2Fstring_append%2Fstringappend.cc;h=5092cabcb45defd5239fdef8c424da3a9cd8401d;hb=1e59de90020f1d8d374046ef9cca56ccd4e806e2;hp=534f7a5661355f13a317c525f9a8f96eb19a59b6;hpb=bd41e436e25044e8e83156060a37c23cb661c364;p=ceph.git diff --git a/ceph/src/rocksdb/utilities/merge_operators/string_append/stringappend.cc b/ceph/src/rocksdb/utilities/merge_operators/string_append/stringappend.cc index 534f7a566..5092cabcb 100644 --- a/ceph/src/rocksdb/utilities/merge_operators/string_append/stringappend.cc +++ b/ceph/src/rocksdb/utilities/merge_operators/string_append/stringappend.cc @@ -6,18 +6,35 @@ #include "stringappend.h" -#include #include -#include "rocksdb/slice.h" +#include + #include "rocksdb/merge_operator.h" +#include "rocksdb/slice.h" +#include "rocksdb/utilities/options_type.h" #include "utilities/merge_operators.h" namespace ROCKSDB_NAMESPACE { - +namespace { +static std::unordered_map + stringappend_merge_type_info = { +#ifndef ROCKSDB_LITE + {"delimiter", + {0, OptionType::kString, OptionVerificationType::kNormal, + OptionTypeFlags::kNone}}, +#endif // ROCKSDB_LITE +}; +} // namespace // Constructor: also specify the delimiter character. StringAppendOperator::StringAppendOperator(char delim_char) - : delim_(delim_char) { + : delim_(1, delim_char) { + RegisterOptions("Delimiter", &delim_, &stringappend_merge_type_info); +} + +StringAppendOperator::StringAppendOperator(const std::string& delim) + : delim_(delim) { + RegisterOptions("Delimiter", &delim_, &stringappend_merge_type_info); } // Implementation for the merge operation (concatenates two strings) @@ -31,29 +48,31 @@ bool StringAppendOperator::Merge(const Slice& /*key*/, if (!existing_value) { // No existing_value. Set *new_value = value - new_value->assign(value.data(),value.size()); + new_value->assign(value.data(), value.size()); } else { // Generic append (existing_value != null). // Reserve *new_value to correct size, and apply concatenation. - new_value->reserve(existing_value->size() + 1 + value.size()); - new_value->assign(existing_value->data(),existing_value->size()); - new_value->append(1,delim_); + new_value->reserve(existing_value->size() + delim_.size() + value.size()); + new_value->assign(existing_value->data(), existing_value->size()); + new_value->append(delim_); new_value->append(value.data(), value.size()); } return true; } -const char* StringAppendOperator::Name() const { - return "StringAppendOperator"; -} - std::shared_ptr MergeOperators::CreateStringAppendOperator() { return std::make_shared(','); } -std::shared_ptr MergeOperators::CreateStringAppendOperator(char delim_char) { +std::shared_ptr MergeOperators::CreateStringAppendOperator( + char delim_char) { return std::make_shared(delim_char); } +std::shared_ptr MergeOperators::CreateStringAppendOperator( + const std::string& delim) { + return std::make_shared(delim); +} + } // namespace ROCKSDB_NAMESPACE