#pragma once #include "Hash.hpp" #include "DataView.hpp" #include "Signature.hpp" #include "Encryption.hpp" #include #include namespace odhtdb { class Group; struct DatabaseStorageObject { DataView data; u64 timestamp; // In microseconds Signature::PublicKey creatorPublicKey; DatabaseStorageObject(DataView &_data, u64 _timestamp, const Signature::PublicKey &_creatorPublicKey) : data(_data), timestamp(_timestamp), creatorPublicKey(_creatorPublicKey) { } }; struct DatabaseStorageObjectList { u64 timestamp; // In microseconds std::vector groups; std::vector objects; u8 *createData; usize createDataSize; }; class DatabaseStorageAlreadyExists : public std::runtime_error { public: DatabaseStorageAlreadyExists(const std::string &errMsg) : std::runtime_error(errMsg) {} }; class DatabaseStorageNotFound : public std::runtime_error { public: DatabaseStorageNotFound(const std::string &errMsg) : std::runtime_error(errMsg) {} }; using DatabaseStorageMap = MapHashKey; class DatabaseStorage { public: // Throws DatabaseStorageAlreadyExists if data with hash already exists void createStorage(const Hash &hash, Group *creatorGroup, u64 timestamp, const u8 *data, usize dataSize); // Throws DatabaseStorageNotFound if data with hash does not exist void appendStorage(const Hash &hash, DataView &data, u64 timestamp, const Signature::PublicKey &creatorPublicKey); // Returns nullptr if not storage with provided hash exists const DatabaseStorageObjectList* getStorage(const Hash &hash) const; private: DatabaseStorageMap storageMap; }; }