| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | /** * A MergeOperator for rocksdb that implements string append. * @author Deon Nicholas (dnicholas@fb.com) * Copyright 2013 Facebook */#include "stringappend.h"#include <memory>#include <assert.h>#include "rocksdb/slice.h"#include "rocksdb/merge_operator.h"#include "utilities/merge_operators.h"namespace ROCKSDB_NAMESPACE {// Constructor: also specify the delimiter character.StringAppendOperator::StringAppendOperator(char delim_char)    : delim_(delim_char) {}// Implementation for the merge operation (concatenates two strings)bool StringAppendOperator::Merge(const Slice& /*key*/,                                 const Slice* existing_value,                                 const Slice& value, std::string* new_value,                                 Logger* /*logger*/) const {  // Clear the *new_value for writing.  assert(new_value);  new_value->clear();  if (!existing_value) {    // No existing_value. Set *new_value = value    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->append(value.data(), value.size());  }  return true;}const char* StringAppendOperator::Name() const  {  return "StringAppendOperator";}std::shared_ptr<MergeOperator> MergeOperators::CreateStringAppendOperator() {  return std::make_shared<StringAppendOperator>(',');}std::shared_ptr<MergeOperator> MergeOperators::CreateStringAppendOperator(char delim_char) {  return std::make_shared<StringAppendOperator>(delim_char);}}  // namespace ROCKSDB_NAMESPACE
 |