stringappend.cc 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /**
  2. * A MergeOperator for rocksdb that implements string append.
  3. * @author Deon Nicholas (dnicholas@fb.com)
  4. * Copyright 2013 Facebook
  5. */
  6. #include "stringappend.h"
  7. #include <memory>
  8. #include <assert.h>
  9. #include "rocksdb/slice.h"
  10. #include "rocksdb/merge_operator.h"
  11. #include "utilities/merge_operators.h"
  12. namespace ROCKSDB_NAMESPACE {
  13. // Constructor: also specify the delimiter character.
  14. StringAppendOperator::StringAppendOperator(char delim_char)
  15. : delim_(delim_char) {
  16. }
  17. // Implementation for the merge operation (concatenates two strings)
  18. bool StringAppendOperator::Merge(const Slice& /*key*/,
  19. const Slice* existing_value,
  20. const Slice& value, std::string* new_value,
  21. Logger* /*logger*/) const {
  22. // Clear the *new_value for writing.
  23. assert(new_value);
  24. new_value->clear();
  25. if (!existing_value) {
  26. // No existing_value. Set *new_value = value
  27. new_value->assign(value.data(),value.size());
  28. } else {
  29. // Generic append (existing_value != null).
  30. // Reserve *new_value to correct size, and apply concatenation.
  31. new_value->reserve(existing_value->size() + 1 + value.size());
  32. new_value->assign(existing_value->data(),existing_value->size());
  33. new_value->append(1,delim_);
  34. new_value->append(value.data(), value.size());
  35. }
  36. return true;
  37. }
  38. const char* StringAppendOperator::Name() const {
  39. return "StringAppendOperator";
  40. }
  41. std::shared_ptr<MergeOperator> MergeOperators::CreateStringAppendOperator() {
  42. return std::make_shared<StringAppendOperator>(',');
  43. }
  44. std::shared_ptr<MergeOperator> MergeOperators::CreateStringAppendOperator(char delim_char) {
  45. return std::make_shared<StringAppendOperator>(delim_char);
  46. }
  47. } // namespace ROCKSDB_NAMESPACE