1 /* 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "sqlite_meta_executor.h" 17 18 #include "db_common.h" 19 #include "db_constant.h" 20 namespace DistributedDB { GetMetaKeysByKeyPrefix(const std::string & keyPre,sqlite3 * dbHandle,MetaMode metaMode,bool isMemDb,std::set<std::string> & outKeys)21 int SqliteMetaExecutor::GetMetaKeysByKeyPrefix(const std::string &keyPre, sqlite3 *dbHandle, MetaMode metaMode, 22 bool isMemDb, std::set<std::string> &outKeys) 23 { 24 sqlite3_stmt *statement = nullptr; 25 std::string sqlStr; 26 switch (metaMode) { 27 case MetaMode::KV: 28 sqlStr = SELECT_META_KEYS_BY_PREFIX; 29 break; 30 case MetaMode::KV_ATTACH: 31 sqlStr = SELECT_ATTACH_META_KEYS_BY_PREFIX; 32 break; 33 case MetaMode::RDB: 34 sqlStr = SELECT_RDB_META_KEYS_BY_PREFIX; 35 break; 36 default: 37 return -E_INVALID_ARGS; 38 } 39 int errCode = SQLiteUtils::GetStatement(dbHandle, sqlStr, statement); 40 if (errCode != E_OK) { 41 LOGE("[SqliteMetaExecutor] Get statement failed:%d", errCode); 42 return errCode; 43 } 44 45 Key keyPrefix; 46 DBCommon::StringToVector(keyPre + '%', keyPrefix); 47 errCode = SQLiteUtils::BindBlobToStatement(statement, 1, keyPrefix); // 1: bind index for prefix key 48 if (errCode != E_OK) { 49 LOGE("[SqliteMetaExecutor] Bind statement failed:%d", errCode); 50 SQLiteUtils::ResetStatement(statement, true, errCode); 51 return errCode; 52 } 53 54 std::vector<Key> keys; 55 errCode = GetAllKeys(statement, isMemDb, keys); 56 SQLiteUtils::ResetStatement(statement, true, errCode); 57 for (const auto &it : keys) { 58 if (it.size() >= keyPre.size() + DBConstant::HASH_KEY_SIZE) { 59 outKeys.insert({it.begin() + keyPre.size(), it.begin() + keyPre.size() + DBConstant::HASH_KEY_SIZE}); 60 } else { 61 LOGW("[SqliteMetaExecutor] Get invalid key, size=%zu", it.size()); 62 } 63 } 64 return errCode; 65 } 66 GetAllKeys(sqlite3_stmt * statement,bool isMemDb,std::vector<Key> & keys)67 int SqliteMetaExecutor::GetAllKeys(sqlite3_stmt *statement, bool isMemDb, std::vector<Key> &keys) 68 { 69 if (statement == nullptr) { 70 return -E_INVALID_DB; 71 } 72 int errCode; 73 do { 74 errCode = SQLiteUtils::StepWithRetry(statement, isMemDb); 75 if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) { 76 Key key; 77 errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, key); 78 if (errCode != E_OK) { 79 break; 80 } 81 82 keys.push_back(std::move(key)); 83 } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { 84 errCode = E_OK; 85 break; 86 } else { 87 LOGE("SQLite step for getting all keys failed:%d", errCode); 88 break; 89 } 90 } while (true); 91 return errCode; 92 } 93 GetExistsDevicesFromMeta(sqlite3 * dbHandle,MetaMode metaMode,bool isMemDb,std::set<std::string> & devices)94 int SqliteMetaExecutor::GetExistsDevicesFromMeta(sqlite3 *dbHandle, MetaMode metaMode, 95 bool isMemDb, std::set<std::string> &devices) 96 { 97 int errCode = GetMetaKeysByKeyPrefix(DBConstant::DEVICEID_PREFIX_KEY, dbHandle, metaMode, isMemDb, devices); 98 if (errCode != E_OK) { 99 LOGE("Get meta data key failed. err=%d", errCode); 100 return errCode; 101 } 102 errCode = GetMetaKeysByKeyPrefix(DBConstant::QUERY_SYNC_PREFIX_KEY, dbHandle, metaMode, isMemDb, devices); 103 if (errCode != E_OK) { 104 LOGE("Get meta data key failed. err=%d", errCode); 105 return errCode; 106 } 107 errCode = GetMetaKeysByKeyPrefix(DBConstant::DELETE_SYNC_PREFIX_KEY, dbHandle, metaMode, isMemDb, devices); 108 if (errCode != E_OK) { 109 LOGE("Get meta data key failed. err=%d", errCode); 110 } 111 return errCode; 112 } 113 }