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> ¬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][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 ×tamp) 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 ¬ify, 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