2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Jan Olszak <j.olszak@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @author Jan Olszak (j.olszak@samsung.com)
22 * @brief Declaration of a class for key-value storage in a sqlite3 database
25 #ifndef COMMON_CONFIG_KVSTORE_HPP
26 #define COMMON_CONFIG_KVSTORE_HPP
28 #include "config/sqlite3/connection.hpp"
29 #include "config/sqlite3/statement.hpp"
32 #include <initializer_list>
46 * @param path configuration database file path
48 KVStore(const std::string& path);
52 * Clears all the stored data
57 * @return Number of all stored values
62 * @param key string regexp of the stored values
64 * @return Number of values corresponding to the passed key
66 unsigned int count(const std::string& key);
69 * Removes values corresponding to the passed key.
70 * Many values may correspond to one key, so many values may
73 * @param key string regexp of the stored values
75 void remove(const std::string& key);
78 * Stores a single value corresponding to the passed key
80 * @param key string key of the value
81 * @param value value corresponding to the key
84 void set(const std::string& key, const T& value)
86 return setInternal(key, value);
90 * Gets the value corresponding to the key.
91 * Uses stringstreams to parse.
93 * @param key string key of the value
94 * @tparam T = std::string desired type of the return value
95 * @return value corresponding to the key
97 template<typename T = std::string>
98 T get(const std::string& key)
100 return getInternal(key, static_cast<T*>(nullptr));
105 typedef std::lock_guard<std::mutex> Lock;
107 void setInternal(const std::string& key, const std::string& value);
108 void setInternal(const std::string& key, const std::initializer_list<std::string>& values);
109 void setInternal(const std::string& key, const std::vector<std::string>& values);
111 void setInternal(const std::string& key, const T& value);
113 void setInternal(const std::string& key, const std::vector<T>& values);
115 std::string getInternal(const std::string& key, std::string*);
116 std::vector<std::string> getInternal(const std::string& key, std::vector<std::string>*);
118 T getInternal(const std::string& key, T*);
120 std::vector<T> getInternal(const std::string& key, std::vector<T>*);
124 sqlite3::Connection mConn;
125 std::unique_ptr<sqlite3::Statement> mGetValueStmt;
126 std::unique_ptr<sqlite3::Statement> mGetValueCountStmt;
127 std::unique_ptr<sqlite3::Statement> mGetSizeStmt;
128 std::unique_ptr<sqlite3::Statement> mGetValueListStmt;
129 std::unique_ptr<sqlite3::Statement> mSetValueStmt;
130 std::unique_ptr<sqlite3::Statement> mRemoveValuesStmt;
133 void prepareStatements();
135 void removeInternal(const std::string& key);
136 unsigned int countInternal(const std::string& key);
141 void KVStore::setInternal(const std::string& key, const T& value)
143 std::ostringstream oss;
145 setInternal(key, oss.str());
149 void KVStore::setInternal(const std::string& key, const std::vector<T>& values)
151 std::vector<std::string> strValues(values.size());
153 auto toString = [](const T & value) -> std::string {
154 std::ostringstream oss;
158 std::transform(values.begin(),
163 setInternal(key, strValues);
167 T KVStore::getInternal(const std::string& key, T*)
169 std::istringstream ss(getInternal(key, static_cast<std::string*>(nullptr)));
176 std::vector<T> KVStore::getInternal(const std::string& key, std::vector<T>*)
178 std::vector<std::string> strValues = getInternal(key, static_cast<std::vector<std::string>*>(nullptr));
179 std::vector<T> values(strValues.size());
181 auto parse = [](const std::string & strValue) -> T {
182 std::istringstream iss;
187 std::transform(strValues.begin(),
194 } // namespace config
196 #endif // COMMON_CONFIG_KVSTORE_HPP