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