2 Copyright (c) 2018-2019 Nokia.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
18 #include "private/error.hpp"
19 #include "private/abort.hpp"
20 #include "private/asyncstorageimpl.hpp"
21 #include "private/configurationreader.hpp"
22 #include "private/asyncdummystorage.hpp"
23 #include "private/engine.hpp"
24 #include "private/logger.hpp"
26 #include "private/redis/asyncredisstorage.hpp"
29 using namespace shareddatalayer;
30 using namespace shareddatalayer::redis;
34 std::shared_ptr<AsyncDatabaseDiscovery> asyncDatabaseDiscoveryCreator(std::shared_ptr<Engine> engine,
35 const DatabaseConfiguration& databaseConfiguration,
36 std::shared_ptr<Logger> logger)
38 return AsyncDatabaseDiscovery::create(engine,
40 databaseConfiguration,
45 AsyncStorageImpl::AsyncStorageImpl(std::shared_ptr<Engine> engine,
46 const boost::optional<PublisherId>& pId,
47 std::shared_ptr<Logger> logger):
49 databaseConfiguration(std::make_shared<DatabaseConfigurationImpl>()),
50 namespaceConfigurations(std::make_shared<NamespaceConfigurationsImpl>()),
53 asyncDatabaseDiscoveryCreator(::asyncDatabaseDiscoveryCreator)
55 ConfigurationReader configurationReader(logger);
56 configurationReader.readDatabaseConfiguration(std::ref(*databaseConfiguration));
57 configurationReader.readNamespaceConfigurations(std::ref(*namespaceConfigurations));
61 AsyncStorageImpl::AsyncStorageImpl(std::shared_ptr<Engine> engine,
62 const boost::optional<PublisherId>& pId,
63 std::shared_ptr<DatabaseConfiguration> databaseConfiguration,
64 std::shared_ptr<NamespaceConfigurations> namespaceConfigurations,
65 std::shared_ptr<Logger> logger,
66 const AsyncDatabaseDiscoveryCreator& asyncDatabaseDiscoveryCreator):
68 databaseConfiguration(databaseConfiguration),
69 namespaceConfigurations(namespaceConfigurations),
72 asyncDatabaseDiscoveryCreator(asyncDatabaseDiscoveryCreator)
76 AsyncStorage& AsyncStorageImpl::getRedisHandler()
79 static AsyncRedisStorage redisHandler{engine,
80 asyncDatabaseDiscoveryCreator(
82 std::ref(*databaseConfiguration),
85 namespaceConfigurations,
90 logger->error() << "Redis operations cannot be performed, Redis not enabled";
91 SHAREDDATALAYER_ABORT("Invalid configuration.");
95 AsyncStorage& AsyncStorageImpl::getDummyHandler()
97 static AsyncDummyStorage dummyHandler{engine};
101 AsyncStorage& AsyncStorageImpl::getOperationHandler(const std::string& ns)
103 if (namespaceConfigurations->isDbBackendUseEnabled(ns))
104 return getRedisHandler();
106 return getDummyHandler();
109 int AsyncStorageImpl::fd() const
114 void AsyncStorageImpl::handleEvents()
116 engine->handleEvents();
119 void AsyncStorageImpl::waitReadyAsync(const Namespace& ns,
120 const ReadyAck& readyAck)
122 getOperationHandler(ns).waitReadyAsync(ns, readyAck);
125 void AsyncStorageImpl::setAsync(const Namespace& ns,
126 const DataMap& dataMap,
127 const ModifyAck& modifyAck)
129 getOperationHandler(ns).setAsync(ns, dataMap, modifyAck);
132 void AsyncStorageImpl::setIfAsync(const Namespace& ns,
136 const ModifyIfAck& modifyIfAck)
138 getOperationHandler(ns).setIfAsync(ns, key, oldData, newData, modifyIfAck);
141 void AsyncStorageImpl::removeIfAsync(const Namespace& ns,
144 const ModifyIfAck& modifyIfAck)
146 getOperationHandler(ns).removeIfAsync(ns, key, data, modifyIfAck);
149 void AsyncStorageImpl::setIfNotExistsAsync(const Namespace& ns,
152 const ModifyIfAck& modifyIfAck)
154 getOperationHandler(ns).setIfNotExistsAsync(ns, key, data, modifyIfAck);
157 void AsyncStorageImpl::getAsync(const Namespace& ns,
159 const GetAck& getAck)
161 getOperationHandler(ns).getAsync(ns, keys, getAck);
164 void AsyncStorageImpl::removeAsync(const Namespace& ns,
166 const ModifyAck& modifyAck)
168 getOperationHandler(ns).removeAsync(ns, keys, modifyAck);
171 void AsyncStorageImpl::findKeysAsync(const Namespace& ns,
172 const std::string& keyPrefix,
173 const FindKeysAck& findKeysAck)
175 getOperationHandler(ns).findKeysAsync(ns, keyPrefix, findKeysAck);
178 void AsyncStorageImpl::removeAllAsync(const Namespace& ns,
179 const ModifyAck& modifyAck)
181 getOperationHandler(ns).removeAllAsync(ns, modifyAck);