#pragma once #include #include #include namespace DB { /// Implementation of IAccessStorage which contains multiple nested storages. class MultipleAccessStorage : public IAccessStorage { public: using Storage = IAccessStorage; MultipleAccessStorage(std::vector> nested_storages_); std::vector findMultiple(std::type_index type, const String & name) const; template std::vector findMultiple(const String & name) const { return findMultiple(EntityType::TYPE, name); } const Storage * findStorage(const UUID & id) const; Storage * findStorage(const UUID & id); const Storage & getStorage(const UUID & id) const; Storage & getStorage(const UUID & id); Storage & getStorageByIndex(size_t i) { return *(nested_storages[i]); } const Storage & getStorageByIndex(size_t i) const { return *(nested_storages[i]); } protected: std::optional findImpl(std::type_index type, const String & name) const override; std::vector findAllImpl(std::type_index type) const override; bool existsImpl(const UUID & id) const override; AccessEntityPtr readImpl(const UUID & id) const override; String readNameImpl(const UUID &id) const override; bool canInsertImpl(const AccessEntityPtr & entity) const override; UUID insertImpl(const AccessEntityPtr & entity, bool replace_if_exists) override; void removeImpl(const UUID & id) override; void updateImpl(const UUID & id, const UpdateFunc & update_func) override; ext::scope_guard subscribeForChangesImpl(const UUID & id, const OnChangedHandler & handler) const override; ext::scope_guard subscribeForChangesImpl(std::type_index type, const OnChangedHandler & handler) const override; bool hasSubscriptionImpl(const UUID & id) const override; bool hasSubscriptionImpl(std::type_index type) const override; private: std::vector> nested_storages; mutable LRUCache ids_cache; mutable std::mutex ids_cache_mutex; }; }