blob: 8185a8a6dbc96961c8d0cb71ba7ba0b55c542e19 [file] [log] [blame]
Kun Yi68c81142018-12-18 11:17:14 -08001#pragma once
2
Patrick Venture15f0f942020-07-09 09:38:18 -07003#include "binarystore_interface.hpp"
Kun Yi2765b642019-01-16 11:11:24 -08004#include "sys_file.hpp"
5
Kun Yi64dc05c2018-12-19 13:19:03 -08006#include <unistd.h>
7
Kun Yi1a25e0d2020-05-11 12:28:53 -07008#include <blobs-ipmid/blobs.hpp>
Kun Yi68c81142018-12-18 11:17:14 -08009#include <cstdint>
Kun Yi64dc05c2018-12-19 13:19:03 -080010#include <memory>
Kun Yi68c81142018-12-18 11:17:14 -080011#include <string>
12#include <vector>
13
Kun Yi0a940b92019-01-07 16:33:11 -080014#include "binaryblob.pb.h"
15
Kun Yi68c81142018-12-18 11:17:14 -080016using std::size_t;
17using std::uint16_t;
18using std::uint32_t;
19using std::uint64_t;
20using std::uint8_t;
21
22namespace binstore
23{
24
25/**
Kun Yi64dc05c2018-12-19 13:19:03 -080026 * @class BinaryStore instantiates a concrete implementation of
27 * BinaryStoreInterface. The dependency on file is injected through its
28 * constructor.
29 */
30class BinaryStore : public BinaryStoreInterface
31{
32 public:
Kun Yi1a25e0d2020-05-11 12:28:53 -070033 /* |CommitState| differs slightly with |StateFlags| in blob.hpp,
34 * and thus is defined in the OEM space (bit 8 - 15). User can call stat()
35 * to query the |CommitState| of the blob path. */
36 enum CommitState
37 {
38 Dirty = (1 << 8), // In-memory data might not match persisted data
39 Clean = (1 << 9), // In-memory data matches persisted data
40 Uninitialized = (1 << 10), // Cannot find persisted data
41 CommitError = (1 << 11) // Error happened during committing
42 };
43
Kun Yi2765b642019-01-16 11:11:24 -080044 BinaryStore() = delete;
45 BinaryStore(const std::string& baseBlobId, std::unique_ptr<SysFile> file,
Kun Yi64dc05c2018-12-19 13:19:03 -080046 uint32_t maxSize) :
47 baseBlobId_(baseBlobId),
Kun Yi2765b642019-01-16 11:11:24 -080048 file_(std::move(file)), maxSize_(maxSize)
Kun Yi64dc05c2018-12-19 13:19:03 -080049 {
Kun Yi97be3af2019-03-05 22:43:41 -080050 blob_.set_blob_base_id(baseBlobId_);
Kun Yi64dc05c2018-12-19 13:19:03 -080051 }
52
Kun Yi64dc05c2018-12-19 13:19:03 -080053 ~BinaryStore() = default;
Kun Yi2765b642019-01-16 11:11:24 -080054
Kun Yi64dc05c2018-12-19 13:19:03 -080055 BinaryStore(const BinaryStore&) = delete;
56 BinaryStore& operator=(const BinaryStore&) = delete;
57 BinaryStore(BinaryStore&&) = default;
58 BinaryStore& operator=(BinaryStore&&) = default;
59
60 std::string getBaseBlobId() const override;
61 std::vector<std::string> getBlobIds() const override;
62 bool openOrCreateBlob(const std::string& blobId, uint16_t flags) override;
63 bool deleteBlob(const std::string& blobId) override;
64 std::vector<uint8_t> read(uint32_t offset, uint32_t requestedSize) override;
65 bool write(uint32_t offset, const std::vector<uint8_t>& data) override;
66 bool commit() override;
67 bool close() override;
Kun Yi1a25e0d2020-05-11 12:28:53 -070068 bool stat(blobs::BlobMeta* meta) override;
Kun Yi64dc05c2018-12-19 13:19:03 -080069
70 /**
71 * Helper factory method to create a BinaryStore instance
72 * @param baseBlobId: base id for the created instance
Kun Yi2765b642019-01-16 11:11:24 -080073 * @param sysFile: system file object for storing binary
Kun Yi64dc05c2018-12-19 13:19:03 -080074 * @param maxSize: max size in bytes that this BinaryStore can expand to.
75 * Writing data more than allowed size will return failure.
76 * @returns unique_ptr to constructed BinaryStore. Caller should take
77 * ownership of the instance.
78 */
79 static std::unique_ptr<BinaryStoreInterface>
80 createFromConfig(const std::string& baseBlobId,
Kun Yi2765b642019-01-16 11:11:24 -080081 std::unique_ptr<SysFile> file, uint32_t maxSize);
Kun Yi64dc05c2018-12-19 13:19:03 -080082
83 private:
Kun Yi97be3af2019-03-05 22:43:41 -080084 /* Load the serialized data from sysfile if commit state is dirty.
85 * Returns False if encountered error when loading */
86 bool loadSerializedData();
87
Kun Yi64dc05c2018-12-19 13:19:03 -080088 std::string baseBlobId_;
Kun Yi0a940b92019-01-07 16:33:11 -080089 binaryblobproto::BinaryBlobBase blob_;
Kun Yi2765b642019-01-16 11:11:24 -080090 binaryblobproto::BinaryBlob* currentBlob_ = nullptr;
Kun Yi6baa7132019-01-08 21:21:02 -080091 bool writable_ = false;
Kun Yi2765b642019-01-16 11:11:24 -080092 std::unique_ptr<SysFile> file_ = nullptr;
93 uint32_t maxSize_;
Kun Yid297c9f2019-01-09 13:52:30 -080094 CommitState commitState_ = CommitState::Dirty;
Kun Yi64dc05c2018-12-19 13:19:03 -080095};
96
Kun Yi68c81142018-12-18 11:17:14 -080097} // namespace binstore