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_db_api.h"
22 #include "grd_document_api.h"
23 #include "grd_error.h"
24 #include "grd_resultset_api.h"
25 #include "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("[RdSingleVerStorageExecutor][OpenResultSet] 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> &notifys,
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 &timestamp) 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][GetEntriesPrepare]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     ret = PrepareNotifyForEntries(entries, committedData, notifys, isDelete);
411     if (ret != E_OK) {
412         (void)RdKVBatchDestroy(batch);
413         return ret;
414     }
415     if (isDelete) {
416         ret = RdKVBatchDel(db_, SYNC_COLLECTION_NAME, batch);
417     } else {
418         ret = RdKVBatchPut(db_, SYNC_COLLECTION_NAME, batch);
419     }
420     if (ret != E_OK) {
421         (void)RdKVBatchDestroy(batch);
422         LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not put or delete batchly with mode %d", isDelete);
423         return ret;
424     } else {
425         for (size_t i = 0; i < entries.size(); i++) {
426             PutIntoCommittedData(entries[i].key, entries[i].value, notifys[i]);
427         }
428     }
429     int errCode = RdKVBatchDestroy(batch);
430     if (errCode != E_OK) {
431         LOGE("[RdSingleVerStorageExecutor][BatchSaveEntries] Can not destroy batch %d", isDelete);
432     }
433     return ret;
434 }
435 
GetKvDataByHashKey(const Key & hashKey,SingleVerRecord & result) const436 int RdSingleVerStorageExecutor::GetKvDataByHashKey(const Key &hashKey, SingleVerRecord &result) const
437 {
438     return -E_NOT_SUPPORT;
439 }
440 
441 // 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)442 int RdSingleVerStorageExecutor::PutKvData(SingleVerDataType type, const Key &key, const Value &value,
443     Timestamp timestamp, SingleVerNaturalStoreCommitNotifyData *committedData)
444 {
445     return -E_NOT_SUPPORT;
446 }
447 
448 // Get all the meta keys.
GetAllMetaKeys(std::vector<Key> & keys) const449 int RdSingleVerStorageExecutor::GetAllMetaKeys(std::vector<Key> &keys) const
450 {
451     return -E_NOT_SUPPORT;
452 }
453 
GetAllSyncedEntries(const std::string & hashDev,std::vector<Entry> & entries) const454 int RdSingleVerStorageExecutor::GetAllSyncedEntries(const std::string &hashDev, std::vector<Entry> &entries) const
455 {
456     return -E_NOT_SUPPORT;
457 }
458 
SaveSyncDataItem(const Entry & entry,SingleVerNaturalStoreCommitNotifyData * committedData,bool isDelete)459 int RdSingleVerStorageExecutor::SaveSyncDataItem(const Entry &entry,
460     SingleVerNaturalStoreCommitNotifyData *committedData, bool isDelete)
461 {
462     NotifyConflictAndObserverData notify = {
463         .committedData = committedData
464     };
465 
466     int errCode = PrepareForNotifyConflictAndObserver(entry, notify, isDelete);
467     if (errCode != E_OK) {
468         return errCode;
469     }
470 
471     errCode = SaveSyncDataToDatabase(entry, isDelete);
472     if (errCode == E_OK) {
473         PutIntoCommittedData(entry.key, entry.value, notify);
474     } else {
475         LOGE("Save sync data to db failed:%d", errCode);
476     }
477     return errCode;
478 }
479 
EraseSyncData(const Key & hashKey)480 int RdSingleVerStorageExecutor::EraseSyncData(const Key &hashKey)
481 {
482     return -E_NOT_SUPPORT;
483 }
484 
RemoveDeviceData(const std::string & deviceName)485 int RdSingleVerStorageExecutor::RemoveDeviceData(const std::string &deviceName)
486 {
487     return -E_NOT_SUPPORT;
488 }
489 
RemoveDeviceDataInCacheMode(const std::string & hashDev,bool isNeedNotify,uint64_t recordVersion) const490 int RdSingleVerStorageExecutor::RemoveDeviceDataInCacheMode(const std::string &hashDev, bool isNeedNotify,
491     uint64_t recordVersion) const
492 {
493     return -E_NOT_SUPPORT;
494 }
495 
InitCurrentMaxStamp(Timestamp & maxStamp)496 void RdSingleVerStorageExecutor::InitCurrentMaxStamp(Timestamp &maxStamp)
497 {
498     return;
499 }
500 
ReleaseContinueStatement()501 void RdSingleVerStorageExecutor::ReleaseContinueStatement()
502 {
503     return;
504 }
505 
GetSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const506 int RdSingleVerStorageExecutor::GetSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
507     Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
508 {
509     return -E_NOT_SUPPORT;
510 }
511 
GetDeletedSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const512 int RdSingleVerStorageExecutor::GetDeletedSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
513     Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
514 {
515     return -E_NOT_SUPPORT;
516 }
517 
GetDeviceIdentifier(PragmaEntryDeviceIdentifier * identifier)518 int RdSingleVerStorageExecutor::GetDeviceIdentifier(PragmaEntryDeviceIdentifier *identifier)
519 {
520     return -E_NOT_SUPPORT;
521 }
522 
OpenResultSet(QueryObject & queryObj,int & count)523 int RdSingleVerStorageExecutor::OpenResultSet(QueryObject &queryObj, int &count)
524 {
525     return -E_NOT_SUPPORT;
526 }
527 
StartTransaction(TransactType type)528 int RdSingleVerStorageExecutor::StartTransaction(TransactType type)
529 {
530     return E_OK;
531 }
532 
Commit()533 int RdSingleVerStorageExecutor::Commit()
534 {
535     return E_OK;
536 }
537 
Rollback()538 int RdSingleVerStorageExecutor::Rollback()
539 {
540     return E_OK;
541 }
542 
CheckIfKeyExisted(const Key & key,bool isLocal,Value & value,Timestamp & timestamp) const543 bool RdSingleVerStorageExecutor::CheckIfKeyExisted(const Key &key, bool isLocal, Value &value,
544     Timestamp &timestamp) const
545 {
546     return -E_NOT_SUPPORT;
547 }
548 
ResetForSavingData(SingleVerDataType type)549 int RdSingleVerStorageExecutor::ResetForSavingData(SingleVerDataType type)
550 {
551     return -E_NOT_SUPPORT;
552 }
553 
UpdateLocalDataTimestamp(Timestamp timestamp)554 int RdSingleVerStorageExecutor::UpdateLocalDataTimestamp(Timestamp timestamp)
555 {
556     return -E_NOT_SUPPORT;
557 }
558 
SetAttachMetaMode(bool attachMetaMode)559 void RdSingleVerStorageExecutor::SetAttachMetaMode(bool attachMetaMode)
560 {
561     return;
562 }
563 
PutLocalDataToCacheDB(const LocalDataItem & dataItem) const564 int RdSingleVerStorageExecutor::PutLocalDataToCacheDB(const LocalDataItem &dataItem) const
565 {
566     return -E_NOT_SUPPORT;
567 }
568 
SaveSyncDataItemInCacheMode(DataItem & dataItem,const DeviceInfo & deviceInfo,Timestamp & maxStamp,uint64_t recordVersion,const QueryObject & query)569 int RdSingleVerStorageExecutor::SaveSyncDataItemInCacheMode(DataItem &dataItem, const DeviceInfo &deviceInfo,
570     Timestamp &maxStamp, uint64_t recordVersion, const QueryObject &query)
571 {
572     return -E_NOT_SUPPORT;
573 }
574 
PrepareForSavingCacheData(SingleVerDataType type)575 int RdSingleVerStorageExecutor::PrepareForSavingCacheData(SingleVerDataType type)
576 {
577     return -E_NOT_SUPPORT;
578 }
579 
ResetForSavingCacheData(SingleVerDataType type)580 int RdSingleVerStorageExecutor::ResetForSavingCacheData(SingleVerDataType type)
581 {
582     return -E_NOT_SUPPORT;
583 }
584 
MigrateLocalData()585 int RdSingleVerStorageExecutor::MigrateLocalData()
586 {
587     return -E_NOT_SUPPORT;
588 }
589 
MigrateSyncDataByVersion(uint64_t recordVer,NotifyMigrateSyncData & syncData,std::vector<DataItem> & dataItems)590 int RdSingleVerStorageExecutor::MigrateSyncDataByVersion(uint64_t recordVer, NotifyMigrateSyncData &syncData,
591     std::vector<DataItem> &dataItems)
592 {
593     return -E_NOT_SUPPORT;
594 }
595 
GetMinVersionCacheData(std::vector<DataItem> & dataItems,uint64_t & minVerIncurCacheDb) const596 int RdSingleVerStorageExecutor::GetMinVersionCacheData(std::vector<DataItem> &dataItems,
597     uint64_t &minVerIncurCacheDb) const
598 {
599     return -E_NOT_SUPPORT;
600 }
601 
GetMaxVersionInCacheDb(uint64_t & maxVersion) const602 int RdSingleVerStorageExecutor::GetMaxVersionInCacheDb(uint64_t &maxVersion) const
603 {
604     return -E_NOT_SUPPORT;
605 }
606 
AttachMainDbAndCacheDb(CipherType type,const CipherPassword & passwd,const std::string & attachDbAbsPath,EngineState engineState)607 int RdSingleVerStorageExecutor::AttachMainDbAndCacheDb(CipherType type, const CipherPassword &passwd,
608     const std::string &attachDbAbsPath, EngineState engineState)
609 {
610     return -E_NOT_SUPPORT;
611 }
612 
613 // Clear migrating data.
ClearMigrateData()614 void RdSingleVerStorageExecutor::ClearMigrateData()
615 {
616     return;
617 }
618 
619 // Get current max timestamp.
GetMaxTimestampDuringMigrating(Timestamp & maxTimestamp) const620 int RdSingleVerStorageExecutor::GetMaxTimestampDuringMigrating(Timestamp &maxTimestamp) const
621 {
622     return -E_NOT_SUPPORT;
623 }
624 
SetConflictResolvePolicy(int policy)625 void RdSingleVerStorageExecutor::SetConflictResolvePolicy(int policy)
626 {
627     return;
628 }
629 
630 // Delete multiple meta data records in a transaction.
DeleteMetaData(const std::vector<Key> & keys)631 int RdSingleVerStorageExecutor::DeleteMetaData(const std::vector<Key> &keys)
632 {
633     return -E_NOT_SUPPORT;
634 }
635 
636 // Delete multiple meta data records with key prefix in a transaction.
DeleteMetaDataByPrefixKey(const Key & keyPrefix)637 int RdSingleVerStorageExecutor::DeleteMetaDataByPrefixKey(const Key &keyPrefix)
638 {
639     return -E_NOT_SUPPORT;
640 }
641 
CheckIntegrity() const642 int RdSingleVerStorageExecutor::CheckIntegrity() const
643 {
644     return -E_NOT_SUPPORT;
645 }
646 
CheckQueryObjectLegal(QueryObject & queryObj) const647 int RdSingleVerStorageExecutor::CheckQueryObjectLegal(QueryObject &queryObj) const
648 {
649     return -E_NOT_SUPPORT;
650 }
651 
CheckDataWithQuery(QueryObject query,std::vector<DataItem> & dataItems,const DeviceInfo & deviceInfo)652 int RdSingleVerStorageExecutor::CheckDataWithQuery(QueryObject query, std::vector<DataItem> &dataItems,
653     const DeviceInfo &deviceInfo)
654 {
655     return -E_NOT_SUPPORT;
656 }
657 
GetDataItemSerialSize(const DataItem & item,size_t appendLen)658 size_t RdSingleVerStorageExecutor::GetDataItemSerialSize(const DataItem &item, size_t appendLen)
659 {
660     return -E_NOT_SUPPORT;
661 }
662 
AddSubscribeTrigger(QueryObject & query,const std::string & subscribeId)663 int RdSingleVerStorageExecutor::AddSubscribeTrigger(QueryObject &query, const std::string &subscribeId)
664 {
665     return -E_NOT_SUPPORT;
666 }
667 
RemoveSubscribeTrigger(const std::vector<std::string> & subscribeIds)668 int RdSingleVerStorageExecutor::RemoveSubscribeTrigger(const std::vector<std::string> &subscribeIds)
669 {
670     return -E_NOT_SUPPORT;
671 }
672 
RemoveSubscribeTriggerWaterMark(const std::vector<std::string> & subscribeIds)673 int RdSingleVerStorageExecutor::RemoveSubscribeTriggerWaterMark(const std::vector<std::string> &subscribeIds)
674 {
675     return -E_NOT_SUPPORT;
676 }
677 
GetTriggers(const std::string & namePreFix,std::vector<std::string> & triggerNames)678 int RdSingleVerStorageExecutor::GetTriggers(const std::string &namePreFix, std::vector<std::string> &triggerNames)
679 {
680     return -E_NOT_SUPPORT;
681 }
682 
RemoveTrigger(const std::vector<std::string> & triggers)683 int RdSingleVerStorageExecutor::RemoveTrigger(const std::vector<std::string> &triggers)
684 {
685     return -E_NOT_SUPPORT;
686 }
687 
GetSyncDataWithQuery(const QueryObject & query,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo,const std::pair<Timestamp,Timestamp> & timeRange,std::vector<DataItem> & dataItems) const688 int RdSingleVerStorageExecutor::GetSyncDataWithQuery(const QueryObject &query, size_t appendLength,
689     const DataSizeSpecInfo &dataSizeInfo, const std::pair<Timestamp, Timestamp> &timeRange,
690     std::vector<DataItem> &dataItems) const
691 {
692     return -E_NOT_SUPPORT;
693 }
694 
GetLogFileSize() const695 uint64_t RdSingleVerStorageExecutor::GetLogFileSize() const
696 {
697     return -E_NOT_SUPPORT;
698 }
699 
GetExistsDevicesFromMeta(std::set<std::string> & devices)700 int RdSingleVerStorageExecutor::GetExistsDevicesFromMeta(std::set<std::string> &devices)
701 {
702     return -E_NOT_SUPPORT;
703 }
704 
UpdateKey(const UpdateKeyCallback & callback)705 int RdSingleVerStorageExecutor::UpdateKey(const UpdateKeyCallback &callback)
706 {
707     return -E_NOT_SUPPORT;
708 }
709 
PutIntoCommittedData(const Key & key,const Value & value,NotifyConflictAndObserverData & data)710 void RdSingleVerStorageExecutor::PutIntoCommittedData(const Key &key, const Value &value,
711     NotifyConflictAndObserverData &data)
712 {
713     if (data.committedData == nullptr) {
714         return;
715     }
716 
717     Entry entry;
718     int errCode = E_OK;
719     if (!data.dataStatus.isDeleted) {
720         entry.key = key;
721         entry.value = value;
722         DataType dataType = (data.dataStatus.preStatus == DataStatus::EXISTED) ? DataType::UPDATE : DataType::INSERT;
723         errCode = data.committedData->InsertCommittedData(std::move(entry), dataType, true);
724     } else {
725         if (data.dataStatus.preStatus == DataStatus::NOEXISTED) {
726             return;
727         }
728         entry.key = data.getData.key;
729         entry.value = data.getData.value;
730         errCode = data.committedData->InsertCommittedData(std::move(entry), DataType::DELETE, true);
731     }
732 
733     if (errCode != E_OK) {
734         LOGE("[SingleVerExe][PutCommitData] Rd Insert failed:%d", errCode);
735     }
736 }
737 
GetSyncDataPreByKey(const Key & key,DataItem & itemGet) const738 int RdSingleVerStorageExecutor::GetSyncDataPreByKey(const Key &key, DataItem &itemGet) const
739 {
740     Timestamp recordTimestamp;
741     Value value;
742     int errCode = GetKvData(SingleVerDataType::SYNC_TYPE, key, value, recordTimestamp);
743     if (errCode == E_OK) {
744         itemGet.key = key;
745         itemGet.value = value;
746     }
747     return errCode;
748 }
749 
PrepareForNotifyConflictAndObserver(const Entry & entry,NotifyConflictAndObserverData & notify,bool isDelete)750 int RdSingleVerStorageExecutor::PrepareForNotifyConflictAndObserver(const Entry &entry,
751     NotifyConflictAndObserverData &notify, bool isDelete)
752 {
753     // Check sava data existed info
754     int errCode = DBCommon::CalcValueHash(entry.key, notify.hashKey);
755     if (errCode != E_OK) {
756         return errCode;
757     }
758     errCode = GetSyncDataPreByKey(entry.key, notify.getData);
759     if (errCode != E_OK && errCode != -E_NOT_FOUND) {
760         LOGD("[SingleVerExe][PrepareForNotifyConflictAndObserver] failed:%d", errCode);
761         return errCode;
762     }
763 
764     bool isHashKeyExisted = (errCode != -E_NOT_FOUND);
765 
766     LOGD("Preparing for notify conflict and observer");
767     notify.dataStatus.isDeleted = isDelete;
768     if (isHashKeyExisted) {
769         notify.dataStatus.preStatus = DataStatus::EXISTED;
770     } else {
771         notify.dataStatus.preStatus = DataStatus::NOEXISTED;
772     }
773     InitCommitNotifyDataKeyStatus(notify.committedData, notify.hashKey, notify.dataStatus);
774     return E_OK;
775 }
776 
SaveSyncDataToDatabase(const Entry & entry,bool isDelete)777 int RdSingleVerStorageExecutor::SaveSyncDataToDatabase(const Entry &entry, bool isDelete)
778 {
779     if (isDelete) {
780         return DelKvData(entry.key);
781     }
782     return SaveKvData(SingleVerDataType::SYNC_TYPE, entry.key, entry.value);
783 }
784 } // namespace DistributedDB