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 &user, 53 const std::string &device, 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, QuerySyncObject &querySyncObject, 63 std::vector<std::string> &cloudGid); 64 private: 65 using UploadDetail = std::pair<uint32_t, uint32_t>; 66 static int GetCloudDataForSync(const CloudSyncConfig &config, const CloudUploadRecorder &recorder, 67 sqlite3_stmt *statement, CloudSyncData &cloudDataResult, UploadDetail &detail); 68 69 static void GetCloudLog(sqlite3_stmt *stmt, VBucket &logInfo, uint32_t &totalSize); 70 71 static void GetCloudExtraLog(sqlite3_stmt *stmt, VBucket &flags); 72 73 static int GetCloudKvData(sqlite3_stmt *stmt, VBucket &data, uint32_t &totalSize); 74 75 static int GetCloudKvBlobData(const std::string &keyStr, int index, sqlite3_stmt *stmt, 76 VBucket &data, uint32_t &totalSize); 77 78 static std::pair<int, sqlite3_stmt*> GetLogInfoStmt(sqlite3 *db, const VBucket &cloudData, bool existKey, 79 bool emptyUserId); 80 81 static std::pair<int, DataInfoWithLog> GetLogInfoInner(sqlite3_stmt *stmt, bool isMemory, const std::string &gid, 82 const Bytes &key, const std::string &userId); 83 84 static DataInfoWithLog FillLogInfoWithStmt(sqlite3_stmt *stmt); 85 86 static int ExecutePutCloudData(sqlite3 *db, bool isMemory, DownloadData &downloadData, 87 std::map<int, int> &statisticMap); 88 89 static int OperateCloudData(sqlite3 *db, bool isMemory, int index, OpType opType, 90 DownloadData &downloadData); 91 92 static std::string GetOperateDataSql(OpType opType); 93 94 static std::string GetOperateLogSql(OpType opType); 95 96 static OpType TransToOpType(const CloudWaterType type); 97 98 static int BindOnlyUpdateLogStmt(sqlite3_stmt *logStmt, const std::string &user, const DataItem &dataItem); 99 100 static int BindStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, int index, OpType opType, 101 DownloadData &downloadData); 102 103 static int BindInsertStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 104 const DataItem &dataItem); 105 106 static int BindInsertLogStmt(sqlite3_stmt *logStmt, const std::string &user, 107 const DataItem &dataItem); 108 109 static int BindUpdateStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 110 const DataItem &dataItem); 111 112 static int BindUpdateLogStmt(sqlite3_stmt *logStmt, const std::string &user, const DataItem &dataItem); 113 114 static int BindDeleteStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, const std::string &user, 115 DataItem &dataItem); 116 117 static int BindDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, bool isInsert); 118 119 static int BindSyncDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, bool isInsert, int &index); 120 121 static int BindCloudDataStmt(sqlite3_stmt *dataStmt, const DataItem &dataItem, int &index); 122 123 static int StepStmt(sqlite3_stmt *logStmt, sqlite3_stmt *dataStmt, bool isMemory); 124 125 static int OnlyUpdateLogTable(sqlite3 *db, bool isMemory, int index, OpType op, DownloadData &downloadData); 126 127 static int OnlyUpdateSyncData(sqlite3 *db, bool isMemory, int index, OpType opType, DownloadData &downloadData); 128 129 static int BindUpdateSyncDataStmt(sqlite3_stmt *dataStmt, int index, OpType opType, DownloadData &downloadData); 130 131 static int BindUpdateTimestampStmt(sqlite3_stmt *dataStmt, int index, DownloadData &downloadData); 132 133 static int FillCloudGid(const FillGidParam ¶m, const CloudSyncBatch &data, const std::string &user, 134 const CloudWaterType &type, CloudUploadRecorder &recorder); 135 136 static std::pair<int, DataItem> GetDataItem(int index, DownloadData &downloadData); 137 138 static std::pair<int, int64_t> CountCloudDataInner(sqlite3 *db, bool isMemory, const Timestamp ×tamp, 139 const std::string &user, std::string &sql); 140 141 static int FillCloudVersionRecord(sqlite3 *db, OpType opType, const CloudSyncData &data); 142 143 static std::pair<int, CloudSyncData> GetLocalCloudVersionInner(sqlite3 *db, bool isMemory, 144 const std::string &user); 145 146 static int GetCloudVersionRecord(bool isMemory, sqlite3_stmt *stmt, CloudSyncData &syncData); 147 148 static void InitDefaultCloudVersionRecord(const std::string &key, const std::string &dev, CloudSyncData &syncData); 149 150 static int BindVersionStmt(const std::string &device, const std::string &user, sqlite3_stmt *dataStmt); 151 152 static int GetCloudVersionRecordData(sqlite3_stmt *stmt, VBucket &data, uint32_t &totalSize); 153 154 static Timestamp GetMaxTimeStamp(std::vector<VBucket> &dataExtend); 155 156 static bool UpdateBeginTimeForMemoryDB(SQLiteSingleVerContinueToken &token, CloudSyncData &data); 157 158 static int BindFillGidLogStmt(sqlite3_stmt *logStmt, const std::string &user, 159 const DataItem &dataItem, const VBucket &uploadExtend, const CloudWaterType &type); 160 private: 161 static void MarkUploadSuccess(const FillGidParam ¶m, const CloudSyncBatch &data, 162 const std::string &user, size_t dataIndex); 163 164 static bool CheckDataChanged(const FillGidParam ¶m, const CloudSyncBatch &data, size_t dataIndex); 165 166 static bool CheckDataDelete(const FillGidParam ¶m, const CloudSyncBatch &data, size_t dataIndex); 167 168 static void MarkUploadSuccessInner(const FillGidParam ¶m, const CloudSyncBatch &data, const std::string &user, 169 size_t dataIndex); 170 }; 171 } 172 #endif // SQLITE_CLOUD_KV_EXECUTOR_UTILS_H