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