1
#pragma once
2

            
3
#include "envoy/common/key_value_store.h"
4
#include "envoy/config/common/key_value/v3/config.pb.h"
5
#include "envoy/config/common/key_value/v3/config.pb.validate.h"
6
#include "envoy/extensions/key_value/file_based/v3/config.pb.h"
7
#include "envoy/extensions/key_value/file_based/v3/config.pb.validate.h"
8

            
9
#include "source/common/common/key_value_store_base.h"
10

            
11
namespace Envoy {
12
namespace Extensions {
13
namespace KeyValue {
14

            
15
// A filesystem based key value store, which loads from and flushes to the file
16
// provided.
17
//
18
// All keys and values are flushed to a single file as
19
// [length]\n[key][length]\n[value]
20
class FileBasedKeyValueStore : public KeyValueStoreBase {
21
public:
22
  FileBasedKeyValueStore(Event::Dispatcher& dispatcher, std::chrono::milliseconds flush_interval,
23
                         Filesystem::Instance& file_system, const std::string& filename,
24
                         uint32_t max_entries);
25
  // KeyValueStore
26
  void flush() override;
27

            
28
private:
29
  Filesystem::Instance& file_system_;
30
  const std::string filename_;
31
};
32

            
33
class FileBasedKeyValueStoreFactory : public KeyValueStoreFactory {
34
public:
35
  // KeyValueStoreFactory
36
  KeyValueStorePtr createStore(const Protobuf::Message& config,
37
                               ProtobufMessage::ValidationVisitor& validation_visitor,
38
                               Event::Dispatcher& dispatcher,
39
                               Filesystem::Instance& file_system) override;
40

            
41
  // TypedFactory
42
10
  ProtobufTypes::MessagePtr createEmptyConfigProto() override {
43
10
    return ProtobufTypes::MessagePtr{
44
10
        new envoy::extensions::key_value::file_based::v3::FileBasedKeyValueStoreConfig()};
45
10
  }
46

            
47
364
  std::string name() const override { return "envoy.key_value.file_based"; }
48
};
49

            
50
} // namespace KeyValue
51
} // namespace Extensions
52
} // namespace Envoy