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 ×tamp)
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