1 /*
2 * Copyright (c) 2023 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 #include "rd_single_ver_storage_executor.h"
16
17 #include <algorithm>
18 #include <string>
19
20 #include "db_common.h"
21 #include "grd_base/grd_db_api.h"
22 #include "grd_document/grd_document_api.h"
23 #include "grd_base/grd_error.h"
24 #include "grd_base/grd_resultset_api.h"
25 #include "grd_base/grd_type_export.h"
26 #include "ikvdb_result_set.h"
27 #include "rd_utils.h"
28 #include "sqlite_single_ver_storage_executor_sql.h"
29
30 namespace DistributedDB {
RDStorageExecutor(GRD_DB * db,bool isWrite)31 RDStorageExecutor::RDStorageExecutor(GRD_DB *db, bool isWrite) : StorageExecutor(isWrite), db_(db)
32 {
33 }
34
~RDStorageExecutor()35 RDStorageExecutor::~RDStorageExecutor()
36 {
37 }
38
Reset()39 int RDStorageExecutor::Reset()
40 {
41 return -E_NOT_SUPPORT;
42 }
43
GetDbHandle(GRD_DB * & dbHandle) const44 int RDStorageExecutor::GetDbHandle(GRD_DB *&dbHandle) const
45 {
46 dbHandle = db_;
47 return E_OK;
48 }
49
RdSingleVerStorageExecutor(GRD_DB * db,bool isWrite)50 RdSingleVerStorageExecutor::RdSingleVerStorageExecutor(GRD_DB *db, bool isWrite) : RDStorageExecutor(db, isWrite)
51 {
52 LOGD("[RdSingleVerStorageExecutor] RdSingleVerStorageExecutor Created");
53 }
54
~RdSingleVerStorageExecutor()55 RdSingleVerStorageExecutor::~RdSingleVerStorageExecutor()
56 {
57 int ret = GRD_OK;
58 if (db_ != nullptr) {
59 ret = RdDBClose(db_, 0);
60 LOGD("[RdSingleVerStorageExecutor] rd has been closed");
61 }
62 if (ret != GRD_OK) {
63 LOGE("Can not close db %d", ret);
64 }
65 db_ = nullptr;
66 LOGD("[RdSingleVerStorageExecutor] RdSingleVerStorageExecutor has been deconstructed");
67 }
68
OpenResultSet(const Key & key,GRD_KvScanModeE mode,GRD_ResultSet ** resultSet)69 int RdSingleVerStorageExecutor::OpenResultSet(const Key &key, GRD_KvScanModeE mode, GRD_ResultSet **resultSet)
70 {
71 int errCode = RdKVScan(db_, SYNC_COLLECTION_NAME, key, mode, resultSet);
72 if (errCode != E_OK) {
73 LOGE("Can not open rd result set.");
74 }
75 return errCode;
76 }
77
OpenResultSet(const Key & beginKey,const Key & endKey,GRD_ResultSet ** resultSet)78 int RdSingleVerStorageExecutor::OpenResultSet(const Key &beginKey, const Key &endKey, GRD_ResultSet **resultSet)
79 {
80 int errCode = RdKVRangeScan(db_, SYNC_COLLECTION_NAME, beginKey, endKey, resultSet);
81 if (errCode != E_OK) {
82 LOGE("Can not open rd result set.");
83 }
84 return errCode;
85 }
86
CloseResultSet(GRD_ResultSet * resultSet)87 int RdSingleVerStorageExecutor::CloseResultSet(GRD_ResultSet *resultSet)
88 {
89 int errCode = RdFreeResultSet(resultSet);
90 if (errCode != E_OK) {
91 LOGE("[RdSingleVerStorageExecutor] failed to free result set.");
92 }
93 return errCode;
94 }
95
InnerMoveToHead(const int position,GRD_ResultSet * resultSet,int & currPosition)96 int RdSingleVerStorageExecutor::InnerMoveToHead(const int position, GRD_ResultSet *resultSet, int &currPosition)
97 {
98 int errCode = E_OK;
99 while (true) { // LCOV_EXCL_BR_LINE
100 errCode = TransferGrdErrno(GRD_Prev(resultSet));
101 if (errCode == -E_NOT_FOUND) { // LCOV_EXCL_BR_LINE
102 currPosition = 0;
103 int ret = TransferGrdErrno(GRD_Next(resultSet));
104 if (ret != E_OK) { // LCOV_EXCL_BR_LINE
105 LOGE("[RdSingleVerStorageExecutor] failed to move next for result set.");
106 currPosition = position <= INIT_POSITION ? INIT_POSITION : currPosition;
107 return ret;
108 }
109 ret = TransferGrdErrno(GRD_Prev(resultSet));
110 if (ret != E_OK) { // LCOV_EXCL_BR_LINE
111 LOGE("[RdSingleVerStorageExecutor] failed to move prev for result set.");
112 return ret;
113 }
114 break;
115 } else if (errCode != E_OK) {
116 LOGE("[RdSingleVerStorageExecutor] failed to move prev for result set.");
117 return errCode;
118 }
119 currPosition--;
120 }
121 return E_OK;
122 }
123
MoveTo(const int position,GRD_ResultSet * resultSet,int & currPosition)124 int RdSingleVerStorageExecutor::MoveTo(const int position, GRD_ResultSet *resultSet, int &currPosition)
125 {
126 int errCode = E_OK; // incase it never been move before
127 if (currPosition == INIT_POSITION) { // LCOV_EXCL_BR_LINE
128 errCode = TransferGrdErrno(GRD_Next(resultSet)); // but when we have only 1 element ?
129 if (errCode == -E_NOT_FOUND) { // LCOV_EXCL_BR_LINE
130 LOGE("[RdSingleVerStorageExecutor] result set is empty when move to");
131 return -E_RESULT_SET_EMPTY;
132 }
133 if (errCode != E_OK) { // LCOV_EXCL_BR_LINE
134 LOGE("[RdSingleVerStorageExecutor] failed to move next for result set.");
135 return errCode;
136 }
137 currPosition++;
138 }
139 errCode = InnerMoveToHead(position, resultSet, currPosition);
140 if (errCode != E_OK) { // LCOV_EXCL_BR_LINE
141 return errCode;
142 }
143 if (position <= INIT_POSITION) { // LCOV_EXCL_BR_LINE
144 LOGE("[RdSingleVerStorageExecutor] current position must > -1 when move to.");
145 int ret = TransferGrdErrno(GRD_Prev(resultSet));
146 if (ret != E_OK && ret != -E_NOT_FOUND) {
147 LOGE("[RdSingleVerStorageExecutor] failed to move prev for result set.");
148 return ret;
149 }
150 currPosition = -1;
151 return -E_INVALID_ARGS;
152 }
153 currPosition = 0;
154 while (currPosition < position) { // LCOV_EXCL_BR_LINE
155 errCode = TransferGrdErrno(GRD_Next(resultSet));
156 if (errCode == -E_NOT_FOUND) { // LCOV_EXCL_BR_LINE
157 LOGE("[RdSingleVerStorageExecutor] move to position: %d, out of bounds", position);
158 currPosition++;
159 return -E_INVALID_ARGS;
160 } else if (errCode != E_OK) {
161 LOGE("[RdSingleVerStorageExecutor] failed to move next for result set.");
162 return errCode;
163 }
164 currPosition++;
165 }
166 return E_OK;
167 }
168
MoveToNext(GRD_ResultSet * resultSet)169 int RdSingleVerStorageExecutor::MoveToNext(GRD_ResultSet *resultSet)
170 {
171 int errCode = TransferGrdErrno(GRD_Next(resultSet));
172 if (errCode != E_OK && errCode != -E_NOT_FOUND) {
173 LOGE("[RdSingleVerStorageExecutor] failed to move next for result set.");
174 }
175 return errCode;
176 }
177
MoveToPrev(GRD_ResultSet * resultSet)178 int RdSingleVerStorageExecutor::MoveToPrev(GRD_ResultSet *resultSet)
179 {
180 int errCode = TransferGrdErrno(GRD_Prev(resultSet));
181 if (errCode != E_OK && errCode != -E_NOT_FOUND) {
182 LOGE("[RdSingleVerStorageExecutor] failed to move prev for result set.");
183 }
184 return errCode;
185 }
186
GetEntry(GRD_ResultSet * resultSet,Entry & entry)187 int RdSingleVerStorageExecutor::GetEntry(GRD_ResultSet *resultSet, Entry &entry)
188 {
189 int errCode = RdKvFetch(resultSet, entry.key, entry.value);
190 if (errCode != E_OK && errCode != -E_NOT_FOUND) {
191 LOGE("[RdSingleVerStorageExecutor] failed to get entry form result set.");
192 }
193 return errCode;
194 }
195
GetCountInner(GRD_ResultSet * tmpResultSet,int & count)196 int RdSingleVerStorageExecutor::GetCountInner(GRD_ResultSet *tmpResultSet, int &count)
197 {
198 bool isFirstMove = true;
199 int ret = E_OK;
200 int errCode = E_OK;
201 while (errCode == E_OK) {
202 errCode = TransferGrdErrno(GRD_Next(tmpResultSet));
203 if (isFirstMove && errCode == -E_NOT_FOUND) {
204 ret = CloseResultSet(tmpResultSet);
205 if (ret != E_OK) {
206 return ret;
207 }
208 return -E_RESULT_SET_EMPTY;
209 } else if (errCode == -E_NOT_FOUND) {
210 break;
211 } else if (errCode != E_OK) {
212 LOGE("[RdSingleVerStorageExecutor] failed to get count when move next.");
213 ret = CloseResultSet(tmpResultSet);
214 if (ret != E_OK) {
215 return ret;
216 }
217 return errCode;
218 }
219 ++count;
220 isFirstMove = false;
221 }
222 ret = CloseResultSet(tmpResultSet);
223 if (ret != E_OK) {
224 return ret;
225 }
226 return E_OK;
227 }
228
GetCount(const Key & key,int & count,GRD_KvScanModeE kvScanMode)229 int RdSingleVerStorageExecutor::GetCount(const Key &key, int &count, GRD_KvScanModeE kvScanMode)
230 {
231 count = 0;
232 GRD_ResultSet *tmpResultSet = nullptr;
233 int errCode = RdKVScan(db_, SYNC_COLLECTION_NAME, key, kvScanMode, &tmpResultSet);
234 if (errCode != E_OK) {
235 LOGE("[RdSingleVerStorageExecutor] failed to get count for current key.");
236 return errCode;
237 }
238 return GetCountInner(tmpResultSet, count);
239 }
240
GetCount(const Key & beginKey,const Key & endKey,int & count,GRD_KvScanModeE kvScanMode)241 int RdSingleVerStorageExecutor::GetCount(const Key &beginKey, const Key &endKey, int &count, GRD_KvScanModeE kvScanMode)
242 {
243 count = 0;
244 GRD_ResultSet *tmpResultSet = nullptr;
245 int errCode = RdKVRangeScan(db_, SYNC_COLLECTION_NAME, beginKey, endKey, &tmpResultSet);
246 if (errCode != E_OK) {
247 LOGE("[RdSingleVerStorageExecutor] failed to get count for current key.");
248 return errCode;
249 }
250 return GetCountInner(tmpResultSet, count);
251 }
252
PrepareNotifyForEntries(const std::vector<Entry> & entries,SingleVerNaturalStoreCommitNotifyData * committedData,std::vector<NotifyConflictAndObserverData> & notifys,bool isDelete)253 int RdSingleVerStorageExecutor::PrepareNotifyForEntries(const std::vector<Entry> &entries,
254 SingleVerNaturalStoreCommitNotifyData *committedData, std::vector<NotifyConflictAndObserverData> ¬ifys,
255 bool isDelete)
256 {
257 for (const auto &entry : entries) {
258 NotifyConflictAndObserverData notify = {
259 .committedData = committedData
260 };
261 int errCode = PrepareForNotifyConflictAndObserver(entry, notify, isDelete);
262 if (errCode != E_OK) {
263 return errCode;
264 }
265 notifys.push_back(notify);
266 }
267 return E_OK;
268 }
269
GetKvData(SingleVerDataType type,const Key & key,Value & value,Timestamp & timestamp) const270 int RdSingleVerStorageExecutor::GetKvData(SingleVerDataType type, const Key &key, Value &value,
271 Timestamp ×tamp) const
272 {
273 if (key.empty()) {
274 LOGE("[RdSingleVerStorageExecutor][GetKvData] empty key.");
275 return -E_INVALID_ARGS;
276 }
277
278 return RdKVGet(db_, SYNC_COLLECTION_NAME, key, value);
279 }
280
Backup(const std::string & filePath,uint8_t * encryptedKey,uint32_t encryptedKeyLen)281 int RdSingleVerStorageExecutor::Backup(const std::string &filePath, uint8_t *encryptedKey, uint32_t encryptedKeyLen)
282 {
283 return RdBackup(db_, filePath.c_str(), encryptedKey, encryptedKeyLen);
284 }
285
ClearEntriesAndFreeResultSet(std::vector<Entry> & entries,GRD_ResultSet * resultSet)286 int RdSingleVerStorageExecutor::ClearEntriesAndFreeResultSet(std::vector<Entry> &entries, GRD_ResultSet *resultSet)
287 {
288 entries.clear();
289 entries.shrink_to_fit();
290 int errCode = RdFreeResultSet(resultSet);
291 if (errCode != E_OK) {
292 LOGE("[RdSingleVerStorageExecutor] failed to free result set.");
293 }
294 return errCode;
295 }
296
GetEntriesPrepare(GRD_DB * db,const GRD_KvScanModeE mode,const std::pair<Key,Key> & pairKey,std::vector<Entry> & entries,GRD_ResultSet ** resultSet)297 int RdSingleVerStorageExecutor::GetEntriesPrepare(GRD_DB *db, const GRD_KvScanModeE mode,
298 const std::pair<Key, Key> &pairKey, std::vector<Entry> &entries, GRD_ResultSet **resultSet)
299 {
300 int ret = E_OK;
301 switch (mode) {
302 case KV_SCAN_PREFIX: {
303 ret = RdKVScan(db, SYNC_COLLECTION_NAME, pairKey.first, KV_SCAN_PREFIX, resultSet);
304 break;
305 }
306 case KV_SCAN_RANGE: {
307 ret = RdKVRangeScan(db, SYNC_COLLECTION_NAME, pairKey.first, pairKey.second, resultSet);
308 break;
309 }
310 default:
311 return -E_INVALID_ARGS;
312 }
313 if (ret != E_OK) {
314 LOGE("[RdSingleVerStorageExecutor][GetEntries]ERROR %d", ret);
315 return ret;
316 }
317 entries.clear();
318 entries.shrink_to_fit();
319 return E_OK;
320 }
321
GetEntries(const GRD_KvScanModeE mode,const std::pair<Key,Key> & pairKey,std::vector<Entry> & entries) const322 int RdSingleVerStorageExecutor::GetEntries(const GRD_KvScanModeE mode, const std::pair<Key, Key> &pairKey,
323 std::vector<Entry> &entries) const
324 {
325 GRD_ResultSet *resultSet = nullptr;
326 int ret = GetEntriesPrepare(db_, mode, pairKey, entries, &resultSet);
327 if (ret != E_OK) {
328 return ret;
329 }
330
331 int innerCode = E_OK;
332 ret = TransferGrdErrno(GRD_Next(resultSet));
333 if (ret == -E_NOT_FOUND) {
334 innerCode = ClearEntriesAndFreeResultSet(entries, resultSet);
335 if (innerCode != E_OK) {
336 return innerCode;
337 }
338 return ret;
339 }
340 while (ret == E_OK) {
341 Entry tmpEntry;
342 ret = RdKvFetch(resultSet, tmpEntry.key, tmpEntry.value);
343 if (ret != E_OK && ret != -E_NOT_FOUND) {
344 LOGE("[RdSingleVerStorageExecutor][GetEntries]fail to fetch, %d", ret);
345 innerCode = ClearEntriesAndFreeResultSet(entries, resultSet);
346 if (innerCode != E_OK) {
347 return innerCode;
348 }
349 return ret;
350 }
351 entries.push_back(std::move(tmpEntry));
352 ret = TransferGrdErrno(GRD_Next(resultSet));
353 }
354 if (ret != -E_NOT_FOUND) {
355 LOGE("[RdSingleVerStorageExecutor][GetEntries]fail to move, %d", ret);
356 innerCode = ClearEntriesAndFreeResultSet(entries, resultSet);
357 if (innerCode != E_OK) {
358 return innerCode;
359 }
360 return ret;
361 }
362
363 ret = RdFreeResultSet(resultSet);
364 if (ret != E_OK) {
365 LOGE("[RdSingleVerStorageExecutor] failed to free result set.");
366 return ret;
367 }
368 return E_OK;
369 }
370
ForceCheckPoint() const371 int RdSingleVerStorageExecutor::ForceCheckPoint() const
372 {
373 return RdFlush(db_, 0);
374 }
375
SaveKvData(SingleVerDataType type,const Key & key,const Value & value)376 int RdSingleVerStorageExecutor::SaveKvData(SingleVerDataType type, const Key &key, const Value &value)
377 {
378 std::string collectionName;
379 int ret = GetCollNameFromType(type, collectionName);
380 if (ret != E_OK) {
381 LOGE("Can not GetCollNameFromType");
382 return ret;
383 }
384 return RdKVPut(db_, collectionName.c_str(), key, value);
385 }
386
DelKvData(const Key & key)387 int RdSingleVerStorageExecutor::DelKvData(const Key &key)
388 {
389 return RdKVDel(db_, SYNC_COLLECTION_NAME, key);
390 }
391
BatchSaveEntries(const std::vector<Entry> & entries,bool isDelete,SingleVerNaturalStoreCommitNotifyData * committedData)392 int RdSingleVerStorageExecutor::BatchSaveEntries(const std::vector<Entry> &entries, bool isDelete,
393 SingleVerNaturalStoreCommitNotifyData *committedData)
394 {
395 GRD_KVBatchT *batch = nullptr;
396 int ret = RdKVBatchPrepare(entries.size(), &batch);
397 if (ret != E_OK) {
398 LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not prepare KVBatch structure");
399 return ret;
400 }
401 for (const auto &entry : entries) {
402 ret = RdKVBatchPushback(batch, entry.key, entry.value);
403 if (ret != E_OK) {
404 (void)RdKVBatchDestroy(batch);
405 LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not push back entries to KVBatch structure");
406 return ret;
407 }
408 }
409 std::vector<NotifyConflictAndObserverData> notifys;
410 if (committedData != nullptr) {
411 ret = PrepareNotifyForEntries(entries, committedData, notifys, isDelete);
412 }
413 if (ret != E_OK) {
414 (void)RdKVBatchDestroy(batch);
415 return ret;
416 }
417 if (isDelete) {
418 ret = RdKVBatchDel(db_, SYNC_COLLECTION_NAME, batch);
419 } else {
420 ret = RdKVBatchPut(db_, SYNC_COLLECTION_NAME, batch);
421 }
422 if (ret != E_OK) {
423 (void)RdKVBatchDestroy(batch);
424 LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not put or delete batchly with mode %d", isDelete);
425 return ret;
426 } else if (committedData != nullptr) {
427 for (size_t i = 0; i < entries.size(); i++) {
428 PutIntoCommittedData(entries[i].key, entries[i].value, notifys[i]);
429 }
430 }
431 int errCode = RdKVBatchDestroy(batch);
432 if (errCode != E_OK) {
433 LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not destroy batch %d", isDelete);
434 }
435 return ret;
436 }
437
GetKvDataByHashKey(const Key & hashKey,SingleVerRecord & result) const438 int RdSingleVerStorageExecutor::GetKvDataByHashKey(const Key &hashKey, SingleVerRecord &result) const
439 {
440 return -E_NOT_SUPPORT;
441 }
442
443 // Put the Kv data according the type(meta and the local data).
PutKvData(SingleVerDataType type,const Key & key,const Value & value,Timestamp timestamp,SingleVerNaturalStoreCommitNotifyData * committedData)444 int RdSingleVerStorageExecutor::PutKvData(SingleVerDataType type, const Key &key, const Value &value,
445 Timestamp timestamp, SingleVerNaturalStoreCommitNotifyData *committedData)
446 {
447 return -E_NOT_SUPPORT;
448 }
449
450 // Get all the meta keys.
GetAllMetaKeys(std::vector<Key> & keys) const451 int RdSingleVerStorageExecutor::GetAllMetaKeys(std::vector<Key> &keys) const
452 {
453 return -E_NOT_SUPPORT;
454 }
455
GetAllSyncedEntries(const std::string & hashDev,std::vector<Entry> & entries) const456 int RdSingleVerStorageExecutor::GetAllSyncedEntries(const std::string &hashDev, std::vector<Entry> &entries) const
457 {
458 return -E_NOT_SUPPORT;
459 }
460
SaveSyncDataItem(const Entry & entry,SingleVerNaturalStoreCommitNotifyData * committedData,bool isDelete)461 int RdSingleVerStorageExecutor::SaveSyncDataItem(const Entry &entry,
462 SingleVerNaturalStoreCommitNotifyData *committedData, bool isDelete)
463 {
464 int errCode = E_OK;
465 NotifyConflictAndObserverData notify;
466 if (committedData != nullptr) {
467 notify = {
468 .committedData = committedData
469 };
470
471 errCode = PrepareForNotifyConflictAndObserver(entry, notify, isDelete);
472 if (errCode != E_OK) {
473 return errCode;
474 }
475 }
476 errCode = SaveSyncDataToDatabase(entry, isDelete);
477 if (committedData != nullptr && errCode == E_OK) {
478 PutIntoCommittedData(entry.key, entry.value, notify);
479 }
480 if (errCode != E_OK) {
481 LOGE("Save sync data to db failed:%d", errCode);
482 }
483 return errCode;
484 }
485
EraseSyncData(const Key & hashKey)486 int RdSingleVerStorageExecutor::EraseSyncData(const Key &hashKey)
487 {
488 return -E_NOT_SUPPORT;
489 }
490
RemoveDeviceData(const std::string & deviceName)491 int RdSingleVerStorageExecutor::RemoveDeviceData(const std::string &deviceName)
492 {
493 return -E_NOT_SUPPORT;
494 }
495
RemoveDeviceDataInCacheMode(const std::string & hashDev,bool isNeedNotify,uint64_t recordVersion) const496 int RdSingleVerStorageExecutor::RemoveDeviceDataInCacheMode(const std::string &hashDev, bool isNeedNotify,
497 uint64_t recordVersion) const
498 {
499 return -E_NOT_SUPPORT;
500 }
501
InitCurrentMaxStamp(Timestamp & maxStamp)502 void RdSingleVerStorageExecutor::InitCurrentMaxStamp(Timestamp &maxStamp)
503 {
504 return;
505 }
506
ReleaseContinueStatement()507 void RdSingleVerStorageExecutor::ReleaseContinueStatement()
508 {
509 return;
510 }
511
GetSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const512 int RdSingleVerStorageExecutor::GetSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
513 Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
514 {
515 return -E_NOT_SUPPORT;
516 }
517
GetDeletedSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const518 int RdSingleVerStorageExecutor::GetDeletedSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
519 Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
520 {
521 return -E_NOT_SUPPORT;
522 }
523
GetDeviceIdentifier(PragmaEntryDeviceIdentifier * identifier)524 int RdSingleVerStorageExecutor::GetDeviceIdentifier(PragmaEntryDeviceIdentifier *identifier)
525 {
526 return -E_NOT_SUPPORT;
527 }
528
OpenResultSet(QueryObject & queryObj,int & count)529 int RdSingleVerStorageExecutor::OpenResultSet(QueryObject &queryObj, int &count)
530 {
531 return -E_NOT_SUPPORT;
532 }
533
StartTransaction(TransactType type)534 int RdSingleVerStorageExecutor::StartTransaction(TransactType type)
535 {
536 return E_OK;
537 }
538
Commit()539 int RdSingleVerStorageExecutor::Commit()
540 {
541 return E_OK;
542 }
543
Rollback()544 int RdSingleVerStorageExecutor::Rollback()
545 {
546 return E_OK;
547 }
548
CheckIfKeyExisted(const Key & key,bool isLocal,Value & value,Timestamp & timestamp) const549 bool RdSingleVerStorageExecutor::CheckIfKeyExisted(const Key &key, bool isLocal, Value &value,
550 Timestamp ×tamp) const
551 {
552 return -E_NOT_SUPPORT;
553 }
554
ResetForSavingData(SingleVerDataType type)555 int RdSingleVerStorageExecutor::ResetForSavingData(SingleVerDataType type)
556 {
557 return -E_NOT_SUPPORT;
558 }
559
UpdateLocalDataTimestamp(Timestamp timestamp)560 int RdSingleVerStorageExecutor::UpdateLocalDataTimestamp(Timestamp timestamp)
561 {
562 return -E_NOT_SUPPORT;
563 }
564
SetAttachMetaMode(bool attachMetaMode)565 void RdSingleVerStorageExecutor::SetAttachMetaMode(bool attachMetaMode)
566 {
567 return;
568 }
569
PutLocalDataToCacheDB(const LocalDataItem & dataItem) const570 int RdSingleVerStorageExecutor::PutLocalDataToCacheDB(const LocalDataItem &dataItem) const
571 {
572 return -E_NOT_SUPPORT;
573 }
574
SaveSyncDataItemInCacheMode(DataItem & dataItem,const DeviceInfo & deviceInfo,Timestamp & maxStamp,uint64_t recordVersion,const QueryObject & query)575 int RdSingleVerStorageExecutor::SaveSyncDataItemInCacheMode(DataItem &dataItem, const DeviceInfo &deviceInfo,
576 Timestamp &maxStamp, uint64_t recordVersion, const QueryObject &query)
577 {
578 return -E_NOT_SUPPORT;
579 }
580
PrepareForSavingCacheData(SingleVerDataType type)581 int RdSingleVerStorageExecutor::PrepareForSavingCacheData(SingleVerDataType type)
582 {
583 return -E_NOT_SUPPORT;
584 }
585
ResetForSavingCacheData(SingleVerDataType type)586 int RdSingleVerStorageExecutor::ResetForSavingCacheData(SingleVerDataType type)
587 {
588 return -E_NOT_SUPPORT;
589 }
590
MigrateLocalData()591 int RdSingleVerStorageExecutor::MigrateLocalData()
592 {
593 return -E_NOT_SUPPORT;
594 }
595
MigrateSyncDataByVersion(uint64_t recordVer,NotifyMigrateSyncData & syncData,std::vector<DataItem> & dataItems)596 int RdSingleVerStorageExecutor::MigrateSyncDataByVersion(uint64_t recordVer, NotifyMigrateSyncData &syncData,
597 std::vector<DataItem> &dataItems)
598 {
599 return -E_NOT_SUPPORT;
600 }
601
GetMinVersionCacheData(std::vector<DataItem> & dataItems,uint64_t & minVerIncurCacheDb) const602 int RdSingleVerStorageExecutor::GetMinVersionCacheData(std::vector<DataItem> &dataItems,
603 uint64_t &minVerIncurCacheDb) const
604 {
605 return -E_NOT_SUPPORT;
606 }
607
GetMaxVersionInCacheDb(uint64_t & maxVersion) const608 int RdSingleVerStorageExecutor::GetMaxVersionInCacheDb(uint64_t &maxVersion) const
609 {
610 return -E_NOT_SUPPORT;
611 }
612
AttachMainDbAndCacheDb(CipherType type,const CipherPassword & passwd,const std::string & attachDbAbsPath,EngineState engineState)613 int RdSingleVerStorageExecutor::AttachMainDbAndCacheDb(CipherType type, const CipherPassword &passwd,
614 const std::string &attachDbAbsPath, EngineState engineState)
615 {
616 return -E_NOT_SUPPORT;
617 }
618
619 // Clear migrating data.
ClearMigrateData()620 void RdSingleVerStorageExecutor::ClearMigrateData()
621 {
622 return;
623 }
624
625 // Get current max timestamp.
GetMaxTimestampDuringMigrating(Timestamp & maxTimestamp) const626 int RdSingleVerStorageExecutor::GetMaxTimestampDuringMigrating(Timestamp &maxTimestamp) const
627 {
628 return -E_NOT_SUPPORT;
629 }
630
SetConflictResolvePolicy(int policy)631 void RdSingleVerStorageExecutor::SetConflictResolvePolicy(int policy)
632 {
633 return;
634 }
635
636 // Delete multiple meta data records in a transaction.
DeleteMetaData(const std::vector<Key> & keys)637 int RdSingleVerStorageExecutor::DeleteMetaData(const std::vector<Key> &keys)
638 {
639 return -E_NOT_SUPPORT;
640 }
641
642 // Delete multiple meta data records with key prefix in a transaction.
DeleteMetaDataByPrefixKey(const Key & keyPrefix)643 int RdSingleVerStorageExecutor::DeleteMetaDataByPrefixKey(const Key &keyPrefix)
644 {
645 return -E_NOT_SUPPORT;
646 }
647
CheckIntegrity() const648 int RdSingleVerStorageExecutor::CheckIntegrity() const
649 {
650 return -E_NOT_SUPPORT;
651 }
652
CheckQueryObjectLegal(QueryObject & queryObj) const653 int RdSingleVerStorageExecutor::CheckQueryObjectLegal(QueryObject &queryObj) const
654 {
655 return -E_NOT_SUPPORT;
656 }
657
CheckDataWithQuery(QueryObject query,std::vector<DataItem> & dataItems,const DeviceInfo & deviceInfo)658 int RdSingleVerStorageExecutor::CheckDataWithQuery(QueryObject query, std::vector<DataItem> &dataItems,
659 const DeviceInfo &deviceInfo)
660 {
661 return -E_NOT_SUPPORT;
662 }
663
GetDataItemSerialSize(const DataItem & item,size_t appendLen)664 size_t RdSingleVerStorageExecutor::GetDataItemSerialSize(const DataItem &item, size_t appendLen)
665 {
666 return -E_NOT_SUPPORT;
667 }
668
AddSubscribeTrigger(QueryObject & query,const std::string & subscribeId)669 int RdSingleVerStorageExecutor::AddSubscribeTrigger(QueryObject &query, const std::string &subscribeId)
670 {
671 return -E_NOT_SUPPORT;
672 }
673
RemoveSubscribeTrigger(const std::vector<std::string> & subscribeIds)674 int RdSingleVerStorageExecutor::RemoveSubscribeTrigger(const std::vector<std::string> &subscribeIds)
675 {
676 return -E_NOT_SUPPORT;
677 }
678
RemoveSubscribeTriggerWaterMark(const std::vector<std::string> & subscribeIds)679 int RdSingleVerStorageExecutor::RemoveSubscribeTriggerWaterMark(const std::vector<std::string> &subscribeIds)
680 {
681 return -E_NOT_SUPPORT;
682 }
683
GetTriggers(const std::string & namePreFix,std::vector<std::string> & triggerNames)684 int RdSingleVerStorageExecutor::GetTriggers(const std::string &namePreFix, std::vector<std::string> &triggerNames)
685 {
686 return -E_NOT_SUPPORT;
687 }
688
RemoveTrigger(const std::vector<std::string> & triggers)689 int RdSingleVerStorageExecutor::RemoveTrigger(const std::vector<std::string> &triggers)
690 {
691 return -E_NOT_SUPPORT;
692 }
693
GetSyncDataWithQuery(const QueryObject & query,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo,const std::pair<Timestamp,Timestamp> & timeRange,std::vector<DataItem> & dataItems) const694 int RdSingleVerStorageExecutor::GetSyncDataWithQuery(const QueryObject &query, size_t appendLength,
695 const DataSizeSpecInfo &dataSizeInfo, const std::pair<Timestamp, Timestamp> &timeRange,
696 std::vector<DataItem> &dataItems) const
697 {
698 return -E_NOT_SUPPORT;
699 }
700
GetLogFileSize() const701 uint64_t RdSingleVerStorageExecutor::GetLogFileSize() const
702 {
703 return -E_NOT_SUPPORT;
704 }
705
GetExistsDevicesFromMeta(std::set<std::string> & devices)706 int RdSingleVerStorageExecutor::GetExistsDevicesFromMeta(std::set<std::string> &devices)
707 {
708 return -E_NOT_SUPPORT;
709 }
710
UpdateKey(const UpdateKeyCallback & callback)711 int RdSingleVerStorageExecutor::UpdateKey(const UpdateKeyCallback &callback)
712 {
713 return -E_NOT_SUPPORT;
714 }
715
PutIntoCommittedData(const Key & key,const Value & value,NotifyConflictAndObserverData & data)716 void RdSingleVerStorageExecutor::PutIntoCommittedData(const Key &key, const Value &value,
717 NotifyConflictAndObserverData &data)
718 {
719 if (data.committedData == nullptr) {
720 return;
721 }
722
723 Entry entry;
724 int errCode = E_OK;
725 if (!data.dataStatus.isDeleted) {
726 entry.key = key;
727 entry.value = value;
728 DataType dataType = (data.dataStatus.preStatus == DataStatus::EXISTED) ? DataType::UPDATE : DataType::INSERT;
729 errCode = data.committedData->InsertCommittedData(std::move(entry), dataType, true);
730 } else {
731 if (data.dataStatus.preStatus == DataStatus::NOEXISTED) {
732 return;
733 }
734 entry.key = data.getData.key;
735 entry.value = data.getData.value;
736 errCode = data.committedData->InsertCommittedData(std::move(entry), DataType::DELETE, true);
737 }
738
739 if (errCode != E_OK) {
740 LOGE("[SingleVerExe][PutCommitData] Rd Insert failed:%d", errCode);
741 }
742 }
743
GetSyncDataPreByKey(const Key & key,DataItem & itemGet) const744 int RdSingleVerStorageExecutor::GetSyncDataPreByKey(const Key &key, DataItem &itemGet) const
745 {
746 Timestamp recordTimestamp;
747 Value value;
748 int errCode = GetKvData(SingleVerDataType::SYNC_TYPE, key, value, recordTimestamp);
749 if (errCode == E_OK) {
750 itemGet.key = key;
751 itemGet.value = value;
752 }
753 return errCode;
754 }
755
PrepareForNotifyConflictAndObserver(const Entry & entry,NotifyConflictAndObserverData & notify,bool isDelete)756 int RdSingleVerStorageExecutor::PrepareForNotifyConflictAndObserver(const Entry &entry,
757 NotifyConflictAndObserverData ¬ify, bool isDelete)
758 {
759 // Check sava data existed info
760 int errCode = DBCommon::CalcValueHash(entry.key, notify.hashKey);
761 if (errCode != E_OK) {
762 return errCode;
763 }
764 errCode = GetSyncDataPreByKey(entry.key, notify.getData);
765 if (errCode != E_OK && errCode != -E_NOT_FOUND) {
766 LOGD("[SingleVerExe][PrepareForNotifyConflictAndObserver] failed:%d", errCode);
767 return errCode;
768 }
769
770 bool isHashKeyExisted = (errCode != -E_NOT_FOUND);
771
772 LOGD("Preparing for notify conflict and observer");
773 notify.dataStatus.isDeleted = isDelete;
774 if (isHashKeyExisted) {
775 notify.dataStatus.preStatus = DataStatus::EXISTED;
776 } else {
777 notify.dataStatus.preStatus = DataStatus::NOEXISTED;
778 }
779 InitCommitNotifyDataKeyStatus(notify.committedData, notify.hashKey, notify.dataStatus);
780 return E_OK;
781 }
782
SaveSyncDataToDatabase(const Entry & entry,bool isDelete)783 int RdSingleVerStorageExecutor::SaveSyncDataToDatabase(const Entry &entry, bool isDelete)
784 {
785 if (isDelete) {
786 return DelKvData(entry.key);
787 }
788 return SaveKvData(SingleVerDataType::SYNC_TYPE, entry.key, entry.value);
789 }
790 } // namespace DistributedDB