• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "sqlite_single_ver_storage_executor.h"
17 
18 #include <algorithm>
19 
20 #include "log_print.h"
21 #include "db_constant.h"
22 #include "db_common.h"
23 #include "db_errno.h"
24 #include "parcel.h"
25 #include "platform_specific.h"
26 #include "runtime_context.h"
27 #include "sqlite_meta_executor.h"
28 #include "sqlite_single_ver_storage_executor_sql.h"
29 
30 namespace DistributedDB {
31 namespace {
32 
InitCommitNotifyDataKeyStatus(SingleVerNaturalStoreCommitNotifyData * committedData,const Key & hashKey,const DataOperStatus & dataStatus)33 void InitCommitNotifyDataKeyStatus(SingleVerNaturalStoreCommitNotifyData *committedData, const Key &hashKey,
34     const DataOperStatus &dataStatus)
35 {
36     if (committedData == nullptr) {
37         return;
38     }
39 
40     ExistStatus existedStatus = ExistStatus::NONE;
41     if (dataStatus.preStatus == DataStatus::DELETED) {
42         existedStatus = ExistStatus::DELETED;
43     } else if (dataStatus.preStatus == DataStatus::EXISTED) {
44         existedStatus = ExistStatus::EXIST;
45     }
46 
47     committedData->InitKeyPropRecord(hashKey, existedStatus);
48 }
49 
ResetOrRegetStmt(sqlite3 * db,sqlite3_stmt * & stmt,const std::string & sql)50 int ResetOrRegetStmt(sqlite3 *db, sqlite3_stmt *&stmt, const std::string &sql)
51 {
52     int errCode = E_OK;
53     SQLiteUtils::ResetStatement(stmt, false, errCode);
54     if (errCode != E_OK) {
55         LOGE("[ResetOrRegetStmt] reset stmt failed:%d.", errCode);
56         // Finish current statement and remade one
57         SQLiteUtils::ResetStatement(stmt, true, errCode);
58         errCode = SQLiteUtils::GetStatement(db, sql, stmt);
59         if (errCode != E_OK) {
60             LOGE("[ResetOrRegetStmt] reget failed:%d.", errCode);
61         }
62     }
63     return errCode;
64 }
65 
GetEntryFromStatement(bool isGetValue,sqlite3_stmt * statement,std::vector<Entry> & entries)66 int GetEntryFromStatement(bool isGetValue, sqlite3_stmt *statement, std::vector<Entry> &entries)
67 {
68     Entry entry;
69     int errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, entry.key);
70     if (errCode != E_OK) {
71         return errCode;
72     }
73     if (isGetValue) {
74         errCode = SQLiteUtils::GetColumnBlobValue(statement, 1, entry.value);
75         if (errCode != E_OK) {
76             return errCode;
77         }
78     }
79 
80     entries.push_back(std::move(entry));
81     return errCode;
82 }
83 }
84 
SQLiteSingleVerStorageExecutor(sqlite3 * dbHandle,bool writable,bool isMemDb)85 SQLiteSingleVerStorageExecutor::SQLiteSingleVerStorageExecutor(sqlite3 *dbHandle, bool writable, bool isMemDb)
86     : SQLiteStorageExecutor(dbHandle, writable, isMemDb),
87       getSyncStatement_(nullptr),
88       getResultRowIdStatement_(nullptr),
89       getResultEntryStatement_(nullptr),
90       isTransactionOpen_(false),
91       attachMetaMode_(false),
92       executorState_(ExecutorState::INVALID),
93       maxTimestampInMainDB_(0),
94       migrateTimeOffset_(0),
95       isSyncMigrating_(false),
96       conflictResolvePolicy_(DEFAULT_LAST_WIN)
97 {}
98 
SQLiteSingleVerStorageExecutor(sqlite3 * dbHandle,bool writable,bool isMemDb,ExecutorState executorState)99 SQLiteSingleVerStorageExecutor::SQLiteSingleVerStorageExecutor(sqlite3 *dbHandle, bool writable, bool isMemDb,
100     ExecutorState executorState)
101     : SQLiteStorageExecutor(dbHandle, writable, isMemDb),
102       getSyncStatement_(nullptr),
103       getResultRowIdStatement_(nullptr),
104       getResultEntryStatement_(nullptr),
105       isTransactionOpen_(false),
106       attachMetaMode_(false),
107       executorState_(executorState),
108       maxTimestampInMainDB_(0),
109       migrateTimeOffset_(0),
110       isSyncMigrating_(false),
111       conflictResolvePolicy_(DEFAULT_LAST_WIN)
112 {}
113 
~SQLiteSingleVerStorageExecutor()114 SQLiteSingleVerStorageExecutor::~SQLiteSingleVerStorageExecutor()
115 {
116     if (isTransactionOpen_) {
117         Rollback();
118     }
119     FinalizeAllStatements();
120 }
121 
GetKvData(SingleVerDataType type,const Key & key,Value & value,Timestamp & timestamp) const122 int SQLiteSingleVerStorageExecutor::GetKvData(SingleVerDataType type, const Key &key, Value &value,
123     Timestamp &timestamp) const
124 {
125     std::string sql;
126     if (type == SingleVerDataType::LOCAL_TYPE) {
127         sql = SELECT_LOCAL_VALUE_TIMESTAMP_SQL;
128     } else if (type == SingleVerDataType::SYNC_TYPE) {
129         sql = SELECT_SYNC_VALUE_WTIMESTAMP_SQL;
130     } else if (type == SingleVerDataType::META_TYPE) {
131         if (attachMetaMode_) {
132             sql = SELECT_ATTACH_META_VALUE_SQL;
133         } else {
134             sql = SELECT_META_VALUE_SQL;
135         }
136     } else {
137         return -E_INVALID_ARGS;
138     }
139 
140     sqlite3_stmt *statement = nullptr;
141     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
142     if (errCode != E_OK) {
143         goto END;
144     }
145 
146     errCode = SQLiteUtils::BindBlobToStatement(statement, 1, key, false); // first arg.
147     if (errCode != E_OK) {
148         goto END;
149     }
150 
151     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
152     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
153         errCode = -E_NOT_FOUND;
154         goto END;
155     } else if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
156         goto END;
157     }
158 
159     errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, value); // only one result.
160 
161     // get timestamp
162     if (type == SingleVerDataType::LOCAL_TYPE) {
163         timestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, GET_KV_RES_LOCAL_TIME_INDEX));
164     } else if (type == SingleVerDataType::SYNC_TYPE) {
165         timestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, GET_KV_RES_SYNC_TIME_INDEX));
166     }
167 
168 END:
169     SQLiteUtils::ResetStatement(statement, true, errCode);
170     return CheckCorruptedStatus(errCode);
171 }
172 
BindPutKvData(sqlite3_stmt * statement,const Key & key,const Value & value,Timestamp timestamp,SingleVerDataType type)173 int SQLiteSingleVerStorageExecutor::BindPutKvData(sqlite3_stmt *statement, const Key &key, const Value &value,
174     Timestamp timestamp, SingleVerDataType type)
175 {
176     int errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_KV_KEY_INDEX, key, false);
177     if (errCode != E_OK) {
178         LOGE("[SingleVerExe][BindPutKv]Bind key error:%d", errCode);
179         return errCode;
180     }
181 
182     errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_KV_VAL_INDEX, value, true);
183     if (errCode != E_OK) {
184         LOGE("[SingleVerExe][BindPutKv]Bind value error:%d", errCode);
185         return errCode;
186     }
187 
188     if (type == SingleVerDataType::LOCAL_TYPE) {
189         Key hashKey;
190         errCode = DBCommon::CalcValueHash(key, hashKey);
191         if (errCode != E_OK) {
192             return errCode;
193         }
194 
195         errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_LOCAL_HASH_KEY_INDEX, hashKey, false);
196         if (errCode != E_OK) {
197             LOGE("[SingleVerExe][BindPutKv]Bind hash key error:%d", errCode);
198             return errCode;
199         }
200 
201         errCode = SQLiteUtils::BindInt64ToStatement(statement, BIND_LOCAL_TIMESTAMP_INDEX, timestamp);
202         if (errCode != E_OK) {
203             LOGE("[SingleVerExe][BindPutKv]Bind timestamp error:%d", errCode);
204             return errCode;
205         }
206     }
207     return E_OK;
208 }
209 
GetKvDataByHashKey(const Key & hashKey,SingleVerRecord & result) const210 int SQLiteSingleVerStorageExecutor::GetKvDataByHashKey(const Key &hashKey, SingleVerRecord &result) const
211 {
212     sqlite3_stmt *statement = nullptr;
213     std::vector<uint8_t> devVect;
214     std::vector<uint8_t> origDevVect;
215     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_HASH_SQL, statement);
216     if (errCode != E_OK) {
217         goto END;
218     }
219 
220     errCode = SQLiteUtils::BindBlobToStatement(statement, 1, hashKey, false); // bind the first arg hashkey.
221     if (errCode != E_OK) {
222         goto END;
223     }
224 
225     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
226     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
227         result.hashKey = hashKey;
228         result.timestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, SYNC_RES_TIME_INDEX));
229         result.writeTimestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, SYNC_RES_W_TIME_INDEX));
230         result.flag = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_FLAG_INDEX));
231         // get key
232         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_KEY_INDEX, result.key);
233         if (errCode != E_OK) {
234             goto END;
235         }
236         // get value
237         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_VAL_INDEX, result.value);
238         if (errCode != E_OK) {
239             goto END;
240         }
241         // get device
242         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_DEVICE_INDEX, devVect);
243         if (errCode != E_OK) {
244             goto END;
245         }
246         result.device = std::string(devVect.begin(), devVect.end());
247         // get original device
248         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_ORI_DEV_INDEX, origDevVect);
249         if (errCode != E_OK) {
250             goto END;
251         }
252         result.origDevice = std::string(origDevVect.begin(), origDevVect.end());
253     } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
254         errCode = -E_NOT_FOUND;
255         goto END;
256     }
257 
258 END:
259     SQLiteUtils::ResetStatement(statement, true, errCode);
260     return CheckCorruptedStatus(errCode);
261 }
262 
SaveKvData(SingleVerDataType type,const Key & key,const Value & value,Timestamp timestamp)263 int SQLiteSingleVerStorageExecutor::SaveKvData(SingleVerDataType type, const Key &key, const Value &value,
264     Timestamp timestamp)
265 {
266     sqlite3_stmt *statement = nullptr;
267     std::string sql;
268     if (type == SingleVerDataType::LOCAL_TYPE) {
269         sql = (executorState_ == ExecutorState::CACHE_ATTACH_MAIN ? INSERT_LOCAL_SQL_FROM_CACHEHANDLE :
270             INSERT_LOCAL_SQL);
271     } else {
272         sql = (attachMetaMode_ ? INSERT_ATTACH_META_SQL : INSERT_META_SQL);
273     }
274     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
275     if (errCode != E_OK) {
276         goto ERROR;
277     }
278 
279     errCode = BindPutKvData(statement, key, value, timestamp, type);
280     if (errCode != E_OK) {
281         goto ERROR;
282     }
283 
284     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
285     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
286         errCode = E_OK;
287     }
288 
289 ERROR:
290     SQLiteUtils::ResetStatement(statement, true, errCode);
291     return CheckCorruptedStatus(errCode);
292 }
293 
PutKvData(SingleVerDataType type,const Key & key,const Value & value,Timestamp timestamp,SingleVerNaturalStoreCommitNotifyData * committedData)294 int SQLiteSingleVerStorageExecutor::PutKvData(SingleVerDataType type, const Key &key, const Value &value,
295     Timestamp timestamp, SingleVerNaturalStoreCommitNotifyData *committedData)
296 {
297     if (type != SingleVerDataType::LOCAL_TYPE && type != SingleVerDataType::META_TYPE) {
298         return -E_INVALID_ARGS;
299     }
300     // committedData is only for local data, not for meta data.
301     bool isLocal = (SingleVerDataType::LOCAL_TYPE == type);
302     Timestamp localTimestamp = 0;
303     Value readValue;
304     bool isExisted = CheckIfKeyExisted(key, isLocal, readValue, localTimestamp);
305     if (isLocal && committedData != nullptr) {
306         ExistStatus existedStatus = isExisted ? ExistStatus::EXIST : ExistStatus::NONE;
307         Key hashKey;
308         int innerErrCode = DBCommon::CalcValueHash(key, hashKey);
309         if (innerErrCode != E_OK) {
310             return innerErrCode;
311         }
312         committedData->InitKeyPropRecord(hashKey, existedStatus);
313     }
314     int errCode = SaveKvData(type, key, value, timestamp);
315     if (errCode != E_OK) {
316         return errCode;
317     }
318 
319     if (isLocal && committedData != nullptr) {
320         Entry entry = {key, value};
321         committedData->InsertCommittedData(std::move(entry), isExisted ? DataType::UPDATE : DataType::INSERT, true);
322     }
323     return E_OK;
324 }
325 
GetEntries(bool isGetValue,SingleVerDataType type,const Key & keyPrefix,std::vector<Entry> & entries) const326 int SQLiteSingleVerStorageExecutor::GetEntries(bool isGetValue, SingleVerDataType type, const Key &keyPrefix,
327     std::vector<Entry> &entries) const
328 {
329     if ((type != SingleVerDataType::LOCAL_TYPE) && (type != SingleVerDataType::SYNC_TYPE)) {
330         return -E_INVALID_ARGS;
331     }
332 
333     std::string sql;
334     if (type == SingleVerDataType::SYNC_TYPE) {
335         sql = isGetValue ? SELECT_SYNC_PREFIX_SQL : SELECT_SYNC_KEY_PREFIX_SQL;
336     } else {
337         sql = SELECT_LOCAL_PREFIX_SQL;
338     }
339     sqlite3_stmt *statement = nullptr;
340     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
341     if (errCode != E_OK) {
342         goto END;
343     }
344 
345     // bind the prefix key for the first and second args.
346     errCode = SQLiteUtils::BindPrefixKey(statement, 1, keyPrefix); // first argument is key
347     if (errCode != E_OK) {
348         goto END;
349     }
350 
351     errCode = StepForResultEntries(isGetValue, statement, entries);
352 
353 END:
354     SQLiteUtils::ResetStatement(statement, true, errCode);
355     return CheckCorruptedStatus(errCode);
356 }
357 
GetEntries(QueryObject & queryObj,std::vector<Entry> & entries) const358 int SQLiteSingleVerStorageExecutor::GetEntries(QueryObject &queryObj, std::vector<Entry> &entries) const
359 {
360     int errCode = E_OK;
361     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
362     if (errCode != E_OK) {
363         return errCode;
364     }
365 
366     sqlite3_stmt *statement = nullptr;
367     errCode = helper.GetQuerySqlStatement(dbHandle_, false, statement);
368     if (errCode == E_OK) {
369         errCode = StepForResultEntries(true, statement, entries);
370     }
371 
372     SQLiteUtils::ResetStatement(statement, true, errCode);
373     return CheckCorruptedStatus(errCode);
374 }
375 
GetCount(QueryObject & queryObj,int & count) const376 int SQLiteSingleVerStorageExecutor::GetCount(QueryObject &queryObj, int &count) const
377 {
378     if (dbHandle_ == nullptr) {
379         return -E_INVALID_DB;
380     }
381 
382     int errCode = E_OK;
383     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
384     if (errCode != E_OK) {
385         return errCode;
386     }
387 
388     if (!queryObj.IsCountValid()) {
389         LOGE("GetCount no need limit or orderby");
390         return -E_INVALID_QUERY_FORMAT;
391     }
392 
393     std::string countSql;
394     errCode = helper.GetCountQuerySql(countSql);
395     if (errCode != E_OK) {
396         return errCode;
397     }
398 
399     sqlite3_stmt *countStatement = nullptr;
400     // get statement for count
401     errCode = helper.GetQuerySqlStatement(dbHandle_, countSql, countStatement);
402     if (errCode != E_OK) {
403         LOGE("Get count bind statement error:%d", errCode);
404         goto END;
405     }
406     // get count value
407     errCode = SQLiteUtils::StepWithRetry(countStatement, isMemDb_);
408     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
409         uint64_t readCount = static_cast<uint64_t>(sqlite3_column_int64(countStatement, 0));
410         if (readCount > INT32_MAX) {
411             LOGW("total count is beyond the max count");
412             count = 0;
413             errCode = -E_UNEXPECTED_DATA;
414         } else {
415             count = static_cast<int>(readCount);
416             errCode = E_OK;
417         }
418         LOGD("Entry count in this result set is %d", count);
419     } else {
420         errCode = -E_UNEXPECTED_DATA;
421     }
422 
423 END:
424     SQLiteUtils::ResetStatement(countStatement, true, errCode);
425     return CheckCorruptedStatus(errCode);
426 }
427 
InitCurrentMaxStamp(Timestamp & maxStamp)428 void SQLiteSingleVerStorageExecutor::InitCurrentMaxStamp(Timestamp &maxStamp)
429 {
430     if (dbHandle_ == nullptr) {
431         return;
432     }
433     std::string sql = ((executorState_ == ExecutorState::CACHE_ATTACH_MAIN) ?
434         SELECT_MAX_TIMESTAMP_SQL_FROM_CACHEHANDLE : SELECT_MAX_TIMESTAMP_SQL);
435     sqlite3_stmt *statement = nullptr;
436     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
437     if (errCode != E_OK) {
438         return;
439     }
440 
441     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
442     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
443         maxStamp = static_cast<uint64_t>(sqlite3_column_int64(statement, 0)); // get the first column
444     }
445     SQLiteUtils::ResetStatement(statement, true, errCode);
446 }
447 
PrepareForSyncDataByTime(Timestamp begin,Timestamp end,sqlite3_stmt * & statement,bool getDeletedData) const448 int SQLiteSingleVerStorageExecutor::PrepareForSyncDataByTime(Timestamp begin, Timestamp end,
449     sqlite3_stmt *&statement, bool getDeletedData) const
450 {
451     if (dbHandle_ == nullptr) {
452         return -E_INVALID_DB;
453     }
454 
455     const std::string sql = (getDeletedData ? SELECT_SYNC_DELETED_ENTRIES_SQL : SELECT_SYNC_ENTRIES_SQL);
456     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
457     if (errCode != E_OK) {
458         LOGE("Prepare the sync entries statement error:%d", errCode);
459         return errCode;
460     }
461 
462     errCode = SQLiteUtils::BindInt64ToStatement(statement, BIND_BEGIN_STAMP_INDEX, begin);
463     if (errCode != E_OK) {
464         goto ERROR;
465     }
466 
467     errCode = SQLiteUtils::BindInt64ToStatement(statement, BIND_END_STAMP_INDEX, end);
468 
469 ERROR:
470     if (errCode != E_OK) {
471         LOGE("Bind the timestamp for getting sync data error:%d", errCode);
472         SQLiteUtils::ResetStatement(statement, true, errCode);
473     }
474 
475     return CheckCorruptedStatus(errCode);
476 }
477 
ReleaseContinueStatement()478 void SQLiteSingleVerStorageExecutor::ReleaseContinueStatement()
479 {
480     if (getSyncStatement_ != nullptr) {
481         int errCode = E_OK;
482         SQLiteUtils::ResetStatement(getSyncStatement_, true, errCode);
483         if (errCode == -E_INVALID_PASSWD_OR_CORRUPTED_DB) {
484             SetCorruptedStatus();
485         }
486     }
487 }
488 
489 namespace {
GetDataItemForSync(sqlite3_stmt * statement,DataItem & dataItem)490 int GetDataItemForSync(sqlite3_stmt *statement, DataItem &dataItem)
491 {
492     dataItem.timestamp = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_TIME_INDEX));
493     dataItem.writeTimestamp = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_W_TIME_INDEX));
494     dataItem.flag = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_FLAG_INDEX));
495     dataItem.flag &= (~DataItem::LOCAL_FLAG);
496     std::vector<uint8_t> devVect;
497     int errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_ORI_DEV_INDEX, devVect);
498     if (errCode != E_OK) {
499         return errCode;
500     }
501     dataItem.origDev = std::string(devVect.begin(), devVect.end());
502     int keyIndex = SYNC_RES_KEY_INDEX;
503     // If the data has been deleted, just use the hash key for sync.
504     if ((dataItem.flag & DataItem::DELETE_FLAG) == DataItem::DELETE_FLAG) {
505         keyIndex = SYNC_RES_HASH_KEY_INDEX;
506     }
507     errCode = SQLiteUtils::GetColumnBlobValue(statement, keyIndex, dataItem.key);
508     if (errCode != E_OK) {
509         return errCode;
510     }
511     return SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_VAL_INDEX, dataItem.value);
512 }
513 }
514 
GetSyncDataItems(std::vector<DataItem> & dataItems,sqlite3_stmt * statement,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo) const515 int SQLiteSingleVerStorageExecutor::GetSyncDataItems(std::vector<DataItem> &dataItems, sqlite3_stmt *statement,
516     size_t appendLength, const DataSizeSpecInfo &dataSizeInfo) const
517 {
518     int errCode;
519     size_t dataTotalSize = 0;
520     do {
521         DataItem dataItem;
522         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
523         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
524             errCode = GetDataItemForSync(statement, dataItem);
525             if (errCode != E_OK) {
526                 LOGE("GetDataItemForSync failed:%d", errCode);
527                 return errCode;
528             }
529         } else {
530             if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
531                 LOGD("Get sync data finished, size of packet:%zu, number of item:%zu", dataTotalSize, dataItems.size());
532                 errCode = -E_FINISHED;
533             } else {
534                 LOGE("Get sync data error:%d", errCode);
535             }
536             break;
537         }
538 
539         // If dataTotalSize value is bigger than blockSize value , reserve the surplus data item.
540         dataTotalSize += GetDataItemSerialSize(dataItem, appendLength);
541         if ((dataTotalSize > dataSizeInfo.blockSize && !dataItems.empty()) ||
542             dataItems.size() >= dataSizeInfo.packetSize) {
543             errCode = -E_UNFINISHED;
544             break;
545         } else {
546             dataItems.push_back(std::move(dataItem));
547         }
548     } while (true);
549     return errCode;
550 }
551 
GetSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const552 int SQLiteSingleVerStorageExecutor::GetSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
553     Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
554 {
555     sqlite3_stmt *statement = nullptr;
556     int errCode = PrepareForSyncDataByTime(begin, end, statement);
557     if (errCode != E_OK) {
558         return errCode;
559     }
560 
561     errCode = GetSyncDataItems(dataItems, statement, appendLength, dataSizeInfo);
562     SQLiteUtils::ResetStatement(statement, true, errCode);
563     return CheckCorruptedStatus(errCode);
564 }
565 
GetDeletedSyncDataByTimestamp(std::vector<DataItem> & dataItems,size_t appendLength,Timestamp begin,Timestamp end,const DataSizeSpecInfo & dataSizeInfo) const566 int SQLiteSingleVerStorageExecutor::GetDeletedSyncDataByTimestamp(std::vector<DataItem> &dataItems, size_t appendLength,
567     Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo) const
568 {
569     sqlite3_stmt *statement = nullptr;
570     int errCode = PrepareForSyncDataByTime(begin, end, statement, true);
571     if (errCode != E_OK) {
572         return errCode;
573     }
574 
575     errCode = GetSyncDataItems(dataItems, statement, appendLength, dataSizeInfo);
576     SQLiteUtils::ResetStatement(statement, true, errCode);
577     return CheckCorruptedStatus(errCode);
578 }
579 
580 namespace {
AppendDataItem(std::vector<DataItem> & dataItems,const DataItem & item,size_t & dataTotalSize,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo)581 int AppendDataItem(std::vector<DataItem> &dataItems, const DataItem &item, size_t &dataTotalSize, size_t appendLength,
582     const DataSizeSpecInfo &dataSizeInfo)
583 {
584     // If dataTotalSize value is bigger than blockSize value , reserve the surplus data item.
585     size_t appendSize = dataTotalSize + SQLiteSingleVerStorageExecutor::GetDataItemSerialSize(item, appendLength);
586     if ((appendSize > dataSizeInfo.blockSize && !dataItems.empty()) || dataItems.size() >= dataSizeInfo.packetSize) {
587         return -E_UNFINISHED;
588     }
589     dataItems.push_back(item);
590     dataTotalSize = appendSize;
591     return E_OK;
592 }
593 
GetFullDataStatement(sqlite3 * db,const std::pair<Timestamp,Timestamp> & timeRange,sqlite3_stmt * & stmt)594 int GetFullDataStatement(sqlite3 *db, const std::pair<Timestamp, Timestamp> &timeRange, sqlite3_stmt *&stmt)
595 {
596     int errCode = SQLiteUtils::GetStatement(db, SELECT_SYNC_MODIFY_SQL, stmt);
597     if (errCode != E_OK) {
598         LOGE("Get statement failed. %d", errCode);
599         return errCode;
600     }
601     errCode = SQLiteUtils::BindInt64ToStatement(stmt, 1, timeRange.first); // 1 : Bind time rang index start
602     if (errCode != E_OK) {
603         LOGE("Bind time range to statement failed. %d", errCode);
604         goto ERR;
605     }
606     errCode = SQLiteUtils::BindInt64ToStatement(stmt, 2, timeRange.second); // 2 : Bind time rang index end
607     if (errCode != E_OK) {
608         LOGE("Bind time range to statement failed. %d", errCode);
609         goto ERR;
610     }
611     return E_OK; // do not release statement when success
612 ERR:
613     SQLiteUtils::ResetStatement(stmt, true, errCode);
614     return errCode;
615 }
616 
GetQueryDataStatement(sqlite3 * db,QueryObject query,const std::pair<Timestamp,Timestamp> & timeRange,sqlite3_stmt * & stmt)617 int GetQueryDataStatement(sqlite3 *db, QueryObject query, const std::pair<Timestamp, Timestamp> &timeRange,
618     sqlite3_stmt *&stmt)
619 {
620     int errCode = E_OK;
621     SqliteQueryHelper helper = query.GetQueryHelper(errCode);
622     if (errCode != E_OK) {
623         return errCode;
624     }
625     return helper.GetQuerySyncStatement(db, timeRange.first, timeRange.second, stmt);
626 }
627 
GetNextDataItem(sqlite3_stmt * stmt,bool isMemDB,DataItem & item)628 int GetNextDataItem(sqlite3_stmt *stmt, bool isMemDB, DataItem &item)
629 {
630     int errCode = SQLiteUtils::StepWithRetry(stmt, isMemDB);
631     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
632         errCode = GetDataItemForSync(stmt, item);
633     }
634     return errCode;
635 }
636 }
637 
GetSyncDataWithQuery(const QueryObject & query,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo,const std::pair<Timestamp,Timestamp> & timeRange,std::vector<DataItem> & dataItems) const638 int SQLiteSingleVerStorageExecutor::GetSyncDataWithQuery(const QueryObject &query, size_t appendLength,
639     const DataSizeSpecInfo &dataSizeInfo, const std::pair<Timestamp, Timestamp> &timeRange,
640     std::vector<DataItem> &dataItems) const
641 {
642     sqlite3_stmt *fullStmt = nullptr; // statement for get all modified data in the time range
643     sqlite3_stmt *queryStmt = nullptr; // statement for get modified data which is matched query in the time range
644     int errCode = GetQueryDataStatement(dbHandle_, query, timeRange, queryStmt);
645     if (errCode != E_OK) {
646         LOGE("Get query matched data statement failed. %d", errCode);
647         goto END;
648     }
649     if (query.IsQueryOnlyByKey()) {
650         // Query sync by prefixKey only should not deal with REMOTE_DEVICE_DATA_MISS_QUERY. Get the data directly.
651         errCode = GetSyncDataItems(dataItems, queryStmt, appendLength, dataSizeInfo);
652         goto END;
653     }
654     errCode = GetFullDataStatement(dbHandle_, timeRange, fullStmt);
655     if (errCode != E_OK) {
656         LOGE("Get full changed data statement failed. %d", errCode);
657         goto END;
658     }
659     errCode = GetSyncDataWithQuery(fullStmt, queryStmt, appendLength, dataSizeInfo, dataItems);
660     if (errCode != E_OK && errCode != -E_UNFINISHED && errCode != -E_FINISHED) {
661         LOGE("Get sync data with query failed. %d", errCode);
662     }
663 END:
664     SQLiteUtils::ResetStatement(fullStmt, true, errCode);
665     SQLiteUtils::ResetStatement(queryStmt, true, errCode);
666     return CheckCorruptedStatus(errCode);
667 }
668 
GetSyncDataWithQuery(sqlite3_stmt * fullStmt,sqlite3_stmt * queryStmt,size_t appendLength,const DataSizeSpecInfo & dataSizeInfo,std::vector<DataItem> & dataItems) const669 int SQLiteSingleVerStorageExecutor::GetSyncDataWithQuery(sqlite3_stmt *fullStmt, sqlite3_stmt *queryStmt,
670     size_t appendLength, const DataSizeSpecInfo &dataSizeInfo, std::vector<DataItem> &dataItems) const
671 {
672     int errCode = E_OK;
673     size_t dataTotalSize = 0;
674     DataItem fullItem;
675     DataItem matchItem;
676     bool isFullItemFinished = false;
677     bool isMatchItemFinished = false;
678     while (!isFullItemFinished || !isMatchItemFinished) {
679         errCode = GetNextDataItem(queryStmt, isMemDb_, matchItem);
680         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { // query finished
681             isMatchItemFinished = true;
682         } else if (errCode != E_OK) { // step failed or get data failed
683             LOGE("Get next query matched data failed. %d", errCode);
684             return errCode;
685         }
686         while (!isFullItemFinished) {
687             errCode = GetNextDataItem(fullStmt, isMemDb_, fullItem);
688             if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { // queryStmt is a subset of fullStmt
689                 isFullItemFinished = true;
690                 break;
691             } else if (errCode != E_OK) { // step failed or get data failed
692                 LOGE("Get next changed data failed. %d", errCode);
693                 return errCode;
694             }
695             bool matchData = true;
696             if (isMatchItemFinished || matchItem.key != fullItem.key) {
697                 matchData = false; // got miss query data
698                 DBCommon::CalcValueHash(fullItem.key, fullItem.key); // set and send key with hash_key
699                 Value().swap(fullItem.value); // not send value when data miss query
700                 fullItem.flag |= DataItem::REMOTE_DEVICE_DATA_MISS_QUERY; // mark with miss query flag
701             }
702             errCode = AppendDataItem(dataItems, fullItem, dataTotalSize, appendLength, dataSizeInfo);
703             if (errCode == -E_UNFINISHED) {
704                 goto END;
705             }
706             if (matchData) {
707                 break; // step to next match data
708             }
709         }
710     }
711 END:
712     LOGD("Get sync data finished, size of packet:%zu, number of item:%zu", dataTotalSize, dataItems.size());
713     return (isFullItemFinished && isMatchItemFinished) ? -E_FINISHED : errCode;
714 }
715 
OpenResultSet(const Key & keyPrefix,int & count)716 int SQLiteSingleVerStorageExecutor::OpenResultSet(const Key &keyPrefix, int &count)
717 {
718     sqlite3_stmt *countStatement = nullptr;
719     if (InitResultSet(keyPrefix, countStatement) != E_OK) {
720         LOGE("Initialize result set stat failed.");
721         return -E_INVALID_DB;
722     }
723 
724     int errCode = StartTransaction(TransactType::DEFERRED);
725     if (errCode != E_OK) {
726         goto END;
727     }
728 
729     // get count value
730     errCode = SQLiteUtils::StepWithRetry(countStatement, isMemDb_);
731     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
732         uint64_t readCount = static_cast<uint64_t>(sqlite3_column_int64(countStatement, 0));
733         if (readCount > INT32_MAX) {
734             LOGW("total count is beyond the max count");
735             count = 0;
736             errCode = -E_UNEXPECTED_DATA;
737         } else {
738             count = static_cast<int>(readCount);
739             errCode = E_OK;
740         }
741         LOGD("Entry count in this result set is %d", count);
742     } else {
743         errCode = -E_UNEXPECTED_DATA;
744     }
745 
746 END:
747     SQLiteUtils::ResetStatement(countStatement, true, errCode);
748     if (errCode != E_OK) {
749         CloseResultSet();
750     }
751     return CheckCorruptedStatus(errCode);
752 }
753 
OpenResultSet(QueryObject & queryObj,int & count)754 int SQLiteSingleVerStorageExecutor::OpenResultSet(QueryObject &queryObj, int &count)
755 {
756     sqlite3_stmt *countStatement = nullptr;
757     int errCode = InitResultSet(queryObj, countStatement);
758     if (errCode != E_OK) {
759         LOGE("Initialize result set stat failed.");
760         return errCode;
761     }
762 
763     errCode = StartTransaction(TransactType::DEFERRED);
764     if (errCode != E_OK) {
765         goto END;
766     }
767 
768     // get count value
769     errCode = SQLiteUtils::StepWithRetry(countStatement, isMemDb_);
770     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
771         uint64_t readCount = static_cast<uint64_t>(sqlite3_column_int64(countStatement, 0));
772         if (queryObj.HasLimit()) {
773             int limit = 0;
774             int offset = 0;
775             queryObj.GetLimitVal(limit, offset);
776             offset = (offset < 0) ? 0 : offset;
777             limit = (limit < 0) ? 0 : limit;
778             if (readCount <= static_cast<uint64_t>(offset)) {
779                 readCount = 0;
780             } else {
781                 readCount = std::min(readCount - offset, static_cast<uint64_t>(limit));
782             }
783         }
784 
785         if (readCount > INT32_MAX) {
786             LOGW("total count is beyond the max count");
787             count = 0;
788             errCode = -E_UNEXPECTED_DATA;
789         } else {
790             count = static_cast<int>(readCount);
791             errCode = E_OK;
792         }
793         LOGD("Entry count in this result set is %d", count);
794     } else {
795         errCode = -E_UNEXPECTED_DATA;
796     }
797 
798 END:
799     SQLiteUtils::ResetStatement(countStatement, true, errCode);
800     if (errCode != E_OK) {
801         CloseResultSet();
802     }
803     return CheckCorruptedStatus(errCode);
804 }
805 
OpenResultSetForCacheRowIdMode(const Key & keyPrefix,std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,int & count)806 int SQLiteSingleVerStorageExecutor::OpenResultSetForCacheRowIdMode(const Key &keyPrefix,
807     std::vector<int64_t> &rowIdCache, uint32_t cacheLimit, int &count)
808 {
809     if (dbHandle_ == nullptr) {
810         return -E_INVALID_DB;
811     }
812     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_ROWID_PREFIX_SQL, getResultRowIdStatement_);
813     if (errCode != E_OK) {
814         LOGE("[SqlSinExe][OpenResSetRowId][PrefixKey] Get rowId stmt fail, errCode=%d", errCode);
815         return CheckCorruptedStatus(errCode);
816     }
817     errCode = SQLiteUtils::BindPrefixKey(getResultRowIdStatement_, 1, keyPrefix); // first argument index is 1
818     if (errCode != E_OK) {
819         LOGE("[SqlSinExe][OpenResSetRowId][PrefixKey] Bind rowid stmt fail, errCode=%d", errCode);
820         SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
821         return CheckCorruptedStatus(errCode);
822     }
823     errCode = OpenResultSetForCacheRowIdModeCommon(rowIdCache, cacheLimit, count);
824     if (errCode != E_OK) {
825         SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
826     }
827     return errCode;
828 }
829 
OpenResultSetForCacheRowIdMode(QueryObject & queryObj,std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,int & count)830 int SQLiteSingleVerStorageExecutor::OpenResultSetForCacheRowIdMode(QueryObject &queryObj,
831     std::vector<int64_t> &rowIdCache, uint32_t cacheLimit, int &count)
832 {
833     if (dbHandle_ == nullptr) {
834         return -E_INVALID_DB;
835     }
836 
837     int errCode = E_OK;
838     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
839     if (errCode != E_OK) {
840         return errCode;
841     }
842 
843     if (!queryObj.IsValid()) {
844         LOGE("[SqlSinExe][OpenResSetRowId][Query] query object not Valid");
845         return -E_INVALID_QUERY_FORMAT;
846     }
847 
848     errCode = helper.GetQuerySqlStatement(dbHandle_, true, getResultRowIdStatement_);
849     if (errCode != E_OK) {
850         LOGE("[SqlSinExe][OpenResSetRowId][Query] Get Stmt fail, errCode=%d", errCode);
851         // The GetQuerySqlStatement does not self rollback(BAD...), so we have to reset the stmt here.
852         SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
853         return errCode;
854     }
855     errCode = OpenResultSetForCacheRowIdModeCommon(rowIdCache, cacheLimit, count);
856     if (errCode != E_OK) {
857         SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
858     }
859     return errCode;
860 }
861 
ReloadResultSet(const Key & keyPrefix)862 int SQLiteSingleVerStorageExecutor::ReloadResultSet(const Key &keyPrefix)
863 {
864     int errCode = ResetOrRegetStmt(dbHandle_, getResultRowIdStatement_, SELECT_SYNC_ROWID_PREFIX_SQL);
865     if (errCode != E_OK) {
866         return CheckCorruptedStatus(errCode);
867     }
868 
869     // No need to reset getResultEntryStatement_. Because the binding of it will be cleared in each get operation
870     errCode = SQLiteUtils::BindPrefixKey(getResultRowIdStatement_, 1, keyPrefix); // first argument is key
871     if (errCode != E_OK) {
872         LOGE("Rebind result set rowid statement of keyPrefix error:%d", errCode);
873         return CheckCorruptedStatus(errCode);
874     }
875     return E_OK;
876 }
877 
ReloadResultSet(QueryObject & queryObj)878 int SQLiteSingleVerStorageExecutor::ReloadResultSet(QueryObject &queryObj)
879 {
880     int errCode = E_OK;
881     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
882     if (errCode != E_OK) {
883         return errCode;
884     }
885 
886     if (!queryObj.IsValid()) {
887         return  -E_INVALID_QUERY_FORMAT;
888     }
889 
890     std::string sql;
891     errCode = helper.GetQuerySql(sql, true); // only rowid sql
892     if (errCode != E_OK) {
893         return errCode;
894     }
895 
896     errCode = ResetOrRegetStmt(dbHandle_, getResultRowIdStatement_, sql);
897     if (errCode != E_OK) {
898         return CheckCorruptedStatus(errCode);
899     }
900 
901     // No need to reset getResultEntryStatement_. Because the binding of it will be cleared in each get operation
902     // GetQuerySqlStatement will not alter getResultRowIdStatement_ if it is not null
903     errCode = helper.GetQuerySqlStatement(dbHandle_, true, getResultRowIdStatement_);
904     if (errCode != E_OK) {
905         LOGE("Rebind result set rowid statement of query error:%d", errCode);
906         return CheckCorruptedStatus(errCode);
907     }
908     return E_OK;
909 }
910 
ReloadResultSetForCacheRowIdMode(const Key & keyPrefix,std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,uint32_t cacheStartPos)911 int SQLiteSingleVerStorageExecutor::ReloadResultSetForCacheRowIdMode(const Key &keyPrefix,
912     std::vector<int64_t> &rowIdCache, uint32_t cacheLimit, uint32_t cacheStartPos)
913 {
914     int errCode = ReloadResultSet(keyPrefix); // Reuse this function(A convenience)
915     if (errCode != E_OK) {
916         return errCode;
917     }
918     int count = 0; // Ignored
919     errCode = ResultSetLoadRowIdCache(rowIdCache, cacheLimit, cacheStartPos, count);
920     if (errCode != E_OK) {
921         LOGE("[SqlSinExe][ReloadResSet][KeyPrefix] Load fail, errCode=%d", errCode);
922     }
923     // We can just return, no need to reset the statement
924     return errCode;
925 }
926 
ReloadResultSetForCacheRowIdMode(QueryObject & queryObj,std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,uint32_t cacheStartPos)927 int SQLiteSingleVerStorageExecutor::ReloadResultSetForCacheRowIdMode(QueryObject &queryObj,
928     std::vector<int64_t> &rowIdCache, uint32_t cacheLimit, uint32_t cacheStartPos)
929 {
930     int errCode = ReloadResultSet(queryObj); // Reuse this function(A convenience)
931     if (errCode != E_OK) {
932         return errCode;
933     }
934     int count = 0; // Ignored
935     errCode = ResultSetLoadRowIdCache(rowIdCache, cacheLimit, cacheStartPos, count);
936     if (errCode != E_OK) {
937         LOGE("[SqlSinExe][ReloadResSet][Query] Load fail, errCode=%d", errCode);
938     }
939     // We can just return, no need to reset the statement
940     return errCode;
941 }
942 
GetNextEntryFromResultSet(Key & key,Value & value,bool isCopy)943 int SQLiteSingleVerStorageExecutor::GetNextEntryFromResultSet(Key &key, Value &value, bool isCopy)
944 {
945     if (getResultRowIdStatement_ == nullptr || getResultEntryStatement_ == nullptr) {
946         return -E_RESULT_SET_STATUS_INVALID;
947     }
948 
949     int errCode = SQLiteUtils::StepWithRetry(getResultRowIdStatement_, isMemDb_);
950     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
951         if (!isCopy) {
952             return E_OK;
953         }
954         int64_t rowId = sqlite3_column_int64(getResultRowIdStatement_, 0);
955         errCode = E_OK;
956         SQLiteUtils::ResetStatement(getResultEntryStatement_, false, errCode);
957         if (errCode != E_OK) {
958             LOGE("[SqlSinExe][GetNext] Reset result set entry statement fail, errCode=%d.", errCode);
959             return CheckCorruptedStatus(errCode);
960         }
961 
962         SQLiteUtils::BindInt64ToStatement(getResultEntryStatement_, 1, rowId);
963         errCode = SQLiteUtils::StepWithRetry(getResultEntryStatement_, isMemDb_);
964         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
965             errCode = SQLiteUtils::GetColumnBlobValue(getResultEntryStatement_, 0, key);
966             if (errCode != E_OK) {
967                 LOGE("[SqlSinExe][GetNext] Get key failed:%d", errCode);
968                 return CheckCorruptedStatus(errCode);
969             }
970             errCode = SQLiteUtils::GetColumnBlobValue(getResultEntryStatement_, 1, value);
971             if (errCode != E_OK) {
972                 LOGE("[SqlSinExe][GetNext] Get value failed:%d", errCode);
973                 return CheckCorruptedStatus(errCode);
974             }
975             return E_OK;
976         } else {
977             return -E_UNEXPECTED_DATA;
978         }
979     }
980     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
981         return -E_FINISHED;
982     }
983 
984     LOGE("SQLite step failed:%d", errCode);
985     return CheckCorruptedStatus(errCode);
986 }
987 
GetEntryByRowId(int64_t rowId,Entry & entry)988 int SQLiteSingleVerStorageExecutor::GetEntryByRowId(int64_t rowId, Entry &entry)
989 {
990     if (getResultEntryStatement_ == nullptr) {
991         return -E_RESULT_SET_STATUS_INVALID;
992     }
993     int errCode = E_OK;
994     SQLiteUtils::ResetStatement(getResultEntryStatement_, false, errCode);
995     if (errCode != E_OK) {
996         LOGE("[SqlSinExe][GetEntryByRowid] Reset result set entry statement fail, errCode=%d.", errCode);
997         return CheckCorruptedStatus(errCode);
998     }
999     SQLiteUtils::BindInt64ToStatement(getResultEntryStatement_, 1, rowId);
1000     errCode = SQLiteUtils::StepWithRetry(getResultEntryStatement_, isMemDb_);
1001     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1002         errCode = SQLiteUtils::GetColumnBlobValue(getResultEntryStatement_, 0, entry.key);
1003         if (errCode != E_OK) {
1004             LOGE("[SqlSinExe][GetEntryByRowid] Get key failed, errCode=%d.", errCode);
1005             return CheckCorruptedStatus(errCode);
1006         }
1007         errCode = SQLiteUtils::GetColumnBlobValue(getResultEntryStatement_, 1, entry.value);
1008         if (errCode != E_OK) {
1009             LOGE("[SqlSinExe][GetEntryByRowid] Get value failed, errCode=%d.", errCode);
1010             return CheckCorruptedStatus(errCode);
1011         }
1012         return E_OK;
1013     } else {
1014         LOGE("[SqlSinExe][GetEntryByRowid] Step failed, errCode=%d.", errCode);
1015         return -E_UNEXPECTED_DATA;
1016     }
1017 }
1018 
CloseResultSet()1019 void SQLiteSingleVerStorageExecutor::CloseResultSet()
1020 {
1021     int errCode = E_OK;
1022     SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
1023     if (errCode == -E_INVALID_PASSWD_OR_CORRUPTED_DB) {
1024         SetCorruptedStatus();
1025     }
1026     SQLiteUtils::ResetStatement(getResultEntryStatement_, true, errCode);
1027     if (errCode == -E_INVALID_PASSWD_OR_CORRUPTED_DB) {
1028         SetCorruptedStatus();
1029     }
1030     if (isTransactionOpen_) {
1031         SQLiteUtils::RollbackTransaction(dbHandle_);
1032         isTransactionOpen_ = false;
1033     }
1034 }
1035 
StartTransaction(TransactType type)1036 int SQLiteSingleVerStorageExecutor::StartTransaction(TransactType type)
1037 {
1038     if (dbHandle_ == nullptr) {
1039         LOGE("Begin transaction failed, dbHandle is null.");
1040         return -E_INVALID_DB;
1041     }
1042     int errCode = SQLiteUtils::BeginTransaction(dbHandle_, type);
1043     if (errCode == E_OK) {
1044         isTransactionOpen_ = true;
1045     } else {
1046         LOGE("Begin transaction failed, errCode = %d", errCode);
1047     }
1048     return CheckCorruptedStatus(errCode);
1049 }
1050 
Commit()1051 int SQLiteSingleVerStorageExecutor::Commit()
1052 {
1053     if (dbHandle_ == nullptr) {
1054         return -E_INVALID_DB;
1055     }
1056     int errCode = SQLiteUtils::CommitTransaction(dbHandle_);
1057     if (errCode != E_OK) {
1058         return CheckCorruptedStatus(errCode);
1059     }
1060     isTransactionOpen_ = false;
1061     return E_OK;
1062 }
1063 
Rollback()1064 int SQLiteSingleVerStorageExecutor::Rollback()
1065 {
1066     if (dbHandle_ == nullptr) {
1067         return -E_INVALID_DB;
1068     }
1069     int errCode = SQLiteUtils::RollbackTransaction(dbHandle_);
1070     if (errCode != E_OK) {
1071         LOGE("sqlite single ver storage executor rollback fail! errCode = [%d]", errCode);
1072         return CheckCorruptedStatus(errCode);
1073     }
1074     isTransactionOpen_ = false;
1075     return E_OK;
1076 }
1077 
CheckIfKeyExisted(const Key & key,bool isLocal,Value & value,Timestamp & timestamp) const1078 bool SQLiteSingleVerStorageExecutor::CheckIfKeyExisted(const Key &key, bool isLocal,
1079     Value &value, Timestamp &timestamp) const
1080 {
1081     // not local value, no need to get the value.
1082     if (!isLocal) {
1083         return false;
1084     }
1085 
1086     int errCode = GetKvData(SingleVerDataType::LOCAL_TYPE, key, value, timestamp);
1087     if (errCode != E_OK) {
1088         return false;
1089     }
1090     return true;
1091 }
1092 
GetDeviceIdentifier(PragmaEntryDeviceIdentifier * identifier)1093 int SQLiteSingleVerStorageExecutor::GetDeviceIdentifier(PragmaEntryDeviceIdentifier *identifier)
1094 {
1095     if (identifier == nullptr) {
1096         return -E_INVALID_ARGS;
1097     }
1098 
1099     if (dbHandle_ == nullptr) {
1100         return -E_INVALID_DB;
1101     }
1102 
1103     sqlite3_stmt *statement = nullptr;
1104     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_ENTRY_DEVICE, statement);
1105     if (errCode != E_OK) {
1106         return errCode;
1107     }
1108 
1109     int keyIndex = identifier->origDevice ? BIND_ORI_DEVICE_ID : BIND_PRE_DEVICE_ID;
1110     errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_KV_KEY_INDEX, identifier->key, false);
1111     if (errCode != E_OK) {
1112         goto END;
1113     }
1114 
1115     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1116     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1117         std::vector<uint8_t> deviceId;
1118         errCode = SQLiteUtils::GetColumnBlobValue(statement, keyIndex, deviceId);
1119         identifier->deviceIdentifier.assign(deviceId.begin(), deviceId.end());
1120     } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1121         errCode = -E_NOT_FOUND;
1122     }
1123 
1124 END:
1125     SQLiteUtils::ResetStatement(statement, true, errCode);
1126     return CheckCorruptedStatus(errCode);
1127 }
1128 
PutIntoCommittedData(const DataItem & itemPut,const DataItem & itemGet,const DataOperStatus & status,SingleVerNaturalStoreCommitNotifyData * committedData)1129 void SQLiteSingleVerStorageExecutor::PutIntoCommittedData(const DataItem &itemPut, const DataItem &itemGet,
1130     const DataOperStatus &status, SingleVerNaturalStoreCommitNotifyData *committedData)
1131 {
1132     if (committedData == nullptr) {
1133         return;
1134     }
1135 
1136     Entry entry;
1137     int errCode;
1138     if (!status.isDeleted) {
1139         entry.key = itemPut.key;
1140         entry.value = itemPut.value;
1141         DataType dataType = (status.preStatus == DataStatus::EXISTED) ? DataType::UPDATE : DataType::INSERT;
1142         errCode = committedData->InsertCommittedData(std::move(entry), dataType, true);
1143     } else {
1144         entry.key = itemGet.key;
1145         entry.value = itemGet.value;
1146         errCode = committedData->InsertCommittedData(std::move(entry), DataType::DELETE, true);
1147     }
1148 
1149     if (errCode != E_OK) {
1150         LOGE("[SingleVerExe][PutCommitData]Insert failed:%d", errCode);
1151     }
1152 }
1153 
PrepareForSavingData(const std::string & readSql,const std::string & insertSql,const std::string & updateSql,SaveRecordStatements & statements) const1154 int SQLiteSingleVerStorageExecutor::PrepareForSavingData(const std::string &readSql, const std::string &insertSql,
1155     const std::string &updateSql, SaveRecordStatements &statements) const
1156 {
1157     int errCode = SQLiteUtils::GetStatement(dbHandle_, readSql, statements.queryStatement);
1158     if (errCode != E_OK) {
1159         LOGE("Get query statement failed. errCode = [%d]", errCode);
1160         goto ERR;
1161     }
1162 
1163     errCode = SQLiteUtils::GetStatement(dbHandle_, insertSql, statements.insertStatement);
1164     if (errCode != E_OK) {
1165         LOGE("Get insert statement failed. errCode = [%d]", errCode);
1166         goto ERR;
1167     }
1168 
1169     errCode = SQLiteUtils::GetStatement(dbHandle_, updateSql, statements.updateStatement);
1170     if (errCode != E_OK) {
1171         LOGE("Get update statement failed. errCode = [%d]", errCode);
1172         goto ERR;
1173     }
1174     return E_OK;
1175 ERR:
1176     (void)statements.ResetStatement();
1177     return errCode;
1178 }
1179 
PrepareForSavingData(SingleVerDataType type)1180 int SQLiteSingleVerStorageExecutor::PrepareForSavingData(SingleVerDataType type)
1181 {
1182     int errCode = -E_NOT_SUPPORT;
1183     if (type == SingleVerDataType::LOCAL_TYPE) {
1184         // currently, Local type has not been optimized, so pass updateSql parameter with INSERT_LOCAL_SQL
1185         errCode = PrepareForSavingData(SELECT_LOCAL_HASH_SQL, INSERT_LOCAL_SQL, INSERT_LOCAL_SQL, saveLocalStatements_);
1186     } else if (type == SingleVerDataType::SYNC_TYPE) {
1187         errCode = PrepareForSavingData(SELECT_SYNC_HASH_SQL, INSERT_SYNC_SQL, UPDATE_SYNC_SQL, saveSyncStatements_);
1188     }
1189     return CheckCorruptedStatus(errCode);
1190 }
1191 
ResetForSavingData(SingleVerDataType type)1192 int SQLiteSingleVerStorageExecutor::ResetForSavingData(SingleVerDataType type)
1193 {
1194     int errCode = E_OK;
1195     if (type == SingleVerDataType::LOCAL_TYPE) {
1196         SQLiteUtils::ResetStatement(saveLocalStatements_.insertStatement, false, errCode);
1197         SQLiteUtils::ResetStatement(saveLocalStatements_.updateStatement, false, errCode);
1198         SQLiteUtils::ResetStatement(saveLocalStatements_.queryStatement, false, errCode);
1199     } else if (type == SingleVerDataType::SYNC_TYPE) {
1200         SQLiteUtils::ResetStatement(saveSyncStatements_.insertStatement, false, errCode);
1201         SQLiteUtils::ResetStatement(saveSyncStatements_.updateStatement, false, errCode);
1202         SQLiteUtils::ResetStatement(saveSyncStatements_.queryStatement, false, errCode);
1203     }
1204     return CheckCorruptedStatus(errCode);
1205 }
1206 
GetOriginDevName(const DataItem & dataItem,const std::string & origDevGet)1207 std::string SQLiteSingleVerStorageExecutor::GetOriginDevName(const DataItem &dataItem,
1208     const std::string &origDevGet)
1209 {
1210     if (((dataItem.flag & DataItem::LOCAL_FLAG) != 0) && dataItem.origDev.empty()) {
1211         return origDevGet;
1212     }
1213     return dataItem.origDev;
1214 }
1215 
SaveSyncDataToDatabase(const DataItem & dataItem,const Key & hashKey,const std::string & origDev,const std::string & deviceName,bool isUpdate)1216 int SQLiteSingleVerStorageExecutor::SaveSyncDataToDatabase(const DataItem &dataItem, const Key &hashKey,
1217     const std::string &origDev, const std::string &deviceName, bool isUpdate)
1218 {
1219     if ((dataItem.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) == DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) {
1220         LOGD("Find query data missing, erase local data.");
1221         return EraseSyncData(hashKey);
1222     }
1223     auto statement = saveSyncStatements_.GetDataSaveStatement(isUpdate);
1224     if (statement == nullptr) {
1225         return -E_INVALID_ARGS;
1226     }
1227 
1228     std::string devName = DBCommon::TransferHashString(deviceName);
1229     int errCode = BindSavedSyncData(statement, dataItem, hashKey, {origDev, devName}, isUpdate);
1230     if (errCode != E_OK) {
1231         return errCode;
1232     }
1233 
1234     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1235     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1236         errCode = E_OK;
1237     }
1238     return errCode;
1239 }
1240 
JudgeSyncSaveType(DataItem & dataItem,const DataItem & itemGet,const std::string & devName,bool isHashKeyExisted,bool isPermitForceWrite)1241 DataOperStatus SQLiteSingleVerStorageExecutor::JudgeSyncSaveType(DataItem &dataItem,
1242     const DataItem &itemGet, const std::string &devName, bool isHashKeyExisted, bool isPermitForceWrite)
1243 {
1244     DataOperStatus status;
1245     status.isDeleted = ((dataItem.flag & DataItem::DELETE_FLAG) == DataItem::DELETE_FLAG ||
1246         (dataItem.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) == DataItem::REMOTE_DEVICE_DATA_MISS_QUERY);
1247     if (isHashKeyExisted) {
1248         if ((itemGet.flag & DataItem::DELETE_FLAG) != 0) {
1249             status.preStatus = DataStatus::DELETED;
1250         } else {
1251             status.preStatus = DataStatus::EXISTED;
1252         }
1253         std::string deviceName = DBCommon::TransferHashString(devName);
1254         if (itemGet.writeTimestamp >= dataItem.writeTimestamp) {
1255             // for multi user mode, no permit to forcewrite
1256             if ((!deviceName.empty()) && (itemGet.dev == deviceName) && isPermitForceWrite) {
1257                 LOGI("Force overwrite the data:%" PRIu64 " vs %" PRIu64,
1258                     itemGet.writeTimestamp, dataItem.writeTimestamp);
1259                 status.isDefeated = false;
1260                 dataItem.writeTimestamp = itemGet.writeTimestamp + 1;
1261                 dataItem.timestamp = itemGet.timestamp;
1262             } else {
1263                 status.isDefeated = true;
1264             }
1265         }
1266     }
1267     return status;
1268 }
1269 
GetSyncDataItemExt(const DataItem & dataItem,DataItem & itemGet,const DataOperStatus & dataStatus) const1270 int SQLiteSingleVerStorageExecutor::GetSyncDataItemExt(const DataItem &dataItem, DataItem &itemGet,
1271     const DataOperStatus &dataStatus) const
1272 {
1273     if (dataStatus.preStatus != DataStatus::EXISTED) {
1274         return E_OK;
1275     }
1276     auto statement = isSyncMigrating_ ? migrateSyncStatements_.queryStatement : saveSyncStatements_.queryStatement;
1277     // only deleted item need origin value.
1278     int errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_KEY_INDEX, itemGet.key);
1279     if (errCode != E_OK) {
1280         return errCode;
1281     }
1282 
1283     errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_VAL_INDEX, itemGet.value);
1284     if (errCode != E_OK) {
1285         LOGE("Get column value data failed:%d", errCode);
1286     }
1287 
1288     return errCode;
1289 }
1290 
ResetSaveSyncStatements(int errCode)1291 int SQLiteSingleVerStorageExecutor::ResetSaveSyncStatements(int errCode)
1292 {
1293     SQLiteUtils::ResetStatement(saveSyncStatements_.insertStatement, false, errCode);
1294     SQLiteUtils::ResetStatement(saveSyncStatements_.updateStatement, false, errCode);
1295     SQLiteUtils::ResetStatement(saveSyncStatements_.queryStatement, false, errCode);
1296     return CheckCorruptedStatus(errCode);
1297 }
1298 
1299 namespace {
IsNeedIgnoredData(const DataItem & itemPut,const DataItem & itemGet,const DeviceInfo & devInfo,bool isHashKeyExisted,int policy)1300     inline bool IsNeedIgnoredData(const DataItem &itemPut, const DataItem &itemGet,
1301         const DeviceInfo &devInfo, bool isHashKeyExisted, int policy)
1302     {
1303         // deny the data synced from other dev which the origin dev is current or the existed value is current dev data.
1304         return (((itemGet.origDev.empty() && isHashKeyExisted) || itemPut.origDev.empty()) &&
1305             (!devInfo.isLocal && policy == DENY_OTHER_DEV_AMEND_CUR_DEV_DATA));
1306     }
1307 }
1308 
PrepareForNotifyConflictAndObserver(DataItem & dataItem,const DeviceInfo & deviceInfo,NotifyConflictAndObserverData & notify,bool isPermitForceWrite)1309 int SQLiteSingleVerStorageExecutor::PrepareForNotifyConflictAndObserver(DataItem &dataItem,
1310     const DeviceInfo &deviceInfo, NotifyConflictAndObserverData &notify, bool isPermitForceWrite)
1311 {
1312     // Check sava data existed info
1313     int errCode = GetSyncDataItemPre(dataItem, notify.getData, notify.hashKey);
1314     if (errCode != E_OK && errCode != -E_NOT_FOUND) {
1315         LOGD("[SingleVerExe][PrepareForNotifyConflictAndObserver] failed:%d", errCode);
1316         if (isSyncMigrating_) {
1317             ResetForMigrateCacheData();
1318             return errCode;
1319         }
1320         return ResetSaveSyncStatements(errCode);
1321     }
1322 
1323     bool isHashKeyExisted = (errCode != -E_NOT_FOUND);
1324     if (IsNeedIgnoredData(dataItem, notify.getData, deviceInfo, isHashKeyExisted, conflictResolvePolicy_)) {
1325         LOGD("[SingleVerExe] Ignore the sync data.");
1326         if (isSyncMigrating_) {
1327             ResetForMigrateCacheData();
1328             return -E_IGNORE_DATA;
1329         }
1330         return ResetSaveSyncStatements(-E_IGNORE_DATA);
1331     }
1332 
1333     notify.dataStatus = JudgeSyncSaveType(dataItem, notify.getData, deviceInfo.deviceName, isHashKeyExisted,
1334         isPermitForceWrite);
1335     InitCommitNotifyDataKeyStatus(notify.committedData, notify.hashKey, notify.dataStatus);
1336 
1337     // Nonexistent data, but deleted by local.
1338     if ((notify.dataStatus.preStatus == DataStatus::DELETED || notify.dataStatus.preStatus == DataStatus::NOEXISTED) &&
1339         (dataItem.flag & DataItem::DELETE_FLAG) != 0 &&
1340         (dataItem.flag & DataItem::LOCAL_FLAG) != 0) {
1341         // For delete item in cacheDB, which not in mainDB. Cannot notify, but this is not error.
1342         errCode = -E_NOT_FOUND;
1343         LOGD("Nonexistent data, but deleted by local");
1344         if (isSyncMigrating_) {
1345             ResetForMigrateCacheData();
1346             return errCode;
1347         }
1348         return ResetSaveSyncStatements(errCode);
1349     }
1350 
1351     // get key and value from ori database
1352     errCode = GetSyncDataItemExt(dataItem, notify.getData, notify.dataStatus);
1353     if (errCode != E_OK) {
1354         LOGD("GetSyncDataItemExt failed:%d", errCode);
1355         if (isSyncMigrating_) {
1356             ResetForMigrateCacheData();
1357             return errCode;
1358         }
1359         return ResetSaveSyncStatements(errCode);
1360     }
1361 
1362     return E_OK;
1363 }
1364 
SaveSyncDataItem(DataItem & dataItem,const DeviceInfo & deviceInfo,Timestamp & maxStamp,SingleVerNaturalStoreCommitNotifyData * committedData,bool isPermitForceWrite)1365 int SQLiteSingleVerStorageExecutor::SaveSyncDataItem(DataItem &dataItem, const DeviceInfo &deviceInfo,
1366     Timestamp &maxStamp, SingleVerNaturalStoreCommitNotifyData *committedData, bool isPermitForceWrite)
1367 {
1368     NotifyConflictAndObserverData notify = {
1369         .committedData = committedData
1370     };
1371 
1372     int errCode = PrepareForNotifyConflictAndObserver(dataItem, deviceInfo, notify, isPermitForceWrite);
1373     if (errCode != E_OK) {
1374         if (errCode == -E_IGNORE_DATA) {
1375             errCode = E_OK;
1376         }
1377         return errCode;
1378     }
1379 
1380     PutConflictData(dataItem, notify.getData, deviceInfo, notify.dataStatus, committedData);
1381     if (notify.dataStatus.isDefeated) {
1382         LOGD("Data status is defeated:%d", errCode);
1383         return ResetSaveSyncStatements(errCode);
1384     }
1385 
1386     bool isUpdate = (notify.dataStatus.preStatus != DataStatus::NOEXISTED);
1387     std::string origDev = GetOriginDevName(dataItem, notify.getData.origDev);
1388     errCode = SaveSyncDataToDatabase(dataItem, notify.hashKey, origDev, deviceInfo.deviceName, isUpdate);
1389     if (errCode == E_OK) {
1390         PutIntoCommittedData(dataItem, notify.getData, notify.dataStatus, committedData);
1391         maxStamp = std::max(dataItem.timestamp, maxStamp);
1392     } else {
1393         LOGE("Save sync data to db failed:%d", errCode);
1394     }
1395     return ResetSaveSyncStatements(errCode);
1396 }
1397 
GetAllMetaKeys(std::vector<Key> & keys) const1398 int SQLiteSingleVerStorageExecutor::GetAllMetaKeys(std::vector<Key> &keys) const
1399 {
1400     sqlite3_stmt *statement = nullptr;
1401     const std::string &sqlStr = (attachMetaMode_ ? SELECT_ATTACH_ALL_META_KEYS : SELECT_ALL_META_KEYS);
1402     int errCode = SQLiteUtils::GetStatement(dbHandle_, sqlStr, statement);
1403     if (errCode != E_OK) {
1404         LOGE("[SingleVerExe][GetAllKey] Get statement failed:%d", errCode);
1405         return errCode;
1406     }
1407 
1408     errCode = SqliteMetaExecutor::GetAllKeys(statement, isMemDb_, keys);
1409     SQLiteUtils::ResetStatement(statement, true, errCode);
1410     return errCode;
1411 }
1412 
GetAllSyncedEntries(const std::string & hashDev,std::vector<Entry> & entries) const1413 int SQLiteSingleVerStorageExecutor::GetAllSyncedEntries(const std::string &hashDev,
1414     std::vector<Entry> &entries) const
1415 {
1416     int errCode = E_OK;
1417     sqlite3_stmt *statement = nullptr;
1418     if (hashDev.empty()) {
1419         std::string sql = (executorState_ == ExecutorState::CACHE_ATTACH_MAIN ?
1420         SELECT_ALL_SYNC_ENTRIES_FROM_CACHEHANDLE : SELECT_ALL_SYNC_ENTRIES);
1421         errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
1422         if (errCode != E_OK) {
1423             LOGE("Get all entries statement failed:%d", errCode);
1424             return errCode;
1425         }
1426     } else {
1427         std::string sql = (executorState_ == ExecutorState::CACHE_ATTACH_MAIN ?
1428             SELECT_ALL_SYNC_ENTRIES_BY_DEV_FROM_CACHEHANDLE : SELECT_ALL_SYNC_ENTRIES_BY_DEV);
1429         errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
1430         if (errCode != E_OK) {
1431             LOGE("Get all entries statement failed:%d", errCode);
1432             return errCode;
1433         }
1434 
1435         // deviceName always hash string
1436         std::vector<uint8_t> devVect(hashDev.begin(), hashDev.end());
1437         errCode = SQLiteUtils::BindBlobToStatement(statement, 1, devVect, true); // bind the 1st to device.
1438         if (errCode != E_OK) {
1439             LOGE("Failed to bind the synced device for all entries:%d", errCode);
1440             goto END;
1441         }
1442     }
1443 
1444     errCode = GetAllEntries(statement, entries);
1445 END:
1446     SQLiteUtils::ResetStatement(statement, true, errCode);
1447     return errCode;
1448 }
1449 
GetAllEntries(sqlite3_stmt * statement,std::vector<Entry> & entries) const1450 int SQLiteSingleVerStorageExecutor::GetAllEntries(sqlite3_stmt *statement, std::vector<Entry> &entries) const
1451 {
1452     if (statement == nullptr) {
1453         return -E_INVALID_DB;
1454     }
1455     int errCode;
1456     do {
1457         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1458         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1459             Entry entry;
1460             errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, entry.key); // No.0 is the key
1461             if (errCode != E_OK) {
1462                 break;
1463             }
1464             errCode = SQLiteUtils::GetColumnBlobValue(statement, 1, entry.value); // No.1 is the value
1465             if (errCode != E_OK) {
1466                 break;
1467             }
1468 
1469             entries.push_back(std::move(entry));
1470         } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1471             errCode = E_OK;
1472             break;
1473         } else {
1474             LOGE("SQLite step for all entries failed:%d", errCode);
1475             break;
1476         }
1477     } while (true);
1478 
1479     return errCode;
1480 }
1481 
BindSavedSyncData(sqlite3_stmt * statement,const DataItem & dataItem,const Key & hashKey,const SyncDataDevices & devices,bool isUpdate)1482 int SQLiteSingleVerStorageExecutor::BindSavedSyncData(sqlite3_stmt *statement, const DataItem &dataItem,
1483     const Key &hashKey, const SyncDataDevices &devices, bool isUpdate)
1484 {
1485     const int hashKeyIndex = isUpdate ? BIND_SYNC_UPDATE_HASH_KEY_INDEX : BIND_SYNC_HASH_KEY_INDEX;
1486     int errCode = SQLiteUtils::BindBlobToStatement(statement, hashKeyIndex, hashKey, false);
1487     if (errCode != E_OK) {
1488         LOGE("Bind saved sync data hash key failed:%d", errCode);
1489         return errCode;
1490     }
1491 
1492     // if delete flag is set, just use the hash key instead of the key
1493     if ((dataItem.flag & DataItem::DELETE_FLAG) == DataItem::DELETE_FLAG) {
1494         errCode = SQLiteUtils::MapSQLiteErrno(sqlite3_bind_zeroblob(statement, BIND_SYNC_KEY_INDEX, -1));
1495     } else {
1496         errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_SYNC_KEY_INDEX, dataItem.key, false);
1497     }
1498 
1499     if (errCode != E_OK) {
1500         LOGE("Bind saved sync data key failed:%d", errCode);
1501         return errCode;
1502     }
1503 
1504     errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_SYNC_VAL_INDEX, dataItem.value, true);
1505     if (errCode != E_OK) {
1506         LOGE("Bind saved sync data value failed:%d", errCode);
1507         return errCode;
1508     }
1509 
1510     errCode = SQLiteUtils::BindInt64ToStatement(statement, BIND_SYNC_STAMP_INDEX, dataItem.timestamp);
1511     if (errCode != E_OK) {
1512         LOGE("Bind saved sync data stamp failed:%d", errCode);
1513         return errCode;
1514     }
1515 
1516     const int writeTimeIndex = isUpdate ? BIND_SYNC_UPDATE_W_TIME_INDEX : BIND_SYNC_W_TIME_INDEX;
1517     errCode = SQLiteUtils::BindInt64ToStatement(statement, writeTimeIndex, dataItem.writeTimestamp);
1518     LOGD("Write timestamp:%" PRIu64 " timestamp:%" PRIu64 ", %" PRIu64,
1519         dataItem.writeTimestamp, dataItem.timestamp, dataItem.flag);
1520     if (errCode != E_OK) {
1521         LOGE("Bind saved sync data write stamp failed:%d", errCode);
1522         return errCode;
1523     }
1524 
1525     return BindDevForSavedSyncData(statement, dataItem, devices.origDev, devices.dev);
1526 }
1527 
PutConflictData(const DataItem & itemPut,const DataItem & itemGet,const DeviceInfo & deviceInfo,const DataOperStatus & dataStatus,SingleVerNaturalStoreCommitNotifyData * commitData)1528 void SQLiteSingleVerStorageExecutor::PutConflictData(const DataItem &itemPut, const DataItem &itemGet,
1529     const DeviceInfo &deviceInfo, const DataOperStatus &dataStatus,
1530     SingleVerNaturalStoreCommitNotifyData *commitData)
1531 {
1532     if (commitData == nullptr) {
1533         return;
1534     }
1535 
1536     bool conflictNotifyMatch = commitData->IsConflictedNotifyMatched(itemPut, itemGet);
1537     if (!conflictNotifyMatch) {
1538         return;
1539     }
1540 
1541     if (dataStatus.preStatus == DataStatus::NOEXISTED ||
1542         ((dataStatus.preStatus == DataStatus::DELETED) && dataStatus.isDeleted)) {
1543         return;
1544     }
1545 
1546     Key origKey;
1547     if ((itemPut.flag & DataItem::DELETE_FLAG) == DataItem::DELETE_FLAG ||
1548         (itemPut.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) == DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) {
1549         origKey = itemGet.key;
1550     } else {
1551         origKey = itemPut.key;
1552     }
1553 
1554     // insert db original entry
1555     std::vector<uint8_t> getDevVect(itemGet.dev.begin(), itemGet.dev.end());
1556     DataItemInfo orgItemInfo = {itemGet, true, getDevVect};
1557     orgItemInfo.dataItem.key = origKey;
1558     commitData->InsertConflictedItem(orgItemInfo, true);
1559 
1560     // insert conflict entry
1561     std::string putDeviceName = DBCommon::TransferHashString(deviceInfo.deviceName);
1562     std::vector<uint8_t> putDevVect(putDeviceName.begin(), putDeviceName.end());
1563 
1564     DataItemInfo newItemInfo = {itemPut, deviceInfo.isLocal, putDevVect};
1565     newItemInfo.dataItem.key = origKey;
1566     commitData->InsertConflictedItem(newItemInfo, false);
1567 }
1568 
Reset()1569 int SQLiteSingleVerStorageExecutor::Reset()
1570 {
1571     if (isTransactionOpen_) {
1572         Rollback();
1573     }
1574 
1575     int errCode = ResetForSavingData(SingleVerDataType::SYNC_TYPE);
1576     if (errCode != E_OK) {
1577         LOGE("Finalize the sync resources for saving sync data failed: %d", errCode);
1578     }
1579 
1580     errCode = ResetForSavingData(SingleVerDataType::LOCAL_TYPE);
1581     if (errCode != E_OK) {
1582         LOGE("Finalize the local resources for saving sync data failed: %d", errCode);
1583     }
1584     return SQLiteStorageExecutor::Reset();
1585 }
1586 
GetSyncDataItemPre(const DataItem & itemPut,DataItem & itemGet,Key & hashKey) const1587 int SQLiteSingleVerStorageExecutor::GetSyncDataItemPre(const DataItem &itemPut, DataItem &itemGet,
1588     Key &hashKey) const
1589 {
1590     if (isSyncMigrating_) {
1591         hashKey = itemPut.hashKey;
1592     } else if ((itemPut.flag & DataItem::DELETE_FLAG) == DataItem::DELETE_FLAG ||
1593         ((itemPut.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) == DataItem::REMOTE_DEVICE_DATA_MISS_QUERY)) {
1594         hashKey = itemPut.key;
1595     } else {
1596         int errCode = DBCommon::CalcValueHash(itemPut.key, hashKey);
1597         if (errCode != E_OK) {
1598             return errCode;
1599         }
1600     }
1601 
1602     return GetSyncDataPreByHashKey(hashKey, itemGet);
1603 }
1604 
GetSyncDataPreByHashKey(const Key & hashKey,DataItem & itemGet) const1605 int SQLiteSingleVerStorageExecutor::GetSyncDataPreByHashKey(const Key &hashKey, DataItem &itemGet) const
1606 {
1607     auto statement = isSyncMigrating_ ? migrateSyncStatements_.queryStatement : saveSyncStatements_.queryStatement;
1608     int errCode = SQLiteUtils::BindBlobToStatement(statement, 1, hashKey, false); // 1st arg.
1609     if (errCode != E_OK) {
1610         return errCode;
1611     }
1612 
1613     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1614     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { // no find the key
1615         errCode = -E_NOT_FOUND;
1616     } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1617         itemGet.timestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, SYNC_RES_TIME_INDEX));
1618         itemGet.writeTimestamp = static_cast<Timestamp>(sqlite3_column_int64(statement, SYNC_RES_W_TIME_INDEX));
1619         itemGet.flag = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_FLAG_INDEX));
1620         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_KEY_INDEX, itemGet.key);
1621         if (errCode != E_OK) {
1622             return errCode;
1623         }
1624         std::vector<uint8_t> devVect;
1625         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_DEVICE_INDEX, devVect);
1626         if (errCode != E_OK) {
1627             return errCode;
1628         }
1629 
1630         std::vector<uint8_t> origDevVect;
1631         errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_ORI_DEV_INDEX, origDevVect);
1632         if (errCode != E_OK) {
1633             return errCode;
1634         }
1635         itemGet.dev.assign(devVect.begin(), devVect.end());
1636         itemGet.origDev.assign(origDevVect.begin(), origDevVect.end());
1637     }
1638     return errCode;
1639 }
1640 
DeleteLocalDataInner(SingleVerNaturalStoreCommitNotifyData * committedData,const Key & key,const Value & value)1641 int SQLiteSingleVerStorageExecutor::DeleteLocalDataInner(SingleVerNaturalStoreCommitNotifyData *committedData,
1642     const Key &key, const Value &value)
1643 {
1644     if (committedData != nullptr) {
1645         Key hashKey;
1646         int innerErrCode = DBCommon::CalcValueHash(key, hashKey);
1647         if (innerErrCode != E_OK) {
1648             return innerErrCode;
1649         }
1650         committedData->InitKeyPropRecord(hashKey, ExistStatus::EXIST);
1651     }
1652 
1653     std::string sql = DELETE_LOCAL_SQL;
1654     if (executorState_ == ExecutorState::CACHE_ATTACH_MAIN)  {
1655         sql = DELETE_LOCAL_SQL_FROM_CACHEHANDLE;
1656     }
1657     sqlite3_stmt *statement = nullptr;
1658     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
1659     if (errCode != E_OK) {
1660         goto ERROR;
1661     }
1662 
1663     errCode = SQLiteUtils::BindBlobToStatement(statement, 1, key, false);
1664     if (errCode != E_OK) {
1665         LOGE("Bind the key error(%d) when delete kv data.", errCode);
1666         goto ERROR;
1667     }
1668 
1669     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1670     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1671         if (sqlite3_changes(dbHandle_) > 0) {
1672             if (committedData != nullptr) {
1673                 Entry entry = {key, value};
1674                 committedData->InsertCommittedData(std::move(entry), DataType::DELETE, true);
1675             } else {
1676                 LOGE("DeleteLocalKvData failed to do commit notify because of OOM.");
1677             }
1678             errCode = E_OK;
1679         }
1680     }
1681 
1682 ERROR:
1683     SQLiteUtils::ResetStatement(statement, true, errCode);
1684     return CheckCorruptedStatus(errCode);
1685 }
1686 
DeleteLocalKvData(const Key & key,SingleVerNaturalStoreCommitNotifyData * committedData,Value & value,Timestamp & timestamp)1687 int SQLiteSingleVerStorageExecutor::DeleteLocalKvData(const Key &key,
1688     SingleVerNaturalStoreCommitNotifyData *committedData, Value &value, Timestamp &timestamp)
1689 {
1690     int errCode = GetKvData(SingleVerDataType::LOCAL_TYPE, key, value, timestamp);
1691     if (errCode != E_OK) {
1692         return CheckCorruptedStatus(errCode);
1693     }
1694 
1695     return DeleteLocalDataInner(committedData, key, value);
1696 }
1697 
EraseSyncData(const Key & hashKey)1698 int SQLiteSingleVerStorageExecutor::EraseSyncData(const Key &hashKey)
1699 {
1700     sqlite3_stmt *stmt = nullptr;
1701     std::string sql = (executorState_ == ExecutorState::CACHE_ATTACH_MAIN) ?
1702         DELETE_SYNC_DATA_WITH_HASHKEY_FROM_CACHEHANDLE : DELETE_SYNC_DATA_WITH_HASHKEY;
1703     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, stmt);
1704     if (errCode != E_OK) {
1705         LOGE("get erase statement failed:%d", errCode);
1706         return errCode;
1707     }
1708 
1709     errCode = SQLiteUtils::BindBlobToStatement(stmt, 1, hashKey, false);
1710     if (errCode != E_OK) {
1711         LOGE("bind hashKey failed:%d", errCode);
1712         goto END;
1713     }
1714 
1715     errCode = SQLiteUtils::StepWithRetry(stmt, false);
1716     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1717         errCode = E_OK;
1718     } else {
1719         LOGE("erase data failed:%d", errCode);
1720     }
1721 END:
1722     SQLiteUtils::ResetStatement(stmt, true, errCode);
1723     return CheckCorruptedStatus(errCode);
1724 }
1725 
RemoveDeviceData(const std::string & deviceName)1726 int SQLiteSingleVerStorageExecutor::RemoveDeviceData(const std::string &deviceName)
1727 {
1728     int errCode = E_OK;
1729     sqlite3_stmt *statement = nullptr;
1730     if (deviceName.empty()) {
1731         errCode = SQLiteUtils::GetStatement(dbHandle_, REMOVE_ALL_DEV_DATA_SQL, statement);
1732         if (errCode != E_OK) {
1733             goto ERROR;
1734         }
1735     } else {
1736         // device name always hash string.
1737         std::vector<uint8_t> devVect(deviceName.begin(), deviceName.end());
1738         errCode = SQLiteUtils::GetStatement(dbHandle_, REMOVE_DEV_DATA_SQL, statement);
1739         if (errCode != E_OK) {
1740             goto ERROR;
1741         }
1742 
1743         errCode = SQLiteUtils::BindBlobToStatement(statement, 1, devVect, true); // only one arg.
1744         if (errCode != E_OK) {
1745             LOGE("Failed to bind the removed device:%d", errCode);
1746             goto ERROR;
1747         }
1748     }
1749 
1750     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1751     if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1752         LOGE("Failed to execute rm the device synced data:%d", errCode);
1753     } else {
1754         errCode = E_OK;
1755     }
1756 
1757 ERROR:
1758     SQLiteUtils::ResetStatement(statement, true, errCode);
1759     return CheckCorruptedStatus(errCode);
1760 }
1761 
StepForResultEntries(bool isGetValue,sqlite3_stmt * statement,std::vector<Entry> & entries) const1762 int SQLiteSingleVerStorageExecutor::StepForResultEntries(bool isGetValue, sqlite3_stmt *statement,
1763     std::vector<Entry> &entries) const
1764 {
1765     entries.clear();
1766     entries.shrink_to_fit();
1767     int errCode = E_OK;
1768     do {
1769         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
1770         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1771             errCode = GetEntryFromStatement(isGetValue, statement, entries);
1772             if (errCode != E_OK) {
1773                 return errCode;
1774             }
1775         } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1776             errCode = E_OK;
1777             break;
1778         } else {
1779             LOGE("SQLite step failed:%d", errCode);
1780             return errCode;
1781         }
1782     } while (true);
1783 
1784     // if select no result, return the -E_NOT_FOUND.
1785     if (entries.empty()) {
1786         errCode = -E_NOT_FOUND;
1787     }
1788 
1789     return errCode;
1790 }
1791 
BindDevForSavedSyncData(sqlite3_stmt * statement,const DataItem & dataItem,const std::string & origDev,const std::string & deviceName)1792 int SQLiteSingleVerStorageExecutor::BindDevForSavedSyncData(sqlite3_stmt *statement, const DataItem &dataItem,
1793     const std::string &origDev, const std::string &deviceName)
1794 {
1795     int errCode = SQLiteUtils::BindInt64ToStatement(statement, BIND_SYNC_FLAG_INDEX,
1796         static_cast<int64_t>(dataItem.flag));
1797     if (errCode != E_OK) {
1798         LOGE("Bind saved sync data flag failed:%d", errCode);
1799         return errCode;
1800     }
1801 
1802     std::vector<uint8_t> devVect(deviceName.begin(), deviceName.end());
1803     errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_SYNC_DEV_INDEX, devVect, true);
1804     if (errCode != E_OK) {
1805         LOGE("Bind dev for sync data failed:%d", errCode);
1806         return errCode;
1807     }
1808 
1809     std::vector<uint8_t> origDevVect(origDev.begin(), origDev.end());
1810     errCode = SQLiteUtils::BindBlobToStatement(statement, BIND_SYNC_ORI_DEV_INDEX, origDevVect, true);
1811     if (errCode != E_OK) {
1812         LOGE("Bind orig dev for sync data failed:%d", errCode);
1813     }
1814 
1815     return errCode;
1816 }
1817 
GetDataItemSerialSize(const DataItem & item,size_t appendLen)1818 size_t SQLiteSingleVerStorageExecutor::GetDataItemSerialSize(const DataItem &item, size_t appendLen)
1819 {
1820     // timestamp and local flag: 3 * uint64_t, version(uint32_t), key, value, origin dev and the padding size.
1821     // the size would not be very large.
1822     static const size_t maxOrigDevLength = 40;
1823     size_t devLength = std::max(maxOrigDevLength, item.origDev.size());
1824     size_t dataSize = (Parcel::GetUInt64Len() * 3 + Parcel::GetUInt32Len() + Parcel::GetVectorCharLen(item.key) +
1825         Parcel::GetVectorCharLen(item.value) + devLength + appendLen);
1826     return dataSize;
1827 }
1828 
InitResultSet(const Key & keyPrefix,sqlite3_stmt * & countStmt)1829 int SQLiteSingleVerStorageExecutor::InitResultSet(const Key &keyPrefix, sqlite3_stmt *&countStmt)
1830 {
1831     if (dbHandle_ == nullptr) {
1832         return -E_INVALID_DB;
1833     }
1834     // bind statement for count
1835     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_COUNT_SYNC_PREFIX_SQL, countStmt);
1836     if (errCode != E_OK) {
1837         LOGE("Get count statement for resultset error:%d", errCode);
1838         return errCode;
1839     }
1840 
1841     errCode = SQLiteUtils::BindPrefixKey(countStmt, 1, keyPrefix); // first argument is key
1842     if (errCode != E_OK) {
1843         LOGE("Bind count key error:%d", errCode);
1844         goto ERROR;
1845     }
1846     // bind statement for result set
1847     errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_ROWID_PREFIX_SQL, getResultRowIdStatement_);
1848     if (errCode != E_OK) {
1849         LOGE("Get result set rowid statement error:%d", errCode);
1850         goto ERROR;
1851     }
1852 
1853     errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_DATA_BY_ROWID_SQL, getResultEntryStatement_);
1854     if (errCode != E_OK) {
1855         LOGE("Get result set entry statement error:%d", errCode);
1856         goto ERROR;
1857     }
1858 
1859     errCode = SQLiteUtils::BindPrefixKey(getResultRowIdStatement_, 1, keyPrefix); // first argument is key
1860     if (errCode != E_OK) {
1861         LOGE("Bind result set rowid statement error:%d", errCode);
1862         goto ERROR;
1863     }
1864     return E_OK;
1865 
1866 ERROR:
1867     SQLiteUtils::ResetStatement(countStmt, true, errCode);
1868     SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
1869     SQLiteUtils::ResetStatement(getResultEntryStatement_, true, errCode);
1870     return CheckCorruptedStatus(errCode);
1871 }
1872 
InitResultSetCount(QueryObject & queryObj,sqlite3_stmt * & countStmt)1873 int SQLiteSingleVerStorageExecutor::InitResultSetCount(QueryObject &queryObj, sqlite3_stmt *&countStmt)
1874 {
1875     if (dbHandle_ == nullptr) {
1876         return -E_INVALID_DB;
1877     }
1878 
1879     int errCode = E_OK;
1880     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
1881     if (errCode != E_OK) {
1882         return errCode;
1883     }
1884 
1885     errCode = helper.GetCountSqlStatement(dbHandle_, countStmt);
1886     if (errCode != E_OK) {
1887         LOGE("Get count bind statement error:%d", errCode);
1888         SQLiteUtils::ResetStatement(countStmt, true, errCode);
1889     }
1890     return errCode;
1891 }
1892 
InitResultSetContent(QueryObject & queryObj)1893 int SQLiteSingleVerStorageExecutor::InitResultSetContent(QueryObject &queryObj)
1894 {
1895     int errCode = E_OK;
1896     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
1897     if (errCode != E_OK) {
1898         return errCode;
1899     }
1900 
1901     // bind statement for result set
1902     errCode = helper.GetQuerySqlStatement(dbHandle_, true, getResultRowIdStatement_);
1903     if (errCode != E_OK) {
1904         LOGE("[SqlSinExe][InitResSetContent] Bind result set rowid statement of query error:%d", errCode);
1905         SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
1906         return errCode;
1907     }
1908     errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_DATA_BY_ROWID_SQL, getResultEntryStatement_);
1909     if (errCode != E_OK) {
1910         LOGE("[SqlSinExe][InitResSetContent] Get result set entry statement of query error:%d", errCode);
1911         return CheckCorruptedStatus(errCode);
1912     }
1913     return errCode;
1914 }
1915 
InitResultSet(QueryObject & queryObj,sqlite3_stmt * & countStmt)1916 int SQLiteSingleVerStorageExecutor::InitResultSet(QueryObject &queryObj, sqlite3_stmt *&countStmt)
1917 {
1918     if (dbHandle_ == nullptr) {
1919         return -E_INVALID_DB;
1920     }
1921 
1922     int errCode = E_OK;
1923     SqliteQueryHelper helper = queryObj.GetQueryHelper(errCode);
1924     if (errCode != E_OK) {
1925         return errCode;
1926     }
1927 
1928     if (!queryObj.IsValid()) {
1929         return -E_INVALID_QUERY_FORMAT;
1930     }
1931 
1932     errCode = InitResultSetCount(queryObj, countStmt);
1933     if (errCode != E_OK) {
1934         return CheckCorruptedStatus(errCode);
1935     }
1936 
1937     errCode = InitResultSetContent(queryObj);
1938     if (errCode != E_OK) {
1939         SQLiteUtils::ResetStatement(countStmt, true, errCode);
1940     }
1941     return CheckCorruptedStatus(errCode);
1942 }
1943 
UpdateLocalDataTimestamp(Timestamp timestamp)1944 int SQLiteSingleVerStorageExecutor::UpdateLocalDataTimestamp(Timestamp timestamp)
1945 {
1946     const std::string updateSql = "UPDATE local_data SET timestamp=";
1947     std::string sql = updateSql + std::to_string(timestamp) + " WHERE timestamp=0;";
1948     int errCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, sql);
1949     return CheckCorruptedStatus(errCode);
1950 }
1951 
SetAttachMetaMode(bool attachMetaMode)1952 void SQLiteSingleVerStorageExecutor::SetAttachMetaMode(bool attachMetaMode)
1953 {
1954     attachMetaMode_ = attachMetaMode;
1955 }
1956 
GetOneRawDataItem(sqlite3_stmt * statement,DataItem & dataItem,uint64_t & verInCurCacheDb,bool isCacheDb) const1957 int SQLiteSingleVerStorageExecutor::GetOneRawDataItem(sqlite3_stmt *statement, DataItem &dataItem,
1958     uint64_t &verInCurCacheDb, bool isCacheDb) const
1959 {
1960     int errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_KEY_INDEX, dataItem.key);
1961     if (errCode != E_OK) {
1962         return errCode;
1963     }
1964 
1965     errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_VAL_INDEX, dataItem.value);
1966     if (errCode != E_OK) {
1967         return errCode;
1968     }
1969 
1970     dataItem.timestamp = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_TIME_INDEX));
1971     dataItem.flag = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_FLAG_INDEX));
1972 
1973     std::vector<uint8_t> devVect;
1974     errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_DEVICE_INDEX, devVect);
1975     if (errCode != E_OK) {
1976         return errCode;
1977     }
1978     dataItem.dev  = std::string(devVect.begin(), devVect.end());
1979 
1980     devVect.clear();
1981     errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_ORI_DEV_INDEX, devVect);
1982     if (errCode != E_OK) {
1983         return errCode;
1984     }
1985     dataItem.origDev = std::string(devVect.begin(), devVect.end());
1986 
1987     errCode = SQLiteUtils::GetColumnBlobValue(statement, SYNC_RES_HASH_KEY_INDEX, dataItem.hashKey);
1988     if (errCode != E_OK) {
1989         return errCode;
1990     }
1991     dataItem.writeTimestamp = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_W_TIME_INDEX));
1992     if (errCode != E_OK) {
1993         return errCode;
1994     }
1995     if (isCacheDb) {
1996         verInCurCacheDb = static_cast<uint64_t>(sqlite3_column_int64(statement, SYNC_RES_VERSION_INDEX));
1997     }
1998     return E_OK;
1999 }
2000 
GetAllDataItems(sqlite3_stmt * statement,std::vector<DataItem> & dataItems,uint64_t & verInCurCacheDb,bool isCacheDb) const2001 int SQLiteSingleVerStorageExecutor::GetAllDataItems(sqlite3_stmt *statement, std::vector<DataItem> &dataItems,
2002     uint64_t &verInCurCacheDb, bool isCacheDb) const
2003 {
2004     dataItems.clear();
2005     dataItems.shrink_to_fit();
2006     DataItem dataItem;
2007     int errCode;
2008     do {
2009         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
2010         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
2011             errCode = GetOneRawDataItem(statement, dataItem, verInCurCacheDb, isCacheDb);
2012             if (errCode != E_OK) {
2013                 return errCode;
2014             }
2015             dataItems.push_back(std::move(dataItem));
2016         } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
2017             errCode = E_OK;
2018             break;
2019         } else {
2020             LOGE("SQLite step failed:%d", errCode);
2021             break;
2022         }
2023     } while (true);
2024 
2025     return CheckCorruptedStatus(errCode);
2026 }
2027 
OpenResultSetForCacheRowIdModeCommon(std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,int & count)2028 int SQLiteSingleVerStorageExecutor::OpenResultSetForCacheRowIdModeCommon(std::vector<int64_t> &rowIdCache,
2029     uint32_t cacheLimit, int &count)
2030 {
2031     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_SYNC_DATA_BY_ROWID_SQL, getResultEntryStatement_);
2032     if (errCode != E_OK) {
2033         LOGE("[SqlSinExe][OpenResSetRowId][Common] Get entry stmt fail, errCode=%d", errCode);
2034         return CheckCorruptedStatus(errCode);
2035     }
2036     errCode = StartTransaction(TransactType::DEFERRED);
2037     if (errCode != E_OK) {
2038         SQLiteUtils::ResetStatement(getResultEntryStatement_, true, errCode);
2039         return CheckCorruptedStatus(errCode);
2040     }
2041     // Now Ready To Execute
2042     errCode = ResultSetLoadRowIdCache(rowIdCache, cacheLimit, 0, count);
2043     if (errCode != E_OK) {
2044         SQLiteUtils::ResetStatement(getResultEntryStatement_, true, errCode);
2045         Rollback();
2046         return CheckCorruptedStatus(errCode);
2047     }
2048     // Consider finalize getResultRowIdStatement_ here if count equal to size of rowIdCache.
2049     return E_OK;
2050 }
2051 
ResultSetLoadRowIdCache(std::vector<int64_t> & rowIdCache,uint32_t cacheLimit,uint32_t cacheStartPos,int & count)2052 int SQLiteSingleVerStorageExecutor::ResultSetLoadRowIdCache(std::vector<int64_t> &rowIdCache, uint32_t cacheLimit,
2053     uint32_t cacheStartPos, int &count)
2054 {
2055     rowIdCache.clear();
2056     count = 0;
2057     while (true) {
2058         int errCode = SQLiteUtils::StepWithRetry(getResultRowIdStatement_, isMemDb_);
2059         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
2060             if (count >= static_cast<int>(cacheStartPos) && rowIdCache.size() < cacheLimit) {
2061                 // If we can start cache, and, if we can still cache
2062                 int64_t rowid = sqlite3_column_int64(getResultRowIdStatement_, 0);
2063                 rowIdCache.push_back(rowid);
2064             }
2065             // Always increase the count
2066             count++;
2067         } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
2068             break;
2069         } else {
2070             LOGE("[SqlSinExe][ResSetLoadCache] Step fail, errCode=%d", errCode);
2071             rowIdCache.clear();
2072             count = 0;
2073             return CheckCorruptedStatus(errCode);
2074         }
2075     }
2076     return E_OK;
2077 }
2078 
ResetStatement()2079 int SQLiteSingleVerStorageExecutor::SaveRecordStatements::ResetStatement()
2080 {
2081     int errCode = E_OK;
2082     SQLiteUtils::ResetStatement(insertStatement, true, errCode);
2083     if (errCode != E_OK) {
2084         LOGE("Finalize insert statements failed, error: %d", errCode);
2085     }
2086 
2087     SQLiteUtils::ResetStatement(updateStatement, true, errCode);
2088     if (errCode != E_OK) {
2089         LOGE("Finalize update statements failed, error: %d", errCode);
2090     }
2091 
2092     SQLiteUtils::ResetStatement(queryStatement, true, errCode);
2093     if (errCode != E_OK) {
2094         LOGE("Finalize query statement failed, error: %d", errCode);
2095     }
2096     return errCode;
2097 }
2098 
FinalizeAllStatements()2099 void SQLiteSingleVerStorageExecutor::FinalizeAllStatements()
2100 {
2101     int errCode = saveLocalStatements_.ResetStatement();
2102     if (errCode != E_OK) {
2103         LOGE("Finalize saveLocal statements failed, error: %d", errCode);
2104     }
2105 
2106     errCode = saveSyncStatements_.ResetStatement();
2107     if (errCode != E_OK) {
2108         LOGE("Finalize saveSync statement failed, error: %d", errCode);
2109     }
2110 
2111     SQLiteUtils::ResetStatement(getResultRowIdStatement_, true, errCode);
2112     if (errCode != E_OK) {
2113         LOGE("Finalize getResultRowIdStatement_ failed, error: %d", errCode);
2114     }
2115 
2116     SQLiteUtils::ResetStatement(getResultEntryStatement_, true, errCode);
2117     if (errCode != E_OK) {
2118         LOGE("Finalize getResultEntryStatement_ failed, error: %d", errCode);
2119     }
2120 
2121     errCode = migrateSyncStatements_.ResetStatement();
2122     if (errCode != E_OK) {
2123         LOGE("Finalize migrateSync statements failed, error: %d", errCode);
2124     }
2125 
2126     ReleaseContinueStatement();
2127 }
2128 
SetConflictResolvePolicy(int policy)2129 void SQLiteSingleVerStorageExecutor::SetConflictResolvePolicy(int policy)
2130 {
2131     if (policy == DENY_OTHER_DEV_AMEND_CUR_DEV_DATA || policy == DEFAULT_LAST_WIN) {
2132         conflictResolvePolicy_ = policy;
2133     }
2134 }
2135 
CheckIntegrity() const2136 int SQLiteSingleVerStorageExecutor::CheckIntegrity() const
2137 {
2138     if (dbHandle_ == nullptr) {
2139         return -E_INVALID_DB;
2140     }
2141 
2142     return SQLiteUtils::CheckIntegrity(dbHandle_, CHECK_DB_INTEGRITY_SQL);
2143 }
2144 
ForceCheckPoint() const2145 int SQLiteSingleVerStorageExecutor::ForceCheckPoint() const
2146 {
2147     if (dbHandle_ == nullptr) {
2148         return -E_INVALID_DB;
2149     }
2150     SQLiteUtils::ExecuteCheckPoint(dbHandle_);
2151     return E_OK;
2152 }
2153 
GetLogFileSize() const2154 uint64_t SQLiteSingleVerStorageExecutor::GetLogFileSize() const
2155 {
2156     if (isMemDb_) {
2157         return 0;
2158     }
2159 
2160     const char *fileName = sqlite3_db_filename(dbHandle_, "main");
2161     if (fileName == nullptr) {
2162         return 0;
2163     }
2164     std::string walName = std::string(fileName) + "-wal";
2165     uint64_t fileSize = 0;
2166     int result = OS::CalFileSize(std::string(walName), fileSize);
2167     if (result != E_OK) {
2168         return 0;
2169     }
2170     return fileSize;
2171 }
2172 
GetExistsDevicesFromMeta(std::set<std::string> & devices)2173 int SQLiteSingleVerStorageExecutor::GetExistsDevicesFromMeta(std::set<std::string> &devices)
2174 {
2175     return SqliteMetaExecutor::GetExistsDevicesFromMeta(dbHandle_,
2176         attachMetaMode_ ? SqliteMetaExecutor::MetaMode::KV_ATTACH : SqliteMetaExecutor::MetaMode::KV,
2177         isMemDb_, devices);
2178 }
2179 
UpdateKey(const UpdateKeyCallback & callback)2180 int SQLiteSingleVerStorageExecutor::UpdateKey(const UpdateKeyCallback &callback)
2181 {
2182     if (dbHandle_ == nullptr) {
2183         return -E_INVALID_DB;
2184     }
2185     UpdateContext context;
2186     context.callback = callback;
2187     int errCode = CreateFuncUpdateKey(context, &Translate, &CalHashKey);
2188     if (errCode != E_OK) {
2189         return errCode;
2190     }
2191     int executeErrCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, UPDATE_SYNC_DATA_KEY_SQL);
2192     context.callback = nullptr;
2193     errCode = CreateFuncUpdateKey(context, nullptr, nullptr);
2194     if (context.errCode != E_OK) {
2195         return context.errCode;
2196     }
2197     if (executeErrCode != E_OK) {
2198         return executeErrCode;
2199     }
2200     if (errCode != E_OK) {
2201         return errCode;
2202     }
2203     return E_OK;
2204 }
2205 
CreateFuncUpdateKey(UpdateContext & context,void (* translateFunc)(sqlite3_context * ctx,int argc,sqlite3_value ** argv),void (* calHashFunc)(sqlite3_context * ctx,int argc,sqlite3_value ** argv)) const2206 int SQLiteSingleVerStorageExecutor::CreateFuncUpdateKey(UpdateContext &context,
2207     void(*translateFunc)(sqlite3_context *ctx, int argc, sqlite3_value **argv),
2208     void(*calHashFunc)(sqlite3_context *ctx, int argc, sqlite3_value **argv)) const
2209 {
2210     int errCode = sqlite3_create_function_v2(dbHandle_, FUNC_NAME_TRANSLATE_KEY, 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC,
2211         &context, translateFunc, nullptr, nullptr, nullptr);
2212     if (errCode != SQLITE_OK) {
2213         LOGE("[SqlSinExe][UpdateKey] Create func=translate_key failed=%d", errCode);
2214         return SQLiteUtils::MapSQLiteErrno(errCode);
2215     }
2216     errCode = sqlite3_create_function_v2(dbHandle_, FUNC_NAME_CAL_HASH_KEY, 1, SQLITE_UTF8 | SQLITE_DETERMINISTIC,
2217         &context, calHashFunc, nullptr, nullptr, nullptr);
2218     if (errCode != SQLITE_OK) {
2219         LOGE("[SqlSinExe][UpdateKey] Create func=translate_key failed=%d", errCode);
2220         return SQLiteUtils::MapSQLiteErrno(errCode);
2221     }
2222     return E_OK;
2223 }
2224 
Translate(sqlite3_context * ctx,int argc,sqlite3_value ** argv)2225 void SQLiteSingleVerStorageExecutor::Translate(sqlite3_context *ctx, int argc, sqlite3_value **argv)
2226 {
2227     if (ctx == nullptr || argc != 1 || argv == nullptr) { // i parameters, which are key
2228         LOGW("[SqlSinExe][Translate] invalid param=%d", argc);
2229         return;
2230     }
2231     auto context = static_cast<UpdateContext *>(sqlite3_user_data(ctx));
2232     auto keyBlob = static_cast<const uint8_t *>(sqlite3_value_blob(argv[0]));
2233     int keyBlobLen = sqlite3_value_bytes(argv[0]);
2234     Key oldKey;
2235     if (keyBlob != nullptr && keyBlobLen > 0) {
2236         oldKey = Key(keyBlob, keyBlob + keyBlobLen);
2237     }
2238     Key newKey;
2239     context->callback(oldKey, newKey);
2240     if (newKey.size() >= DBConstant::MAX_KEY_SIZE || newKey.empty()) {
2241         LOGE("[SqlSinExe][Translate] invalid key len=%zu", newKey.size());
2242         context->errCode = -E_INVALID_ARGS;
2243         sqlite3_result_error(ctx, "Update key is invalid", -1);
2244         return;
2245     }
2246     context->newKey = newKey;
2247     sqlite3_result_blob(ctx, newKey.data(), static_cast<int>(newKey.size()), SQLITE_TRANSIENT);
2248 }
2249 
CalHashKey(sqlite3_context * ctx,int argc,sqlite3_value ** argv)2250 void SQLiteSingleVerStorageExecutor::CalHashKey(sqlite3_context *ctx, int argc, sqlite3_value **argv)
2251 {
2252     if (ctx == nullptr || argc != 1 || argv == nullptr) {
2253         LOGW("[SqlSinExe][Translate] invalid param=%d", argc);
2254         return;
2255     }
2256     auto context = static_cast<UpdateContext *>(sqlite3_user_data(ctx));
2257     Key hashKey;
2258     DBCommon::CalcValueHash(context->newKey, hashKey);
2259     sqlite3_result_blob(ctx, hashKey.data(), static_cast<int>(hashKey.size()), SQLITE_TRANSIENT);
2260 }
2261 } // namespace DistributedDB
2262