• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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> &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][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 &timestamp) 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 &notify, 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