1 /* 2 * Copyright (c) 2024 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 #ifndef SQLITE_CLOUD_KV_EXECUTOR_UTILS_H 17 #define SQLITE_CLOUD_KV_EXECUTOR_UTILS_H 18 19 #include "cloud/cloud_db_types.h" 20 21 #include "cloud/cloud_db_types.h" 22 #include "cloud/cloud_upload_recorder.h" 23 #include "data_transformer.h" 24 #include "icloud_sync_storage_interface.h" 25 #include "sqlite_single_ver_continue_token.h" 26 #include "sqlite_utils.h" 27 28 namespace DistributedDB { 29 class SqliteCloudKvExecutorUtils { 30 public: 31 using DBParam = std::pair<sqlite3 *, bool>; 32 using FillGidParam = std::pair<sqlite3 *, bool>; 33 static int GetCloudData(const CloudSyncConfig &config, const DBParam ¶m, const CloudUploadRecorder &recorder, 34 SQLiteSingleVerContinueToken &token, CloudSyncData &data); 35 36 static std::pair<int, DataInfoWithLog> GetLogInfo(sqlite3 *db, bool isMemory, const VBucket &cloudData, 37 const std::string &userId); 38 39 static int PutCloudData(sqlite3 *db, bool isMemory, DownloadData &downloadData); 40 41 static int FillCloudLog(const FillGidParam ¶m, OpType opType, const CloudSyncData &data, 42 const std::string &user, CloudUploadRecorder &recorder); 43 44 static std::pair<int, int64_t> CountCloudData(sqlite3 *db, bool isMemory, const Timestamp ×tamp, 45 const std::string &user, bool forcePush); 46 47 static std::pair<int, int64_t> CountAllCloudData(const DBParam ¶m, const std::vector<Timestamp> ×tampVec, 48 const std::string &user, bool forcePush, QuerySyncObject &querySyncObject); 49 50 static std::pair<int, CloudSyncData> GetLocalCloudVersion(sqlite3 *db, bool isMemory, const std::string &user); 51 52 static int GetCloudVersionFromCloud(sqlite3 *db, bool isMemory, const std::string &device, 53 std::vector<VBucket> &dataVector); 54 55 static int GetWaitCompensatedSyncDataPk(sqlite3 *db, bool isMemory, std::vector<VBucket> &data); 56 57 static int GetWaitCompensatedSyncDataUserId(sqlite3 *db, bool isMemory, std::vector<VBucket> &users); 58 59 static int GetWaitCompensatedSyncData(sqlite3 *db, bool isMemory, std::vector<VBucket> &data, 60 std::vector<VBucket> &users); 61 62 static int QueryCloudGid(sqlite3 *db, bool isMemory, const std::string &user, 63 const QuerySyncObject &querySyncObject, std::vector<std::string> &cloudGid); 64 65 private: 66 using UploadDetail = std::pair<uint32_t, uint32_t>; 67 static int GetCloudDataForSync(const CloudSyncConfig &config, const CloudUploadRecorder &recorder, 68 sqlite3_stmt *statement, CloudSyncData &cloudDataResult, UploadDetail &detail); 69 70 static void GetCloudLog(sqlite3_stmt *stmt, VBucket &logInfo, uint32_t &totalSize, 71 int64_t &revisedTime, int64_t &invalidTime); 72 73 static void GetCloudExtraLog(sqlite3_stmt *stmt, VBucket &flags); 74 75 static int GetCloudKvData(sqlite3_stmt *stmt, VBucket &data, uint32_t &totalSize); 76 77 static int GetCloudKvBlobData(const std::string &keyStr, int index, sqlite3_stmt *stmt, 78 VBucket &data, uint32_t &totalSize); 79 80 static std::pair<int, sqlite3_stmt*> GetLogInfoStmt(sqlite3 *db, const VBucket &cloudData, bool existKey, 81 bool emptyUserId); 82 83 static std::pair<int, DataInfoWithLog> GetLogInfoInner(sqlite3_stmt *stmt, bool isMemory, const std::string &gid, 84 const Bytes &key, const std::string &userId); 85 86 static DataInfoWithLog FillLogInfoWithStmt(sqlite3_stmt *stmt); 87 88 static int ExecutePutCloudData(sqlite3 *db, bool isMemory, DownloadData &downloadData, 89 std::map<int, int> &statisticMap); 90 91 static int OperateCloudData(sqlite3 *db, bool isMemory, int index, OpType opType, 92 DownloadData &downloadData); 93 94 static int OperateOtherUserLog(sqlite3 *db, bool isMemory, int index, DownloadData &downloadData); 95 96 static std::string GetOperateDataSql(OpType opType); 97 98 static std::string GetOperateLogSql(OpType opType); 99 100 static OpType TransToOpType(const CloudWaterType type); 101 102 static int BindOnlyUpdateLogStmt(sqlite3_stmt *logStmt, const std::string &user, const DataItem &dataItem); 103 104 static int BindStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, int index, OpType opType, 105 DownloadData &downloadData); 106 107 static int BindInsertStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 108 const DataItem &dataItem); 109 110 static int BindInsertLogStmt(sqlite3_stmt *logStmt, const std::string &user, 111 const DataItem &dataItem, bool isTagLogin = true); 112 113 static int BindUpdateStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 114 const DataItem &dataItem); 115 116 static int BindUpdateLogStmt(sqlite3_stmt *logStmt, const std::string &user, const DataItem &dataItem); 117 118 static int BindDeleteStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 119 DataItem &dataItem); 120 121 static int BindDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, bool isInsert); 122 123 static int BindSyncDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, bool isInsert, int &index); 124 125 static int BindCloudDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, int &index); 126 127 static int StepStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, bool isMemory); 128 129 static int OnlyUpdateLogTable(sqlite3 *db, bool isMemory, int index, OpType op, DownloadData &downloadData); 130 131 static int OnlyUpdateSyncData(sqlite3 *db, bool isMemory, int index, OpType opType, DownloadData &downloadData); 132 133 static int BindUpdateSyncDataStmt(sqlite3_stmt *dataStmt, int index, OpType opType, DownloadData &downloadData); 134 135 static int BindUpdateTimestampStmt(sqlite3_stmt *dataStmt, int index, DownloadData &downloadData); 136 137 static int FillCloudGid(const FillGidParam ¶m, const CloudSyncBatch &data, const std::string &user, 138 const CloudWaterType &type, CloudUploadRecorder &recorder); 139 140 static std::pair<int, DataItem> GetDataItem(int index, DownloadData &downloadData); 141 142 static std::pair<int, int64_t> CountCloudDataInner(sqlite3 *db, bool isMemory, const Timestamp ×tamp, 143 const std::string &user, const std::string &sql); 144 145 static int FillCloudVersionRecord(sqlite3 *db, OpType opType, const CloudSyncData &data); 146 147 static std::pair<int, CloudSyncData> GetLocalCloudVersionInner(sqlite3 *db, bool isMemory, 148 const std::string &user); 149 150 static int GetCloudVersionRecord(bool isMemory, sqlite3_stmt *stmt, CloudSyncData &syncData); 151 152 static void InitDefaultCloudVersionRecord(const std::string &key, const std::string &dev, CloudSyncData &syncData); 153 154 static int BindVersionStmt(const std::string &device, sqlite3_stmt *dataStmt); 155 156 static int GetCloudVersionRecordData(sqlite3_stmt *stmt, VBucket &data, uint32_t &totalSize); 157 158 static Timestamp GetMaxTimeStamp(const std::vector<VBucket> &dataExtend); 159 160 static void UpdateBeginTime(SQLiteSingleVerContinueToken &token, const CloudSyncData &data); 161 162 static int BindFillGidLogStmt(sqlite3_stmt *logStmt, const std::string &user, 163 const DataItem &dataItem, const VBucket &uploadExtend, const CloudWaterType &type); 164 165 static int64_t GetModifyTime(int64_t timestamp); 166 private: 167 static void MarkUploadSuccess(const FillGidParam ¶m, const CloudSyncBatch &data, 168 const std::string &user, size_t dataIndex); 169 170 static bool CheckDataChanged(const FillGidParam ¶m, const CloudSyncBatch &data, size_t dataIndex); 171 172 static bool CheckDataDelete(const FillGidParam ¶m, const CloudSyncBatch &data, size_t dataIndex); 173 174 static void MarkUploadSuccessInner(const FillGidParam ¶m, const CloudSyncBatch &data, const std::string &user, 175 size_t dataIndex); 176 }; 177 } 178 #endif // SQLITE_CLOUD_KV_EXECUTOR_UTILS_H