• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef KV_STORE_NB_DELEGATE_IMPL_H
17 #define KV_STORE_NB_DELEGATE_IMPL_H
18 
19 #include <functional>
20 #include <map>
21 #include <mutex>
22 #include <string>
23 
24 #include "db_types.h"
25 #include "store_types.h"
26 #include "ikvdb_connection.h"
27 #include "kv_store_nb_conflict_data.h"
28 #include "kv_store_nb_delegate.h"
29 
30 namespace DistributedDB {
31 class KvStoreNbDelegateImpl final : public KvStoreNbDelegate {
32 public:
33     KvStoreNbDelegateImpl(IKvDBConnection *conn, const std::string &storeId);
34     ~KvStoreNbDelegateImpl() override;
35 
36     DISABLE_COPY_ASSIGN_MOVE(KvStoreNbDelegateImpl);
37 
38     // Public zone interfaces
39     DBStatus Get(const Key &key, Value &value) const override;
40 
41     DBStatus GetEntries(const Key &keyPrefix, std::vector<Entry> &entries) const override;
42 
43     DBStatus GetEntries(const Key &keyPrefix, KvStoreResultSet *&resultSet) const override;
44 
45     DBStatus GetEntries(const Query &query, std::vector<Entry> &entries) const override;
46 
47     DBStatus GetEntries(const Query &query, KvStoreResultSet *&resultSet) const override;
48 
49     DBStatus GetCount(const Query &query, int &count) const override;
50 
51     DBStatus CloseResultSet(KvStoreResultSet *&resultSet) override;
52 
53     DBStatus Put(const Key &key, const Value &value) override;
54 
55     DBStatus PutBatch(const std::vector<Entry> &entries) override;
56 
57     DBStatus DeleteBatch(const std::vector<Key> &keys) override;
58 
59     DBStatus Delete(const Key &key) override;
60 
61     // Local zone interfaces
62     DBStatus GetLocal(const Key &key, Value &value) const override;
63 
64     DBStatus GetLocalEntries(const Key &keyPrefix, std::vector<Entry> &entries) const override;
65 
66     DBStatus PutLocal(const Key &key, const Value &value) override;
67 
68     DBStatus DeleteLocal(const Key &key) override;
69 
70     DBStatus PublishLocal(const Key &key, bool deleteLocal, bool updateTimestamp,
71         const KvStoreNbPublishOnConflict &onConflict) override;
72 
73     DBStatus UnpublishToLocal(const Key &key, bool deletePublic, bool updateTimestamp) override;
74 
75     // Observer interfaces
76     DBStatus RegisterObserver(const Key &key, unsigned int mode, KvStoreObserver *observer) override;
77 
78     DBStatus UnRegisterObserver(const KvStoreObserver *observer) override;
79 
80     DBStatus RemoveDeviceData(const std::string &device) override;
81 
82     // Other interfaces
83     std::string GetStoreId() const override;
84 
85     // Sync function interface, if wait set true, this function will be blocked until sync finished
86     DBStatus Sync(const std::vector<std::string> &devices, SyncMode mode,
87         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete,
88         bool wait) override;
89 
90     // Special pragma interface, see PragmaCmd and PragmaData,
91     DBStatus Pragma(PragmaCmd cmd, PragmaData &paramData) override;
92 
93     // Set the conflict notifier for getting the specified type conflict data.
94     DBStatus SetConflictNotifier(int conflictType, const KvStoreNbConflictNotifier &notifier) override;
95 
96     // Rekey the database.
97     DBStatus Rekey(const CipherPassword &password) override;
98 
99     // Empty passwords represent non-encrypted files.
100     // Export existing database files to a specified database file in the specified directory.
101     DBStatus Export(const std::string &filePath, const CipherPassword &passwd, bool force) override;
102 
103     // Import the existing database files to the specified database file in the specified directory.
104     DBStatus Import(const std::string &filePath, const CipherPassword &passwd,
105         bool isNeedIntegrityCheck = false) override;
106 
107     // Start a transaction
108     DBStatus StartTransaction() override;
109 
110     // Commit a transaction
111     DBStatus Commit() override;
112 
113     // Rollback a transaction
114     DBStatus Rollback() override;
115 
116     DBStatus PutLocalBatch(const std::vector<Entry> &entries) override;
117 
118     DBStatus DeleteLocalBatch(const std::vector<Key> &keys) override;
119 
120     // Get the SecurityOption of this kvStore.
121     DBStatus GetSecurityOption(SecurityOption &option) const override;
122 
123     DBStatus SetRemotePushFinishedNotify(const RemotePushFinishedNotifier &notifier) override;
124 
125     void SetReleaseFlag(bool flag);
126 
127     DBStatus Close(bool isCloseImmediately = true);
128 
129     // Sync function interface, if wait set true, this function will be blocked until sync finished.
130     // Param query used to filter the records to be synchronized.
131     // Now just support push mode and query by prefixKey.
132     DBStatus Sync(const std::vector<std::string> &devices, SyncMode mode,
133         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete,
134         const Query &query, bool wait) override;
135 
136     // Sync with devices, provides sync count information
137     DBStatus Sync(const DeviceSyncOption &option, const DeviceSyncProcessCallback &onProcess) override;
138 
139     DBStatus Sync(const DeviceSyncOption &option,
140         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete) override;
141 
142     // Cancel sync by syncId
143     DBStatus CancelSync(uint32_t syncId) override;
144 
145     DBStatus CheckIntegrity() const override;
146 
147     // Set an equal identifier for this database, After this called, send msg to the target will use this identifier
148     DBStatus SetEqualIdentifier(const std::string &identifier, const std::vector<std::string> &targets) override;
149 
150     DBStatus SetPushDataInterceptor(const PushDataInterceptor &interceptor) override;
151 
152     // Register a subscriber query on peer devices. The data in the peer device meets the subscriber query condition
153     // will automatically push to the local device when it's changed.
154     DBStatus SubscribeRemoteQuery(const std::vector<std::string> &devices,
155         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete,
156         const Query &query, bool wait) override;
157 
158     // Unregister a subscriber query on peer devices.
159     DBStatus UnSubscribeRemoteQuery(const std::vector<std::string> &devices,
160         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete,
161         const Query &query, bool wait) override;
162 
163     DBStatus RemoveDeviceData() override;
164 
165     DBStatus GetKeys(const Key &keyPrefix, std::vector<Key> &keys) const override;
166 
167     size_t GetSyncDataSize(const std::string &device) const override;
168 
169     // update all key in sync_data which is not deleted data
170     DBStatus UpdateKey(const UpdateKeyCallback &callback) override;
171 
172     std::pair<DBStatus, WatermarkInfo> GetWatermarkInfo(const std::string &device) override;
173 
174     DBStatus RemoveDeviceData(const std::string &device, ClearMode mode) override;
175 
176     DBStatus RemoveDeviceData(const std::string &device, const std::string &user, ClearMode mode) override;
177 
178     int32_t GetTaskCount() override;
179 
180     DBStatus SetReceiveDataInterceptor(const DataInterceptor &interceptor) override;
181 
182     DBStatus GetDeviceEntries(const std::string &device, std::vector<Entry> &entries) const override;
183 
184     DatabaseStatus GetDatabaseStatus() const override;
185 
186 #ifdef USE_DISTRIBUTEDDB_CLOUD
187     DBStatus Sync(const CloudSyncOption &option, const SyncProcessCallback &onProcess) override;
188 
189     DBStatus SetCloudDB(const std::map<std::string, std::shared_ptr<ICloudDb>> &cloudDBs) override;
190 
191     DBStatus SetCloudDbSchema(const std::map<std::string, DataBaseSchema> &schema) override;
192 
193     void SetGenCloudVersionCallback(const GenerateCloudVersionCallback &callback) override;
194 
195     DBStatus SetCloudSyncConfig(const CloudSyncConfig &config) override;
196 
197     std::pair<DBStatus, std::map<std::string, std::string>> GetCloudVersion(const std::string &device) override;
198 
199     DBStatus ClearMetaData(ClearKvMetaDataOption option) override;
200 #endif
201 
202     DBStatus OperateDataStatus(uint32_t dataOperator) override;
203 
204     void SetHandle(void *handle);
205 
206 private:
207     DBStatus GetInner(const IOption &option, const Key &key, Value &value) const;
208     DBStatus PutInner(const IOption &option, const Key &key, const Value &value);
209     DBStatus DeleteInner(const IOption &option, const Key &key);
210     DBStatus GetEntriesInner(const IOption &option, const Key &keyPrefix, std::vector<Entry> &entries) const;
211 
212     void OnSyncComplete(const std::map<std::string, int> &statuses,
213         const std::function<void(const std::map<std::string, DBStatus> &devicesMap)> &onComplete) const;
214 
215     void OnDeviceSyncProcess(const std::map<std::string, DeviceSyncProcess> &processMap,
216         const DeviceSyncProcessCallback &onProcess) const;
217 
218     DBStatus RegisterDeviceObserver(const Key &key, unsigned int mode, KvStoreObserver *observer);
219 
220     DBStatus RegisterCloudObserver(const Key &key, unsigned int mode, KvStoreObserver *observer);
221 
222     DBStatus UnRegisterDeviceObserver(const KvStoreObserver *observer);
223 
224     DBStatus UnRegisterCloudObserver(const KvStoreObserver *observer);
225 
226     DBStatus CheckDeviceObserver(const Key &key, unsigned int mode, KvStoreObserver *observer);
227 
228     DBStatus CheckCloudObserver(KvStoreObserver *observer);
229 
230     IKvDBConnection *conn_;
231     std::string storeId_;
232     bool releaseFlag_;
233 #ifndef _WIN32
234     mutable std::mutex libMutex_;
235     void *dlHandle_ = nullptr;
236 #endif
237     std::mutex observerMapLock_;
238     std::map<const KvStoreObserver *, const KvDBObserverHandle *> observerMap_;
239     std::map<const KvStoreObserver *, unsigned int> cloudObserverMap_;
240 };
241 } // namespace DistributedDB
242 
243 #endif // KV_STORE_NB_DELEGATE_IMPL_H
244