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