• 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 #ifdef RELATIONAL_STORE
16 #include "sqlite_single_ver_relational_storage_executor.h"
17 
18 #include <algorithm>
19 #include <optional>
20 
21 #include "data_transformer.h"
22 #include "db_common.h"
23 #include "log_table_manager_factory.h"
24 #include "relational_row_data_impl.h"
25 #include "res_finalizer.h"
26 #include "sqlite_meta_executor.h"
27 #include "sqlite_relational_utils.h"
28 
29 namespace DistributedDB {
30 namespace {
PermitSelect(void * a,int b,const char * c,const char * d,const char * e,const char * f)31 int PermitSelect(void *a, int b, const char *c, const char *d, const char *e, const char *f)
32 {
33     if (b != SQLITE_SELECT && b != SQLITE_READ && b != SQLITE_FUNCTION) {
34         return SQLITE_DENY;
35     }
36     return SQLITE_OK;
37 }
38 }
SQLiteSingleVerRelationalStorageExecutor(sqlite3 * dbHandle,bool writable,DistributedTableMode mode)39 SQLiteSingleVerRelationalStorageExecutor::SQLiteSingleVerRelationalStorageExecutor(sqlite3 *dbHandle, bool writable,
40     DistributedTableMode mode)
41     : SQLiteStorageExecutor(dbHandle, writable, false), mode_(mode)
42 {}
43 
44 
CheckTableConstraint(const TableInfo & table,DistributedTableMode mode)45 int CheckTableConstraint(const TableInfo &table, DistributedTableMode mode)
46 {
47     std::string trimedSql = DBCommon::TrimSpace(table.GetCreateTableSql());
48     if (DBCommon::HasConstraint(trimedSql, "WITHOUT ROWID", " ),", " ,;")) {
49         LOGE("[CreateDistributedTable] Not support create distributed table without rowid.");
50         return -E_NOT_SUPPORT;
51     }
52 
53     if (mode == DistributedTableMode::COLLABORATION) {
54         if (DBCommon::HasConstraint(trimedSql, "CHECK", " ,", " (")) {
55             LOGE("[CreateDistributedTable] Not support create distributed table with 'CHECK' constraint.");
56             return -E_NOT_SUPPORT;
57         }
58 
59         if (DBCommon::HasConstraint(trimedSql, "ON CONFLICT", " )", " ")) {
60             LOGE("[CreateDistributedTable] Not support create distributed table with 'ON CONFLICT' constraint.");
61             return -E_NOT_SUPPORT;
62         }
63 
64         if (DBCommon::HasConstraint(trimedSql, "REFERENCES", " )", " ")) {
65             LOGE("[CreateDistributedTable] Not support create distributed table with 'FOREIGN KEY' constraint.");
66             return -E_NOT_SUPPORT;
67         }
68     }
69 
70     if (mode == DistributedTableMode::SPLIT_BY_DEVICE) {
71         if (table.GetPrimaryKey().size() > 1) {
72             LOGE("[CreateDistributedTable] Not support create distributed table with composite primary keys.");
73             return -E_NOT_SUPPORT;
74         }
75     }
76 
77     return E_OK;
78 }
79 
80 namespace {
GetExistedDataTimeOffset(sqlite3 * db,const std::string & tableName,bool isMem,int64_t & timeOffset)81 int GetExistedDataTimeOffset(sqlite3 *db, const std::string &tableName, bool isMem, int64_t &timeOffset)
82 {
83     std::string sql = "SELECT get_sys_time(0) - max(rowid) - 1 FROM " + tableName;
84     sqlite3_stmt *stmt = nullptr;
85     int errCode = SQLiteUtils::GetStatement(db, sql, stmt);
86     if (errCode != E_OK) {
87         return errCode;
88     }
89     errCode = SQLiteUtils::StepWithRetry(stmt, isMem);
90     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
91         timeOffset = static_cast<int64_t>(sqlite3_column_int64(stmt, 0));
92         errCode = E_OK;
93     }
94     SQLiteUtils::ResetStatement(stmt, true, errCode);
95     return errCode;
96 }
97 }
98 
GeneLogInfoForExistedData(sqlite3 * db,const std::string & tableName,const TableInfo & table,const std::string & calPrimaryKeyHash)99 int SQLiteSingleVerRelationalStorageExecutor::GeneLogInfoForExistedData(sqlite3 *db, const std::string &tableName,
100     const TableInfo &table, const std::string &calPrimaryKeyHash)
101 {
102     int64_t timeOffset = 0;
103     int errCode = GetExistedDataTimeOffset(db, tableName, isMemDb_, timeOffset);
104     if (errCode != E_OK) {
105         return errCode;
106     }
107     std::string timeOffsetStr = std::to_string(timeOffset);
108     std::string logTable = DBConstant::RELATIONAL_PREFIX + tableName + "_log";
109     std::string sql = "INSERT INTO " + logTable +
110         " SELECT rowid, '', '', " + timeOffsetStr + " + rowid, " + timeOffsetStr + " + rowid, 0x2, " +
111         calPrimaryKeyHash + " FROM " + tableName + " WHERE 1=1;";
112     return SQLiteUtils::ExecuteRawSQL(db, sql);
113 }
114 
CreateDistributedTable(const std::string & tableName,DistributedTableMode mode,bool isUpgraded,const std::string & identity,TableInfo & table)115 int SQLiteSingleVerRelationalStorageExecutor::CreateDistributedTable(const std::string &tableName,
116     DistributedTableMode mode, bool isUpgraded, const std::string &identity, TableInfo &table)
117 {
118     if (dbHandle_ == nullptr) {
119         return -E_INVALID_DB;
120     }
121 
122     if (mode == DistributedTableMode::SPLIT_BY_DEVICE && !isUpgraded) {
123         bool isEmpty = false;
124         int errCode = SQLiteUtils::CheckTableEmpty(dbHandle_, tableName, isEmpty);
125         if (errCode != E_OK || !isEmpty) {
126             LOGE("[CreateDistributedTable] check table empty failed. error=%d, isEmpty=%d", errCode, isEmpty);
127             return -E_NOT_SUPPORT;
128         }
129     }
130 
131     int errCode = SQLiteUtils::AnalysisSchema(dbHandle_, tableName, table);
132     if (errCode != E_OK) {
133         LOGE("[CreateDistributedTable] analysis table schema failed. %d", errCode);
134         return errCode;
135     }
136 
137     errCode = CheckTableConstraint(table, mode);
138     if (errCode != E_OK) {
139         LOGE("[CreateDistributedTable] check table constraint failed.");
140         return errCode;
141     }
142 
143     // create log table
144     auto tableManager = LogTableManagerFactory::GetTableManager(mode);
145     errCode = tableManager->CreateRelationalLogTable(dbHandle_, table);
146     if (errCode != E_OK) {
147         LOGE("[CreateDistributedTable] create log table failed");
148         return errCode;
149     }
150 
151     if (!isUpgraded) {
152         std::string calPrimaryKeyHash = tableManager->CalcPrimaryKeyHash("", table, identity);
153         errCode = GeneLogInfoForExistedData(dbHandle_, tableName, table, calPrimaryKeyHash);
154         if (errCode != E_OK) {
155             return errCode;
156         }
157     }
158 
159     // add trigger
160     errCode = tableManager->AddRelationalLogTableTrigger(dbHandle_, table, identity);
161     if (errCode != E_OK) {
162         LOGE("[CreateDistributedTable] Add relational log table trigger failed.");
163         return errCode;
164     }
165     return SetLogTriggerStatus(true);
166 }
167 
UpgradeDistributedTable(const std::string & tableName,DistributedTableMode mode,bool & schemaChanged,RelationalSchemaObject & schema)168 int SQLiteSingleVerRelationalStorageExecutor::UpgradeDistributedTable(const std::string &tableName,
169     DistributedTableMode mode, bool &schemaChanged, RelationalSchemaObject &schema)
170 {
171     if (dbHandle_ == nullptr) {
172         return -E_INVALID_DB;
173     }
174     TableInfo newTableInfo;
175     int errCode = SQLiteUtils::AnalysisSchema(dbHandle_, tableName, newTableInfo);
176     if (errCode != E_OK) {
177         LOGE("[UpgradeDistributedTable] analysis table schema failed. %d", errCode);
178         return errCode;
179     }
180 
181     if (CheckTableConstraint(newTableInfo, mode)) {
182         LOGE("[UpgradeDistributedTable] Not support create distributed table without rowid.");
183         return -E_NOT_SUPPORT;
184     }
185 
186     // new table should has same or compatible upgrade
187     TableInfo tableInfo = schema.GetTable(tableName);
188     errCode = tableInfo.CompareWithTable(newTableInfo, schema.GetSchemaVersion());
189     if (errCode == -E_RELATIONAL_TABLE_INCOMPATIBLE) {
190         LOGE("[UpgradeDistributedTable] Not support with incompatible upgrade.");
191         return -E_SCHEMA_MISMATCH;
192     } else if (errCode == -E_RELATIONAL_TABLE_EQUAL) {
193         LOGD("[UpgradeDistributedTable] schema has not changed.");
194         return E_OK;
195     }
196 
197     schemaChanged = true;
198     errCode = AlterAuxTableForUpgrade(tableInfo, newTableInfo);
199     if (errCode != E_OK) {
200         LOGE("[UpgradeDistributedTable] Alter aux table for upgrade failed. %d", errCode);
201     }
202 
203     schema.AddRelationalTable(newTableInfo);
204     return errCode;
205 }
206 
207 namespace {
GetDeviceTableName(sqlite3 * handle,const std::string & tableName,const std::string & device,std::vector<std::string> & deviceTables)208 int GetDeviceTableName(sqlite3 *handle, const std::string &tableName, const std::string &device,
209     std::vector<std::string> &deviceTables)
210 {
211     if (device.empty() && tableName.empty()) { // device and table name should not both be empty
212         return -E_INVALID_ARGS;
213     }
214     std::string devicePattern = device.empty() ? "%" : device;
215     std::string tablePattern = tableName.empty() ? "%" : tableName;
216     std::string deviceTableName = DBConstant::RELATIONAL_PREFIX + tablePattern + "_" + devicePattern;
217 
218     const std::string checkSql = "SELECT name FROM sqlite_master WHERE type='table' AND name LIKE '" +
219         deviceTableName + "';";
220     sqlite3_stmt *stmt = nullptr;
221     int errCode = SQLiteUtils::GetStatement(handle, checkSql, stmt);
222     if (errCode != E_OK) {
223         SQLiteUtils::ResetStatement(stmt, true, errCode);
224         return errCode;
225     }
226 
227     do {
228         errCode = SQLiteUtils::StepWithRetry(stmt, false);
229         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
230             errCode = E_OK;
231             break;
232         } else if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
233             LOGE("Get table name failed. %d", errCode);
234             break;
235         }
236         std::string realTableName;
237         errCode = SQLiteUtils::GetColumnTextValue(stmt, 0, realTableName); // 0: table name result column index
238         if (errCode != E_OK || realTableName.empty()) { // sqlite might return a row with NULL
239             continue;
240         }
241         if (realTableName.rfind("_log") == (realTableName.length() - 4)) { // 4:suffix length of "_log"
242             continue;
243         }
244         deviceTables.emplace_back(realTableName);
245     } while (true);
246 
247     SQLiteUtils::ResetStatement(stmt, true, errCode);
248     return errCode;
249 }
250 
GetUpgradeFields(const TableInfo & oldTableInfo,const TableInfo & newTableInfo)251 std::vector<FieldInfo> GetUpgradeFields(const TableInfo &oldTableInfo, const TableInfo &newTableInfo)
252 {
253     std::vector<FieldInfo> fields;
254     auto itOld = oldTableInfo.GetFields().begin();
255     auto itNew = newTableInfo.GetFields().begin();
256     for (; itNew != newTableInfo.GetFields().end(); itNew++) {
257         if (itOld == oldTableInfo.GetFields().end() || itOld->first != itNew->first) {
258             fields.emplace_back(itNew->second);
259             continue;
260         }
261         itOld++;
262     }
263     return fields;
264 }
265 
UpgradeFields(sqlite3 * db,const std::vector<std::string> & tables,std::vector<FieldInfo> & fields)266 int UpgradeFields(sqlite3 *db, const std::vector<std::string> &tables, std::vector<FieldInfo> &fields)
267 {
268     if (db == nullptr) {
269         return -E_INVALID_ARGS;
270     }
271 
272     std::sort(fields.begin(), fields.end(), [] (const FieldInfo &a, const FieldInfo &b) {
273         return a.GetColumnId()< b.GetColumnId();
274     });
275     int errCode = E_OK;
276     for (const auto &table : tables) {
277         for (const auto &field : fields) {
278             std::string alterSql = "ALTER TABLE " + table + " ADD " + field.GetFieldName() + " " + field.GetDataType();
279             alterSql += field.IsNotNull() ? " NOT NULL" : "";
280             alterSql += field.HasDefaultValue() ? " DEFAULT " + field.GetDefaultValue() : "";
281             alterSql += ";";
282             errCode = SQLiteUtils::ExecuteRawSQL(db, alterSql);
283             if (errCode != E_OK) {
284                 LOGE("Alter table failed. %d", errCode);
285                 break;
286             }
287         }
288     }
289     return errCode;
290 }
291 
GetChangedIndexes(const TableInfo & oldTableInfo,const TableInfo & newTableInfo)292 std::map<std::string, CompositeFields> GetChangedIndexes(const TableInfo &oldTableInfo, const TableInfo &newTableInfo)
293 {
294     std::map<std::string, CompositeFields> indexes;
295     auto itOld = oldTableInfo.GetIndexDefine().begin();
296     auto itNew = newTableInfo.GetIndexDefine().begin();
297     auto itOldEnd = oldTableInfo.GetIndexDefine().end();
298     auto itNewEnd = newTableInfo.GetIndexDefine().end();
299 
300     while (itOld != itOldEnd && itNew != itNewEnd) {
301         if (itOld->first == itNew->first) {
302             if (itOld->second != itNew->second) {
303                 indexes.insert({itNew->first, itNew->second});
304             }
305             itOld++;
306             itNew++;
307         } else if (itOld->first < itNew->first) {
308             indexes.insert({itOld->first, {}});
309             itOld++;
310         } else if (itOld->first > itNew->first) {
311             indexes.insert({itNew->first, itNew->second});
312             itNew++;
313         }
314     }
315 
316     while (itOld != itOldEnd) {
317         indexes.insert({itOld->first, {}});
318         itOld++;
319     }
320 
321     while (itNew != itNewEnd) {
322         indexes.insert({itNew->first, itNew->second});
323         itNew++;
324     }
325 
326     return indexes;
327 }
328 
Upgradeindexes(sqlite3 * db,const std::vector<std::string> & tables,const std::map<std::string,CompositeFields> & indexes)329 int Upgradeindexes(sqlite3 *db, const std::vector<std::string> &tables,
330     const std::map<std::string, CompositeFields> &indexes)
331 {
332     if (db == nullptr) {
333         return -E_INVALID_ARGS;
334     }
335 
336     int errCode = E_OK;
337     for (const auto &table : tables) {
338         for (const auto &index : indexes) {
339             if (index.first.empty()) {
340                 continue;
341             }
342             std::string realIndexName = table + "_" + index.first;
343             std::string deleteIndexSql = "DROP INDEX IF EXISTS " + realIndexName;
344             errCode = SQLiteUtils::ExecuteRawSQL(db, deleteIndexSql);
345             if (errCode != E_OK) {
346                 LOGE("Drop index failed. %d", errCode);
347                 return errCode;
348             }
349 
350             if (index.second.empty()) { // empty means drop index only
351                 continue;
352             }
353 
354             auto it = index.second.begin();
355             std::string indexDefine = *it++;
356             while (it != index.second.end()) {
357                 indexDefine += ", " + *it++;
358             }
359             std::string createIndexSql = "CREATE INDEX IF NOT EXISTS " + realIndexName + " ON " + table +
360                 "(" + indexDefine + ");";
361             errCode = SQLiteUtils::ExecuteRawSQL(db, createIndexSql);
362             if (errCode != E_OK) {
363                 LOGE("Create index failed. %d", errCode);
364                 break;
365             }
366         }
367     }
368     return errCode;
369 }
370 }
371 
AlterAuxTableForUpgrade(const TableInfo & oldTableInfo,const TableInfo & newTableInfo)372 int SQLiteSingleVerRelationalStorageExecutor::AlterAuxTableForUpgrade(const TableInfo &oldTableInfo,
373     const TableInfo &newTableInfo)
374 {
375     std::vector<FieldInfo> upgradeFields = GetUpgradeFields(oldTableInfo, newTableInfo);
376     std::map<std::string, CompositeFields> upgradeIndexces = GetChangedIndexes(oldTableInfo, newTableInfo);
377     std::vector<std::string> deviceTables;
378     int errCode = GetDeviceTableName(dbHandle_, oldTableInfo.GetTableName(), {}, deviceTables);
379     if (errCode != E_OK) {
380         LOGE("Get device table name for alter table failed. %d", errCode);
381         return errCode;
382     }
383 
384     LOGD("Begin to alter table: upgrade fields[%zu], indexces[%zu], deviceTable[%zu]", upgradeFields.size(),
385         upgradeIndexces.size(), deviceTables.size());
386     errCode = UpgradeFields(dbHandle_, deviceTables, upgradeFields);
387     if (errCode != E_OK) {
388         LOGE("upgrade fields failed. %d", errCode);
389         return errCode;
390     }
391 
392     errCode = Upgradeindexes(dbHandle_, deviceTables, upgradeIndexces);
393     if (errCode != E_OK) {
394         LOGE("upgrade indexes failed. %d", errCode);
395     }
396 
397     return E_OK;
398 }
399 
StartTransaction(TransactType type)400 int SQLiteSingleVerRelationalStorageExecutor::StartTransaction(TransactType type)
401 {
402     if (dbHandle_ == nullptr) {
403         LOGE("Begin transaction failed, dbHandle is null.");
404         return -E_INVALID_DB;
405     }
406     int errCode = SQLiteUtils::BeginTransaction(dbHandle_, type);
407     if (errCode != E_OK) {
408         LOGE("Begin transaction failed, errCode = %d", errCode);
409     }
410     return errCode;
411 }
412 
Commit()413 int SQLiteSingleVerRelationalStorageExecutor::Commit()
414 {
415     if (dbHandle_ == nullptr) {
416         return -E_INVALID_DB;
417     }
418 
419     return SQLiteUtils::CommitTransaction(dbHandle_);
420 }
421 
Rollback()422 int SQLiteSingleVerRelationalStorageExecutor::Rollback()
423 {
424     if (dbHandle_ == nullptr) {
425         return -E_INVALID_DB;
426     }
427     int errCode = SQLiteUtils::RollbackTransaction(dbHandle_);
428     if (errCode != E_OK) {
429         LOGE("sqlite single ver storage executor rollback fail! errCode = [%d]", errCode);
430     }
431     return errCode;
432 }
433 
SetTableInfo(const TableInfo & tableInfo)434 void SQLiteSingleVerRelationalStorageExecutor::SetTableInfo(const TableInfo &tableInfo)
435 {
436     table_ = tableInfo;
437 }
438 
BindDataValueByType(sqlite3_stmt * statement,const std::optional<DataValue> & data,int cid)439 static int BindDataValueByType(sqlite3_stmt *statement, const std::optional<DataValue> &data, int cid)
440 {
441     int errCode = E_OK;
442     StorageType type = data.value().GetType();
443     switch (type) {
444         case StorageType::STORAGE_TYPE_INTEGER: {
445             int64_t intData = 0;
446             (void)data.value().GetInt64(intData);
447             errCode = SQLiteUtils::MapSQLiteErrno(sqlite3_bind_int64(statement, cid, intData));
448             break;
449         }
450 
451         case StorageType::STORAGE_TYPE_REAL: {
452             double doubleData = 0;
453             (void)data.value().GetDouble(doubleData);
454             errCode = SQLiteUtils::MapSQLiteErrno(sqlite3_bind_double(statement, cid, doubleData));
455             break;
456         }
457 
458         case StorageType::STORAGE_TYPE_TEXT: {
459             std::string strData;
460             (void)data.value().GetText(strData);
461             errCode = SQLiteUtils::BindTextToStatement(statement, cid, strData);
462             break;
463         }
464 
465         case StorageType::STORAGE_TYPE_BLOB: {
466             Blob blob;
467             (void)data.value().GetBlob(blob);
468             std::vector<uint8_t> blobData(blob.GetData(), blob.GetData() + blob.GetSize());
469             errCode = SQLiteUtils::BindBlobToStatement(statement, cid, blobData, true);
470             break;
471         }
472 
473         case StorageType::STORAGE_TYPE_NULL: {
474             errCode = SQLiteUtils::MapSQLiteErrno(sqlite3_bind_null(statement, cid));
475             break;
476         }
477 
478         default:
479             break;
480     }
481     return errCode;
482 }
483 
GetLogData(sqlite3_stmt * logStatement,LogInfo & logInfo)484 static int GetLogData(sqlite3_stmt *logStatement, LogInfo &logInfo)
485 {
486     logInfo.dataKey = sqlite3_column_int64(logStatement, 0);  // 0 means dataKey index
487 
488     std::vector<uint8_t> dev;
489     int errCode = SQLiteUtils::GetColumnBlobValue(logStatement, 1, dev);  // 1 means dev index
490     if (errCode != E_OK) {
491         return errCode;
492     }
493     logInfo.device = std::string(dev.begin(), dev.end());
494 
495     std::vector<uint8_t> oriDev;
496     errCode = SQLiteUtils::GetColumnBlobValue(logStatement, 2, oriDev);  // 2 means ori_dev index
497     if (errCode != E_OK) {
498         return errCode;
499     }
500     logInfo.originDev = std::string(oriDev.begin(), oriDev.end());
501     logInfo.timestamp = static_cast<uint64_t>(sqlite3_column_int64(logStatement, 3));  // 3 means timestamp index
502     logInfo.wTimestamp = static_cast<uint64_t>(sqlite3_column_int64(logStatement, 4));  // 4 means w_timestamp index
503     logInfo.flag = static_cast<uint64_t>(sqlite3_column_int64(logStatement, 5));  // 5 means flag index
504     logInfo.flag &= (~DataItem::LOCAL_FLAG);
505     logInfo.flag &= (~DataItem::UPDATE_FLAG);
506     return SQLiteUtils::GetColumnBlobValue(logStatement, 6, logInfo.hashKey);  // 6 means hashKey index
507 }
508 
GetDataItemSerialSize(DataItem & item,size_t appendLen)509 static size_t GetDataItemSerialSize(DataItem &item, size_t appendLen)
510 {
511     // timestamp and local flag: 3 * uint64_t, version(uint32_t), key, value, origin dev and the padding size.
512     // the size would not be very large.
513     static const size_t maxOrigDevLength = 40;
514     size_t devLength = std::max(maxOrigDevLength, item.origDev.size());
515     size_t dataSize = (Parcel::GetUInt64Len() * 3 + Parcel::GetUInt32Len() + Parcel::GetVectorCharLen(item.key) +
516         Parcel::GetVectorCharLen(item.value) + devLength + appendLen);
517     return dataSize;
518 }
519 
GetKvData(const Key & key,Value & value) const520 int SQLiteSingleVerRelationalStorageExecutor::GetKvData(const Key &key, Value &value) const
521 {
522     static const std::string SELECT_META_VALUE_SQL = "SELECT value FROM " + DBConstant::RELATIONAL_PREFIX +
523         "metadata WHERE key=?;";
524     sqlite3_stmt *statement = nullptr;
525     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_META_VALUE_SQL, statement);
526     if (errCode != E_OK) {
527         goto END;
528     }
529 
530     errCode = SQLiteUtils::BindBlobToStatement(statement, 1, key, false); // first arg.
531     if (errCode != E_OK) {
532         goto END;
533     }
534 
535     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
536     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
537         errCode = -E_NOT_FOUND;
538         goto END;
539     } else if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
540         goto END;
541     }
542 
543     errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, value); // only one result.
544     END:
545     SQLiteUtils::ResetStatement(statement, true, errCode);
546     return errCode;
547 }
548 
PutKvData(const Key & key,const Value & value) const549 int SQLiteSingleVerRelationalStorageExecutor::PutKvData(const Key &key, const Value &value) const
550 {
551     static const std::string INSERT_META_SQL = "INSERT OR REPLACE INTO " + DBConstant::RELATIONAL_PREFIX +
552         "metadata VALUES(?,?);";
553     sqlite3_stmt *statement = nullptr;
554     int errCode = SQLiteUtils::GetStatement(dbHandle_, INSERT_META_SQL, statement);
555     if (errCode != E_OK) {
556         goto ERROR;
557     }
558 
559     errCode = SQLiteUtils::BindBlobToStatement(statement, 1, key, false);  // 1 means key index
560     if (errCode != E_OK) {
561         LOGE("[SingleVerExe][BindPutKv]Bind key error:%d", errCode);
562         goto ERROR;
563     }
564 
565     errCode = SQLiteUtils::BindBlobToStatement(statement, 2, value, true);  // 2 means value index
566     if (errCode != E_OK) {
567         LOGE("[SingleVerExe][BindPutKv]Bind value error:%d", errCode);
568         goto ERROR;
569     }
570     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
571     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
572         errCode = E_OK;
573     }
574 ERROR:
575     SQLiteUtils::ResetStatement(statement, true, errCode);
576     return errCode;
577 }
578 
DeleteMetaData(const std::vector<Key> & keys) const579 int SQLiteSingleVerRelationalStorageExecutor::DeleteMetaData(const std::vector<Key> &keys) const
580 {
581     static const std::string REMOVE_META_VALUE_SQL = "DELETE FROM " + DBConstant::RELATIONAL_PREFIX +
582         "metadata WHERE key=?;";
583     sqlite3_stmt *statement = nullptr;
584     int errCode = SQLiteUtils::GetStatement(dbHandle_, REMOVE_META_VALUE_SQL, statement);
585     if (errCode != E_OK) {
586         return errCode;
587     }
588 
589     for (const auto &key : keys) {
590         errCode = SQLiteUtils::BindBlobToStatement(statement, 1, key, false); // first arg.
591         if (errCode != E_OK) {
592             break;
593         }
594 
595         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
596         if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
597             break;
598         }
599         errCode = E_OK;
600         SQLiteUtils::ResetStatement(statement, false, errCode);
601     }
602     SQLiteUtils::ResetStatement(statement, true, errCode);
603     return CheckCorruptedStatus(errCode);
604 }
605 
DeleteMetaDataByPrefixKey(const Key & keyPrefix) const606 int SQLiteSingleVerRelationalStorageExecutor::DeleteMetaDataByPrefixKey(const Key &keyPrefix) const
607 {
608     static const std::string REMOVE_META_VALUE_BY_KEY_PREFIX_SQL = "DELETE FROM " + DBConstant::RELATIONAL_PREFIX +
609         "metadata WHERE key>=? AND key<=?;";
610     sqlite3_stmt *statement = nullptr;
611     int errCode = SQLiteUtils::GetStatement(dbHandle_, REMOVE_META_VALUE_BY_KEY_PREFIX_SQL, statement);
612     if (errCode != E_OK) {
613         return errCode;
614     }
615 
616     errCode = SQLiteUtils::BindPrefixKey(statement, 1, keyPrefix); // 1 is first arg.
617     if (errCode == E_OK) {
618         errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
619         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
620             errCode = E_OK;
621         }
622     }
623     SQLiteUtils::ResetStatement(statement, true, errCode);
624     return CheckCorruptedStatus(errCode);
625 }
626 
GetAllMetaKeys(std::vector<Key> & keys) const627 int SQLiteSingleVerRelationalStorageExecutor::GetAllMetaKeys(std::vector<Key> &keys) const
628 {
629     static const std::string SELECT_ALL_META_KEYS = "SELECT key FROM " + DBConstant::RELATIONAL_PREFIX + "metadata;";
630     sqlite3_stmt *statement = nullptr;
631     int errCode = SQLiteUtils::GetStatement(dbHandle_, SELECT_ALL_META_KEYS, statement);
632     if (errCode != E_OK) {
633         LOGE("[Relational][GetAllKey] Get statement failed:%d", errCode);
634         return errCode;
635     }
636     errCode = SqliteMetaExecutor::GetAllKeys(statement, isMemDb_, keys);
637     SQLiteUtils::ResetStatement(statement, true, errCode);
638     return errCode;
639 }
640 
PrepareForSavingLog(const QueryObject & object,const std::string & deviceName,sqlite3_stmt * & logStmt,sqlite3_stmt * & queryStmt) const641 int SQLiteSingleVerRelationalStorageExecutor::PrepareForSavingLog(const QueryObject &object,
642     const std::string &deviceName, sqlite3_stmt *&logStmt, sqlite3_stmt *&queryStmt) const
643 {
644     std::string devName = DBCommon::TransferStringToHex(DBCommon::TransferHashString(deviceName));
645     const std::string tableName = DBConstant::RELATIONAL_PREFIX + object.GetTableName() + "_log";
646     std::string dataFormat = "?, '" + devName + "', ?, ?, ?, ?, ?";
647     std::string columnList = "data_key, device, ori_device, timestamp, wtimestamp, flag, hash_key";
648     std::string sql = "INSERT OR REPLACE INTO " + tableName +
649         " (" + columnList + ") VALUES (" + dataFormat + ");";
650     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, logStmt);
651     if (errCode != E_OK) {
652         LOGE("[info statement] Get log statement fail! errCode:%d", errCode);
653         return errCode;
654     }
655     std::string selectSql = "select " + columnList + " from " + tableName;
656     if (mode_ == DistributedTableMode::COLLABORATION) {
657         selectSql += " where hash_key = ?;";
658     } else {
659         selectSql += " where hash_key = ? and device = ?;";
660     }
661     errCode = SQLiteUtils::GetStatement(dbHandle_, selectSql, queryStmt);
662     if (errCode != E_OK) {
663         SQLiteUtils::ResetStatement(logStmt, true, errCode);
664         LOGE("[info statement] Get query statement fail! errCode:%d", errCode);
665     }
666     return errCode;
667 }
668 
PrepareForSavingData(const QueryObject & object,sqlite3_stmt * & statement) const669 int SQLiteSingleVerRelationalStorageExecutor::PrepareForSavingData(const QueryObject &object,
670     sqlite3_stmt *&statement) const
671 {
672     std::string colName;
673     std::string dataFormat;
674     for (size_t colId = 0; colId < table_.GetFields().size(); ++colId) {
675         colName += table_.GetFieldName(colId) + ",";
676         dataFormat += "?,";
677     }
678     colName.pop_back();
679     dataFormat.pop_back();
680 
681     const std::string sql = "INSERT OR REPLACE INTO " + table_.GetTableName() +
682         " (" + colName + ") VALUES (" + dataFormat + ");";
683     int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, statement);
684     if (errCode != E_OK) {
685         LOGE("[info statement] Get saving data statement fail! errCode:%d", errCode);
686     }
687     return errCode;
688 }
689 
SaveSyncLog(sqlite3_stmt * statement,sqlite3_stmt * queryStmt,const DataItem & dataItem,int64_t rowid)690 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncLog(sqlite3_stmt *statement, sqlite3_stmt *queryStmt,
691     const DataItem &dataItem, int64_t rowid)
692 {
693     int errCode = SQLiteUtils::BindBlobToStatement(queryStmt, 1, dataItem.hashKey);  // 1 means hashkey index.
694     if (errCode != E_OK) {
695         return errCode;
696     }
697     if (mode_ != DistributedTableMode::COLLABORATION) {
698         errCode = SQLiteUtils::BindTextToStatement(queryStmt, 2, dataItem.dev);  // 2 means device index.
699         if (errCode != E_OK) {
700             return errCode;
701         }
702     }
703     LogInfo logInfoGet;
704     errCode = SQLiteUtils::StepWithRetry(queryStmt, isMemDb_);
705     if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
706         errCode = -E_NOT_FOUND;
707     } else {
708         errCode = GetLogData(queryStmt, logInfoGet);
709     }
710 
711     LogInfo logInfoBind;
712     logInfoBind.hashKey = dataItem.hashKey;
713     logInfoBind.device = dataItem.dev;
714     logInfoBind.timestamp = dataItem.timestamp;
715     logInfoBind.flag = dataItem.flag;
716 
717     if (errCode == -E_NOT_FOUND) { // insert
718         logInfoBind.wTimestamp = dataItem.writeTimestamp;
719         logInfoBind.originDev = dataItem.dev;
720     } else if (errCode == E_OK) { // update
721         logInfoBind.wTimestamp = logInfoGet.wTimestamp;
722         logInfoBind.originDev = logInfoGet.originDev;
723     } else {
724         return errCode;
725     }
726 
727     // bind
728     SQLiteUtils::BindInt64ToStatement(statement, 1, rowid);  // 1 means dataKey index
729     std::vector<uint8_t> originDev(logInfoBind.originDev.begin(), logInfoBind.originDev.end());
730     SQLiteUtils::BindBlobToStatement(statement, 2, originDev);  // 2 means ori_dev index
731     SQLiteUtils::BindInt64ToStatement(statement, 3, logInfoBind.timestamp);  // 3 means timestamp index
732     SQLiteUtils::BindInt64ToStatement(statement, 4, logInfoBind.wTimestamp);  // 4 means w_timestamp index
733     SQLiteUtils::BindInt64ToStatement(statement, 5, logInfoBind.flag);  // 5 means flag index
734     SQLiteUtils::BindBlobToStatement(statement, 6, logInfoBind.hashKey);  // 6 means hashKey index
735     errCode = SQLiteUtils::StepWithRetry(statement, isMemDb_);
736     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
737         return E_OK;
738     }
739     return errCode;
740 }
741 
DeleteSyncDataItem(const DataItem & dataItem,sqlite3_stmt * & stmt)742 int SQLiteSingleVerRelationalStorageExecutor::DeleteSyncDataItem(const DataItem &dataItem, sqlite3_stmt *&stmt)
743 {
744     if (stmt == nullptr) {
745         std::string sql = "DELETE FROM " + table_.GetTableName() + " WHERE rowid IN ("
746             "SELECT data_key FROM " + DBConstant::RELATIONAL_PREFIX + baseTblName_ + "_log ";
747         if (mode_ == DistributedTableMode::COLLABORATION) {
748             sql += "WHERE hash_key=?);";
749         } else {
750             sql += "WHERE hash_key=? AND device=? AND flag&0x01=0);";
751         }
752         int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, stmt);
753         if (errCode != E_OK) {
754             LOGE("[DeleteSyncDataItem] Get statement fail!, errCode:%d", errCode);
755             return errCode;
756         }
757     }
758 
759     int errCode = SQLiteUtils::BindBlobToStatement(stmt, 1, dataItem.hashKey); // 1 means hash_key index
760     if (errCode != E_OK) {
761         SQLiteUtils::ResetStatement(stmt, true, errCode);
762         return errCode;
763     }
764     if (mode_ != DistributedTableMode::COLLABORATION) {
765         errCode = SQLiteUtils::BindTextToStatement(stmt, 2, dataItem.dev); // 2 means device index
766         if (errCode != E_OK) {
767             SQLiteUtils::ResetStatement(stmt, true, errCode);
768             return errCode;
769         }
770     }
771     errCode = SQLiteUtils::StepWithRetry(stmt, isMemDb_);
772     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
773         errCode = E_OK;
774     }
775     SQLiteUtils::ResetStatement(stmt, false, errCode);  // Finalize outside.
776     return errCode;
777 }
778 
SaveSyncDataItem(const DataItem & dataItem,sqlite3_stmt * & saveDataStmt,sqlite3_stmt * & rmDataStmt,const std::vector<FieldInfo> & fieldInfos,int64_t & rowid)779 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncDataItem(const DataItem &dataItem, sqlite3_stmt *&saveDataStmt,
780     sqlite3_stmt *&rmDataStmt, const std::vector<FieldInfo> &fieldInfos, int64_t &rowid)
781 {
782     if ((dataItem.flag & DataItem::DELETE_FLAG) != 0) {
783         return DeleteSyncDataItem(dataItem, rmDataStmt);
784     }
785     if ((mode_ == DistributedTableMode::COLLABORATION &&
786          table_.GetIdentifyKey().size() == 1u && table_.GetIdentifyKey().at(0) == "rowid") ||
787         (mode_ == DistributedTableMode::SPLIT_BY_DEVICE &&
788          table_.GetPrimaryKey().size() == 1u && table_.GetPrimaryKey().at(0) == "rowid") ||
789         table_.GetAutoIncrement()) {  // No primary key of auto increment
790         int errCode = DeleteSyncDataItem(dataItem, rmDataStmt);
791         if (errCode != E_OK) {
792             LOGE("Delete no pk data before insert failed, errCode=%d.", errCode);
793             return errCode;
794         }
795     }
796     OptRowDataWithLog data;
797     int errCode = DataTransformer::DeSerializeDataItem(dataItem, data, fieldInfos);
798     if (errCode != E_OK) {
799         LOGE("[RelationalStorageExecutor] DeSerialize dataItem failed! errCode = [%d]", errCode);
800         return errCode;
801     }
802 
803     if (data.optionalData.size() != table_.GetFields().size()) {
804         LOGW("Remote data has different fields with local data. Remote size:%zu, local size:%zu",
805             data.optionalData.size(), table_.GetFields().size());
806     }
807 
808     auto putSize = std::min(data.optionalData.size(), table_.GetFields().size());
809     for (size_t cid = 0; cid < putSize; ++cid) {
810         const auto &fieldData = data.optionalData[cid];
811         errCode = BindDataValueByType(saveDataStmt, fieldData, cid + 1);
812         if (errCode != E_OK) {
813             LOGE("Bind data failed, errCode:%d, cid:%zu.", errCode, cid + 1);
814             return errCode;
815         }
816     }
817 
818     errCode = SQLiteUtils::StepWithRetry(saveDataStmt, isMemDb_);
819     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
820         rowid = SQLiteUtils::GetLastRowId(dbHandle_);
821         errCode = E_OK;
822     }
823     return errCode;
824 }
825 
DeleteSyncLog(const DataItem & dataItem,sqlite3_stmt * & stmt)826 int SQLiteSingleVerRelationalStorageExecutor::DeleteSyncLog(const DataItem &dataItem, sqlite3_stmt *&stmt)
827 {
828     if (stmt == nullptr) {
829         std::string sql = "DELETE FROM " + DBConstant::RELATIONAL_PREFIX + baseTblName_ + "_log ";
830         if (mode_ == DistributedTableMode::COLLABORATION) {
831             sql += "WHERE hash_key=?";
832         } else {
833             sql += "WHERE hash_key=? AND device=?";
834         }
835 
836         int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, stmt);
837         if (errCode != E_OK) {
838             LOGE("[DeleteSyncLog] Get statement fail!");
839             return errCode;
840         }
841     }
842 
843     int errCode = SQLiteUtils::BindBlobToStatement(stmt, 1, dataItem.hashKey); // 1 means hashkey index
844     if (errCode != E_OK) {
845         SQLiteUtils::ResetStatement(stmt, true, errCode);
846         return errCode;
847     }
848     if (mode_ != DistributedTableMode::COLLABORATION) {
849         errCode = SQLiteUtils::BindTextToStatement(stmt, 2, dataItem.dev); // 2 means device index
850         if (errCode != E_OK) {
851             SQLiteUtils::ResetStatement(stmt, true, errCode);
852             return errCode;
853         }
854     }
855     errCode = SQLiteUtils::StepWithRetry(stmt, isMemDb_);
856     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
857         errCode = E_OK;
858     }
859     SQLiteUtils::ResetStatement(stmt, false, errCode);  // Finalize outside.
860     return errCode;
861 }
862 
ProcessMissQueryData(const DataItem & item,sqlite3_stmt * & rmDataStmt,sqlite3_stmt * & rmLogStmt)863 int SQLiteSingleVerRelationalStorageExecutor::ProcessMissQueryData(const DataItem &item, sqlite3_stmt *&rmDataStmt,
864     sqlite3_stmt *&rmLogStmt)
865 {
866     int errCode = DeleteSyncDataItem(item, rmDataStmt);
867     if (errCode != E_OK) {
868         return errCode;
869     }
870     return DeleteSyncLog(item, rmLogStmt);
871 }
872 
GetSyncDataPre(const DataItem & dataItem,DataItem & itemGet)873 int SQLiteSingleVerRelationalStorageExecutor::GetSyncDataPre(const DataItem &dataItem, DataItem &itemGet)
874 {
875     if (saveStmt_.queryStmt == nullptr) {
876         return -E_INVALID_ARGS;
877     }
878     int errCode = SQLiteUtils::BindBlobToStatement(saveStmt_.queryStmt, 1, dataItem.hashKey); // 1 index for hashkey
879     if (errCode != E_OK) {
880         return errCode;
881     }
882     if (mode_ != DistributedTableMode::COLLABORATION) {
883         errCode = SQLiteUtils::BindTextToStatement(saveStmt_.queryStmt, 2, dataItem.dev); // 2 index for devices
884         if (errCode != E_OK) {
885             return errCode;
886         }
887     }
888 
889     LogInfo logInfoGet;
890     errCode = SQLiteUtils::StepWithRetry(saveStmt_.queryStmt, isMemDb_);
891     if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
892         errCode = -E_NOT_FOUND;
893     } else {
894         errCode = GetLogData(saveStmt_.queryStmt, logInfoGet);
895     }
896     itemGet.timestamp = logInfoGet.timestamp;
897     SQLiteUtils::ResetStatement(saveStmt_.queryStmt, false, errCode);
898     return errCode;
899 }
900 
CheckDataConflictDefeated(const DataItem & dataItem,bool & isDefeated)901 int SQLiteSingleVerRelationalStorageExecutor::CheckDataConflictDefeated(const DataItem &dataItem, bool &isDefeated)
902 {
903     if ((dataItem.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) != DataItem::REMOTE_DEVICE_DATA_MISS_QUERY &&
904         mode_ == DistributedTableMode::SPLIT_BY_DEVICE) {
905         isDefeated = false; // no need to solve conflict except miss query data
906         return E_OK;
907     }
908 
909     DataItem itemGet;
910     int errCode = GetSyncDataPre(dataItem, itemGet);
911     if (errCode != E_OK && errCode != -E_NOT_FOUND) {
912         LOGE("Failed to get raw data. %d", errCode);
913         return errCode;
914     }
915     isDefeated = (dataItem.timestamp <= itemGet.timestamp); // defeated if item timestamp is earlier then raw data
916     return E_OK;
917 }
918 
SaveSyncDataItem(const std::vector<FieldInfo> & fieldInfos,const std::string & deviceName,DataItem & item)919 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncDataItem(const std::vector<FieldInfo> &fieldInfos,
920     const std::string &deviceName, DataItem &item)
921 {
922     item.dev = DBCommon::TransferStringToHex(DBCommon::TransferHashString(deviceName));
923     bool isDefeated = false;
924     int errCode = CheckDataConflictDefeated(item, isDefeated);
925     if (errCode != E_OK) {
926         LOGE("check data conflict failed. %d", errCode);
927         return errCode;
928     }
929 
930     if (isDefeated) {
931         LOGD("Data was defeated.");
932         return E_OK;
933     }
934     if ((item.flag & DataItem::REMOTE_DEVICE_DATA_MISS_QUERY) != 0) {
935         return ProcessMissQueryData(item, saveStmt_.rmDataStmt, saveStmt_.rmLogStmt);
936     }
937     int64_t rowid = -1;
938     errCode = SaveSyncDataItem(item, saveStmt_.saveDataStmt, saveStmt_.rmDataStmt, fieldInfos, rowid);
939     if (errCode == E_OK || errCode == -E_NOT_FOUND) {
940         errCode = SaveSyncLog(saveStmt_.saveLogStmt, saveStmt_.queryStmt, item, rowid);
941     }
942     return errCode;
943 }
944 
SaveSyncDataItems(const QueryObject & object,std::vector<DataItem> & dataItems,const std::string & deviceName)945 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncDataItems(const QueryObject &object,
946     std::vector<DataItem> &dataItems, const std::string &deviceName)
947 {
948     int errCode = PrepareForSavingData(object, saveStmt_.saveDataStmt);
949     if (errCode != E_OK) {
950         return errCode;
951     }
952     errCode = PrepareForSavingLog(object, deviceName, saveStmt_.saveLogStmt, saveStmt_.queryStmt);
953     if (errCode != E_OK) {
954         SQLiteUtils::ResetStatement(saveStmt_.saveDataStmt, true, errCode);
955         return errCode;
956     }
957     std::vector<FieldInfo> fieldInfos;
958     for (const auto &col: table_.GetFields()) {
959         fieldInfos.push_back(col.second);
960     }
961 
962     for (auto &item : dataItems) {
963         if (item.neglect) { // Do not save this record if it is neglected
964             continue;
965         }
966         errCode = SaveSyncDataItem(fieldInfos, deviceName, item);
967         if (errCode != E_OK) {
968             break;
969         }
970         // Need not reset rmDataStmt and rmLogStmt here.
971         saveStmt_.ResetStatements(false);
972     }
973     if (errCode == -E_NOT_FOUND) {
974         errCode = E_OK;
975     }
976     saveStmt_.ResetStatements(true);
977     return errCode;
978 }
979 
SaveSyncItems(const QueryObject & object,std::vector<DataItem> & dataItems,const std::string & deviceName,const TableInfo & table,bool useTrans)980 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncItems(const QueryObject &object, std::vector<DataItem> &dataItems,
981     const std::string &deviceName, const TableInfo &table, bool useTrans)
982 {
983     if (useTrans) {
984         int errCode = StartTransaction(TransactType::IMMEDIATE);
985         if (errCode != E_OK) {
986             return errCode;
987         }
988     }
989 
990     int errCode = SetLogTriggerStatus(false);
991     if (errCode != E_OK) {
992         goto END;
993     }
994 
995     baseTblName_ = object.GetTableName();
996     SetTableInfo(table);
997     errCode = SaveSyncDataItems(object, dataItems, deviceName);
998     if (errCode != E_OK) {
999         LOGE("Save sync data items failed. errCode=%d", errCode);
1000         goto END;
1001     }
1002 
1003     errCode = SetLogTriggerStatus(true);
1004 END:
1005     if (useTrans) {
1006         if (errCode == E_OK) {
1007             errCode = Commit();
1008         } else {
1009             (void)Rollback(); // Keep the error code of the first scene
1010         }
1011     }
1012     return errCode;
1013 }
1014 
GetDataItemForSync(sqlite3_stmt * stmt,DataItem & dataItem,bool isGettingDeletedData) const1015 int SQLiteSingleVerRelationalStorageExecutor::GetDataItemForSync(sqlite3_stmt *stmt, DataItem &dataItem,
1016     bool isGettingDeletedData) const
1017 {
1018     RowDataWithLog data;
1019     int errCode = GetLogData(stmt, data.logInfo);
1020     if (errCode != E_OK) {
1021         LOGE("relational data value transfer to kv fail");
1022         return errCode;
1023     }
1024 
1025     if (!isGettingDeletedData) {
1026         for (size_t cid = 0; cid < table_.GetFields().size(); ++cid) {
1027             DataValue value;
1028             errCode = SQLiteRelationalUtils::GetDataValueByType(stmt, cid + DBConstant::RELATIONAL_LOG_TABLE_FIELD_NUM,
1029                 value);
1030             if (errCode != E_OK) {
1031                 return errCode;
1032             }
1033             data.rowData.push_back(std::move(value));
1034         }
1035     }
1036 
1037     errCode = DataTransformer::SerializeDataItem(data,
1038         isGettingDeletedData ? std::vector<FieldInfo>() : table_.GetFieldInfos(), dataItem);
1039     if (errCode != E_OK) {
1040         LOGE("relational data value transfer to kv fail");
1041     }
1042     return errCode;
1043 }
1044 
GetMissQueryData(sqlite3_stmt * fullStmt,DataItem & item)1045 int SQLiteSingleVerRelationalStorageExecutor::GetMissQueryData(sqlite3_stmt *fullStmt, DataItem &item)
1046 {
1047     int errCode = GetDataItemForSync(fullStmt, item, false);
1048     if (errCode != E_OK) {
1049         return errCode;
1050     }
1051     item.value = {};
1052     item.flag |= DataItem::REMOTE_DEVICE_DATA_MISS_QUERY;
1053     return errCode;
1054 }
1055 
1056 namespace {
StepNext(bool isMemDB,sqlite3_stmt * stmt,Timestamp & timestamp)1057 int StepNext(bool isMemDB, sqlite3_stmt *stmt, Timestamp &timestamp)
1058 {
1059     if (stmt == nullptr) {
1060         return -E_INVALID_ARGS;
1061     }
1062     int errCode = SQLiteUtils::StepWithRetry(stmt, isMemDB);
1063     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1064         timestamp = INT64_MAX;
1065         errCode = E_OK;
1066     } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1067         timestamp = static_cast<uint64_t>(sqlite3_column_int64(stmt, 3));  // 3 means timestamp index
1068         errCode = E_OK;
1069     }
1070     return errCode;
1071 }
1072 
AppendData(const DataSizeSpecInfo & sizeInfo,size_t appendLength,size_t & overLongSize,size_t & dataTotalSize,std::vector<DataItem> & dataItems,DataItem && item)1073 int AppendData(const DataSizeSpecInfo &sizeInfo, size_t appendLength, size_t &overLongSize, size_t &dataTotalSize,
1074     std::vector<DataItem> &dataItems, DataItem &&item)
1075 {
1076     // If one record is over 4M, ignore it.
1077     if (item.value.size() > DBConstant::MAX_VALUE_SIZE) {
1078         overLongSize++;
1079     } else {
1080         // If dataTotalSize value is bigger than blockSize value , reserve the surplus data item.
1081         dataTotalSize += GetDataItemSerialSize(item, appendLength);
1082         if ((dataTotalSize > sizeInfo.blockSize && !dataItems.empty()) || dataItems.size() >= sizeInfo.packetSize) {
1083             return -E_UNFINISHED;
1084         } else {
1085             dataItems.push_back(item);
1086         }
1087     }
1088     return E_OK;
1089 }
1090 }
1091 
GetQueryDataAndStepNext(bool isFirstTime,bool isGettingDeletedData,sqlite3_stmt * queryStmt,DataItem & item,Timestamp & queryTime)1092 int SQLiteSingleVerRelationalStorageExecutor::GetQueryDataAndStepNext(bool isFirstTime, bool isGettingDeletedData,
1093     sqlite3_stmt *queryStmt, DataItem &item, Timestamp &queryTime)
1094 {
1095     if (!isFirstTime) { // For the first time, never step before, can get nothing
1096         int errCode = GetDataItemForSync(queryStmt, item, isGettingDeletedData);
1097         if (errCode != E_OK) {
1098             return errCode;
1099         }
1100     }
1101     return StepNext(isMemDb_, queryStmt, queryTime);
1102 }
1103 
GetMissQueryDataAndStepNext(sqlite3_stmt * fullStmt,DataItem & item,Timestamp & missQueryTime)1104 int SQLiteSingleVerRelationalStorageExecutor::GetMissQueryDataAndStepNext(sqlite3_stmt *fullStmt, DataItem &item,
1105     Timestamp &missQueryTime)
1106 {
1107     int errCode = GetMissQueryData(fullStmt, item);
1108     if (errCode != E_OK) {
1109         return errCode;
1110     }
1111     return StepNext(isMemDb_, fullStmt, missQueryTime);
1112 }
1113 
GetSyncDataByQuery(std::vector<DataItem> & dataItems,size_t appendLength,const DataSizeSpecInfo & sizeInfo,std::function<int (sqlite3 *,sqlite3_stmt * &,sqlite3_stmt * &,bool &)> getStmt,const TableInfo & tableInfo)1114 int SQLiteSingleVerRelationalStorageExecutor::GetSyncDataByQuery(std::vector<DataItem> &dataItems, size_t appendLength,
1115     const DataSizeSpecInfo &sizeInfo, std::function<int(sqlite3 *, sqlite3_stmt *&, sqlite3_stmt *&, bool &)> getStmt,
1116     const TableInfo &tableInfo)
1117 {
1118     baseTblName_ = tableInfo.GetTableName();
1119     SetTableInfo(tableInfo);
1120     sqlite3_stmt *queryStmt = nullptr;
1121     sqlite3_stmt *fullStmt = nullptr;
1122     bool isGettingDeletedData = false;
1123     int errCode = getStmt(dbHandle_, queryStmt, fullStmt, isGettingDeletedData);
1124     if (errCode != E_OK) {
1125         return errCode;
1126     }
1127 
1128     Timestamp queryTime = 0;
1129     Timestamp missQueryTime = (fullStmt == nullptr ? INT64_MAX : 0);
1130 
1131     bool isFirstTime = true;
1132     size_t dataTotalSize = 0;
1133     size_t overLongSize = 0;
1134     do {
1135         DataItem item;
1136         if (queryTime < missQueryTime) {
1137             errCode = GetQueryDataAndStepNext(isFirstTime, isGettingDeletedData, queryStmt, item, queryTime);
1138         } else if (queryTime == missQueryTime) {
1139             errCode = GetQueryDataAndStepNext(isFirstTime, isGettingDeletedData, queryStmt, item, queryTime);
1140             if (errCode != E_OK) {
1141                 break;
1142             }
1143             errCode = StepNext(isMemDb_, fullStmt, missQueryTime);
1144         } else {
1145             errCode = GetMissQueryDataAndStepNext(fullStmt, item, missQueryTime);
1146         }
1147 
1148         if (errCode == E_OK && !isFirstTime) {
1149             errCode = AppendData(sizeInfo, appendLength, overLongSize, dataTotalSize, dataItems, std::move(item));
1150         }
1151 
1152         if (errCode != E_OK) {
1153             break;
1154         }
1155 
1156         isFirstTime = false;
1157         if (queryTime == INT64_MAX && missQueryTime == INT64_MAX) {
1158             errCode = -E_FINISHED;
1159             break;
1160         }
1161     } while (true);
1162     LOGI("Get sync data finished, rc:%d, record size:%zu, overlong size:%zu, isDeleted:%d",
1163         errCode, dataItems.size(), overLongSize, isGettingDeletedData);
1164     SQLiteUtils::ResetStatement(queryStmt, true, errCode);
1165     SQLiteUtils::ResetStatement(fullStmt, true, errCode);
1166     return errCode;
1167 }
1168 
CheckDBModeForRelational()1169 int SQLiteSingleVerRelationalStorageExecutor::CheckDBModeForRelational()
1170 {
1171     std::string journalMode;
1172     int errCode = SQLiteUtils::GetJournalMode(dbHandle_, journalMode);
1173 
1174     for (auto &c : journalMode) { // convert to lowercase
1175         c = static_cast<char>(std::tolower(c));
1176     }
1177 
1178     if (errCode == E_OK && journalMode != "wal") {
1179         LOGE("Not support journal mode %s for relational db, expect wal mode.", journalMode.c_str());
1180         return -E_NOT_SUPPORT;
1181     }
1182     return errCode;
1183 }
1184 
DeleteDistributedDeviceTable(const std::string & device,const std::string & tableName)1185 int SQLiteSingleVerRelationalStorageExecutor::DeleteDistributedDeviceTable(const std::string &device,
1186     const std::string &tableName)
1187 {
1188     std::vector<std::string> deviceTables;
1189     int errCode = GetDeviceTableName(dbHandle_, tableName, device, deviceTables);
1190     if (errCode != E_OK) {
1191         LOGE("Get device table name for alter table failed. %d", errCode);
1192         return errCode;
1193     }
1194 
1195     LOGD("Begin to delete device table: deviceTable[%zu]", deviceTables.size());
1196     for (const auto &table : deviceTables) {
1197         std::string deleteSql = "DROP TABLE IF EXISTS " + table + ";"; // drop the found table
1198         errCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, deleteSql);
1199         if (errCode != E_OK) {
1200             LOGE("Delete device data failed. %d", errCode);
1201             break;
1202         }
1203     }
1204     return errCode;
1205 }
1206 
DeleteDistributedAllDeviceTableLog(const std::string & tableName)1207 int SQLiteSingleVerRelationalStorageExecutor::DeleteDistributedAllDeviceTableLog(const std::string &tableName)
1208 {
1209     std::string deleteLogSql = "DELETE FROM " + DBConstant::RELATIONAL_PREFIX + tableName + "_log WHERE flag&0x02=0";
1210     return SQLiteUtils::ExecuteRawSQL(dbHandle_, deleteLogSql);
1211 }
1212 
DeleteDistributedDeviceTableLog(const std::string & device,const std::string & tableName)1213 int SQLiteSingleVerRelationalStorageExecutor::DeleteDistributedDeviceTableLog(const std::string &device,
1214     const std::string &tableName)
1215 {
1216     std::string deleteLogSql = "DELETE FROM " + DBConstant::RELATIONAL_PREFIX + tableName + "_log WHERE device = ?";
1217     sqlite3_stmt *deleteLogStmt = nullptr;
1218     int errCode = SQLiteUtils::GetStatement(dbHandle_, deleteLogSql, deleteLogStmt);
1219     if (errCode != E_OK) {
1220         LOGE("Get delete device data log statement failed. %d", errCode);
1221         return errCode;
1222     }
1223 
1224     errCode = SQLiteUtils::BindTextToStatement(deleteLogStmt, 1, device);
1225     if (errCode != E_OK) {
1226         LOGE("Bind device to delete data log statement failed. %d", errCode);
1227         SQLiteUtils::ResetStatement(deleteLogStmt, true, errCode);
1228         return errCode;
1229     }
1230 
1231     errCode = SQLiteUtils::StepWithRetry(deleteLogStmt);
1232     if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1233         errCode = E_OK;
1234     } else {
1235         LOGE("Delete data log failed. %d", errCode);
1236     }
1237 
1238     SQLiteUtils::ResetStatement(deleteLogStmt, true, errCode);
1239     return errCode;
1240 }
1241 
DeleteDistributedLogTable(const std::string & tableName)1242 int SQLiteSingleVerRelationalStorageExecutor::DeleteDistributedLogTable(const std::string &tableName)
1243 {
1244     if (tableName.empty()) {
1245         return -E_INVALID_ARGS;
1246     }
1247     std::string logTableName = DBConstant::RELATIONAL_PREFIX + tableName + "_log";
1248     std::string deleteSql = "DROP TABLE IF EXISTS " + logTableName + ";";
1249     int errCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, deleteSql);
1250     if (errCode != E_OK) {
1251         LOGE("Delete distributed log table failed. %d", errCode);
1252     }
1253     return errCode;
1254 }
1255 
CheckAndCleanDistributedTable(const std::vector<std::string> & tableNames,std::vector<std::string> & missingTables)1256 int SQLiteSingleVerRelationalStorageExecutor::CheckAndCleanDistributedTable(const std::vector<std::string> &tableNames,
1257     std::vector<std::string> &missingTables)
1258 {
1259     if (tableNames.empty()) {
1260         return E_OK;
1261     }
1262     const std::string checkSql = "SELECT name FROM sqlite_master WHERE type='table' AND name=?;";
1263     sqlite3_stmt *stmt = nullptr;
1264     int errCode = SQLiteUtils::GetStatement(dbHandle_, checkSql, stmt);
1265     if (errCode != E_OK) {
1266         SQLiteUtils::ResetStatement(stmt, true, errCode);
1267         return errCode;
1268     }
1269     for (const auto &tableName : tableNames) {
1270         errCode = SQLiteUtils::BindTextToStatement(stmt, 1, tableName); // 1: tablename bind index
1271         if (errCode != E_OK) {
1272             LOGE("Bind table name to check distributed table statement failed. %d", errCode);
1273             break;
1274         }
1275 
1276         errCode = SQLiteUtils::StepWithRetry(stmt, false);
1277         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { // The table in schema was dropped
1278             errCode = DeleteDistributedDeviceTable({}, tableName); // Clean the auxiliary tables for the dropped table
1279             if (errCode != E_OK) {
1280                 LOGE("Delete device tables for missing distributed table failed. %d", errCode);
1281                 break;
1282             }
1283             errCode = DeleteDistributedLogTable(tableName);
1284             if (errCode != E_OK) {
1285                 LOGE("Delete log tables for missing distributed table failed. %d", errCode);
1286                 break;
1287             }
1288             missingTables.emplace_back(tableName);
1289         } else if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1290             LOGE("Check distributed table failed. %d", errCode);
1291             break;
1292         }
1293         errCode = E_OK; // Check result ok for distributed table is still exists
1294         SQLiteUtils::ResetStatement(stmt, false, errCode);
1295     }
1296     SQLiteUtils::ResetStatement(stmt, true, errCode);
1297     return CheckCorruptedStatus(errCode);
1298 }
1299 
CreateDistributedDeviceTable(const std::string & device,const TableInfo & baseTbl,const StoreInfo & info)1300 int SQLiteSingleVerRelationalStorageExecutor::CreateDistributedDeviceTable(const std::string &device,
1301     const TableInfo &baseTbl, const StoreInfo &info)
1302 {
1303     if (dbHandle_ == nullptr) {
1304         return -E_INVALID_DB;
1305     }
1306 
1307     if (device.empty() || !baseTbl.IsValid()) {
1308         return -E_INVALID_ARGS;
1309     }
1310 
1311     std::string deviceTableName = DBCommon::GetDistributedTableName(device, baseTbl.GetTableName(), info);
1312     int errCode = SQLiteUtils::CreateSameStuTable(dbHandle_, baseTbl, deviceTableName);
1313     if (errCode != E_OK) {
1314         LOGE("Create device table failed. %d", errCode);
1315         return errCode;
1316     }
1317 
1318     errCode = SQLiteUtils::CloneIndexes(dbHandle_, baseTbl.GetTableName(), deviceTableName);
1319     if (errCode != E_OK) {
1320         LOGE("Copy index to device table failed. %d", errCode);
1321     }
1322     return errCode;
1323 }
1324 
CheckQueryObjectLegal(const TableInfo & table,QueryObject & query,const std::string & schemaVersion)1325 int SQLiteSingleVerRelationalStorageExecutor::CheckQueryObjectLegal(const TableInfo &table, QueryObject &query,
1326     const std::string &schemaVersion)
1327 {
1328     if (dbHandle_ == nullptr) {
1329         return -E_INVALID_DB;
1330     }
1331 
1332     TableInfo newTable;
1333     int errCode = SQLiteUtils::AnalysisSchema(dbHandle_, table.GetTableName(), newTable);
1334     if (errCode != E_OK && errCode != -E_NOT_FOUND) {
1335         LOGE("Check new schema failed. %d", errCode);
1336         return errCode;
1337     } else {
1338         errCode = table.CompareWithTable(newTable, schemaVersion);
1339         if (errCode != -E_RELATIONAL_TABLE_EQUAL && errCode != -E_RELATIONAL_TABLE_COMPATIBLE) {
1340             LOGE("Check schema failed, schema was changed. %d", errCode);
1341             return -E_DISTRIBUTED_SCHEMA_CHANGED;
1342         } else {
1343             errCode = E_OK;
1344         }
1345     }
1346 
1347     SqliteQueryHelper helper = query.GetQueryHelper(errCode);
1348     if (errCode != E_OK) {
1349         LOGE("Get query helper for check query failed. %d", errCode);
1350         return errCode;
1351     }
1352 
1353     if (!query.IsQueryForRelationalDB()) {
1354         LOGE("Not support for this query type.");
1355         return -E_NOT_SUPPORT;
1356     }
1357 
1358     SyncTimeRange defaultTimeRange;
1359     sqlite3_stmt *stmt = nullptr;
1360     errCode = helper.GetRelationalQueryStatement(dbHandle_, defaultTimeRange.beginTime, defaultTimeRange.endTime, {},
1361         stmt);
1362     if (errCode != E_OK) {
1363         LOGE("Get query statement for check query failed. %d", errCode);
1364     }
1365 
1366     SQLiteUtils::ResetStatement(stmt, true, errCode);
1367     return errCode;
1368 }
1369 
ResetStatements(bool isNeedFinalize)1370 int SQLiteSingleVerRelationalStorageExecutor::SaveSyncDataStmt::ResetStatements(bool isNeedFinalize)
1371 {
1372     int errCode = E_OK;
1373     if (saveDataStmt != nullptr) {
1374         SQLiteUtils::ResetStatement(saveDataStmt, isNeedFinalize, errCode);
1375     }
1376     if (saveLogStmt != nullptr) {
1377         SQLiteUtils::ResetStatement(saveLogStmt, isNeedFinalize, errCode);
1378     }
1379     if (queryStmt != nullptr) {
1380         SQLiteUtils::ResetStatement(queryStmt, isNeedFinalize, errCode);
1381     }
1382     if (rmDataStmt != nullptr) {
1383         SQLiteUtils::ResetStatement(rmDataStmt, isNeedFinalize, errCode);
1384     }
1385     if (rmLogStmt != nullptr) {
1386         SQLiteUtils::ResetStatement(rmLogStmt, isNeedFinalize, errCode);
1387     }
1388     return errCode;
1389 }
1390 
GetMaxTimestamp(const std::vector<std::string> & tableNames,Timestamp & maxTimestamp) const1391 int SQLiteSingleVerRelationalStorageExecutor::GetMaxTimestamp(const std::vector<std::string> &tableNames,
1392     Timestamp &maxTimestamp) const
1393 {
1394     maxTimestamp = 0;
1395     for (const auto &tableName : tableNames) {
1396         const std::string sql = "SELECT max(timestamp) from " + DBConstant::RELATIONAL_PREFIX + tableName + "_log;";
1397         sqlite3_stmt *stmt = nullptr;
1398         int errCode = SQLiteUtils::GetStatement(dbHandle_, sql, stmt);
1399         if (errCode != E_OK) {
1400             return errCode;
1401         }
1402         errCode = SQLiteUtils::StepWithRetry(stmt, isMemDb_);
1403         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1404             maxTimestamp = std::max(maxTimestamp, static_cast<Timestamp>(sqlite3_column_int64(stmt, 0))); // 0 is index
1405             errCode = E_OK;
1406         }
1407         SQLiteUtils::ResetStatement(stmt, true, errCode);
1408         if (errCode != E_OK) {
1409             maxTimestamp = 0;
1410             return errCode;
1411         }
1412     }
1413     return E_OK;
1414 }
1415 
SetLogTriggerStatus(bool status)1416 int SQLiteSingleVerRelationalStorageExecutor::SetLogTriggerStatus(bool status)
1417 {
1418     const std::string key = "log_trigger_switch";
1419     std::string val = status ? "true" : "false";
1420     std::string sql = "INSERT OR REPLACE INTO " + DBConstant::RELATIONAL_PREFIX + "metadata" +
1421         " VALUES ('" + key + "', '" + val + "')";
1422     int errCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, sql);
1423     if (errCode != E_OK) {
1424         LOGE("Set log trigger to %s failed. errCode=%d", val.c_str(), errCode);
1425     }
1426     return errCode;
1427 }
1428 
1429 namespace {
GetRowDatas(sqlite3_stmt * stmt,bool isMemDb,std::vector<std::string> & colNames,std::vector<RelationalRowData * > & data)1430 int GetRowDatas(sqlite3_stmt *stmt, bool isMemDb, std::vector<std::string> &colNames,
1431     std::vector<RelationalRowData *> &data)
1432 {
1433     size_t totalLength = 0;
1434     do {
1435         int errCode = SQLiteUtils::StepWithRetry(stmt, isMemDb);
1436         if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) {
1437             return E_OK;
1438         } else if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) {
1439             LOGE("Get data by bind sql failed:%d", errCode);
1440             return errCode;
1441         }
1442 
1443         if (colNames.empty()) {
1444             SQLiteUtils::GetSelectCols(stmt, colNames);  // Get column names.
1445         }
1446         auto relaRowData = new (std::nothrow) RelationalRowDataImpl(SQLiteRelationalUtils::GetSelectValues(stmt));
1447         if (relaRowData == nullptr) {
1448             LOGE("ExecuteQueryBySqlStmt OOM");
1449             return -E_OUT_OF_MEMORY;
1450         }
1451 
1452         auto dataSz = relaRowData->CalcLength();
1453         if (dataSz == 0) {  // invalid data
1454             delete relaRowData;
1455             relaRowData = nullptr;
1456             continue;
1457         }
1458 
1459         totalLength += static_cast<size_t>(dataSz);
1460         if (totalLength > static_cast<uint32_t>(DBConstant::MAX_REMOTEDATA_SIZE)) {  // the set has been full
1461             delete relaRowData;
1462             relaRowData = nullptr;
1463             LOGE("ExecuteQueryBySqlStmt OVERSIZE");
1464             return -E_REMOTE_OVER_SIZE;
1465         }
1466         data.push_back(relaRowData);
1467     } while (true);
1468     return E_OK;
1469 }
1470 }
1471 
1472 // sql must not be empty, colNames and data must be empty
ExecuteQueryBySqlStmt(const std::string & sql,const std::vector<std::string> & bindArgs,int packetSize,std::vector<std::string> & colNames,std::vector<RelationalRowData * > & data)1473 int SQLiteSingleVerRelationalStorageExecutor::ExecuteQueryBySqlStmt(const std::string &sql,
1474     const std::vector<std::string> &bindArgs, int packetSize, std::vector<std::string> &colNames,
1475     std::vector<RelationalRowData *> &data)
1476 {
1477     int errCode = SQLiteUtils::SetAuthorizer(dbHandle_, &PermitSelect);
1478     if (errCode != E_OK) {
1479         return errCode;
1480     }
1481 
1482     sqlite3_stmt *stmt = nullptr;
1483     errCode = SQLiteUtils::GetStatement(dbHandle_, sql, stmt);
1484     if (errCode != E_OK) {
1485         (void)SQLiteUtils::SetAuthorizer(dbHandle_, nullptr);
1486         return errCode;
1487     }
1488     ResFinalizer finalizer([this, &stmt, &errCode] {
1489         (void)SQLiteUtils::SetAuthorizer(this->dbHandle_, nullptr);
1490         SQLiteUtils::ResetStatement(stmt, true, errCode);
1491     });
1492     for (size_t i = 0; i < bindArgs.size(); ++i) {
1493         errCode = SQLiteUtils::BindTextToStatement(stmt, i + 1, bindArgs.at(i));
1494         if (errCode != E_OK) {
1495             return errCode;
1496         }
1497     }
1498     return GetRowDatas(stmt, isMemDb_, colNames, data);
1499 }
1500 
CheckEncryptedOrCorrupted() const1501 int SQLiteSingleVerRelationalStorageExecutor::CheckEncryptedOrCorrupted() const
1502 {
1503     if (dbHandle_ == nullptr) {
1504         return -E_INVALID_DB;
1505     }
1506 
1507     int errCode = SQLiteUtils::ExecuteRawSQL(dbHandle_, "SELECT count(*) FROM sqlite_master;");
1508     if (errCode != E_OK) {
1509         LOGE("[SingVerRelaExec] CheckEncryptedOrCorrupted failed:%d", errCode);
1510     }
1511     return errCode;
1512 }
1513 
GetExistsDeviceList(std::set<std::string> & devices) const1514 int SQLiteSingleVerRelationalStorageExecutor::GetExistsDeviceList(std::set<std::string> &devices) const
1515 {
1516     return SqliteMetaExecutor::GetExistsDevicesFromMeta(dbHandle_, SqliteMetaExecutor::MetaMode::RDB,
1517         isMemDb_, devices);
1518 }
1519 } // namespace DistributedDB
1520 #endif
1521