blob: ebd502ca2b638c6ff92e4cf05920b5af50d5f80c [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COBALT_SRC_LIB_UTIL_CONSISTENT_PROTO_STORE_H_
#define COBALT_SRC_LIB_UTIL_CONSISTENT_PROTO_STORE_H_
#include <memory>
#include <string>
#include <google/protobuf/message_lite.h>
#include "src/lib/util/file_system.h"
#include "src/public/lib/status.h"
namespace cobalt::util {
// ConsistentProtoStore is a persistent store of a single protocol buffer
// message that guarantees consistent updates.
class ConsistentProtoStore {
public:
// Constructs a ConsistentProtoStore
//
// |filename| the fully qualified path of the file to store data in.
// |fs| is used for detecting the presence of, renaming, and deleting files.
explicit ConsistentProtoStore(std::string filename, FileSystem *fs);
// Alternate constructor, does not take a filename.
//
// If the ConsistentProtoStore is constructed this way, then the user must provide the filename
// when calling 'Write' or 'Read'.
//
// |fs| is used for detecting the presence of, renaming, and deleting files.
explicit ConsistentProtoStore(FileSystem *fs);
virtual ~ConsistentProtoStore() = default;
// Writes |proto| to the store, overwriting any previously written proto.
// Consistency is guaranteed in that if the operation fails, the previously
// written proto will not have been corrupted and may be read via the Read()
// method.
virtual Status Write(const google::protobuf::MessageLite &proto);
virtual Status Write(const std::string &filename, const google::protobuf::MessageLite &proto);
// Reads the previously written proto into |proto|.
//
// A failure either means that no proto has ever been written, or that the
// data is corrupt (does not represent a valid protocol buffer).
virtual Status Read(google::protobuf::MessageLite *proto);
virtual Status Read(const std::string &filename, google::protobuf::MessageLite *proto);
private:
friend class TestConsistentProtoStore;
virtual Status WriteToTmp(const std::string &tmp_filename,
const google::protobuf::MessageLite &proto);
virtual Status MoveTmpToOverride(const std::string &tmp_filename,
const std::string &override_filename);
virtual Status DeletePrimary(const std::string &primary_filename);
virtual Status MoveOverrideToPrimary(const std::string &override_filename,
const std::string &primary_filename);
// Primary filename is the base filename used for all operations. It is the
// filename that is passed into the constructor.
const std::string primary_filename_;
FileSystem *fs_;
};
} // namespace cobalt::util
#endif // COBALT_SRC_LIB_UTIL_CONSISTENT_PROTO_STORE_H_