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 #ifndef OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_STORE_GENERAL_VALUE_H 17 #define OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_STORE_GENERAL_VALUE_H 18 #include <functional> 19 #include <map> 20 #include <memory> 21 #include <string> 22 #include <variant> 23 #include <vector> 24 25 #include "error/general_error.h" 26 #include "traits.h" 27 namespace OHOS::DistributedData { 28 enum GenProgress { 29 SYNC_BEGIN, 30 SYNC_IN_PROGRESS, 31 SYNC_FINISH, 32 }; 33 34 enum SyncTriggerMode { 35 MODE_DEFAULT = 0, 36 MODE_PUSH, 37 MODE_ONLINE, 38 MODE_UNLOCK, 39 MODE_BROADCASTER, 40 MODE_CONSISTENCY, 41 }; 42 43 struct GenStatistic { 44 uint32_t total; 45 uint32_t success; 46 uint32_t failed; 47 uint32_t untreated; 48 }; 49 50 struct GenTableDetail { 51 GenStatistic upload; 52 GenStatistic download; 53 }; 54 55 struct GenProgressDetail { 56 int32_t progress; 57 int32_t code; 58 int32_t dbCode; 59 uint64_t changeCount = 0; 60 std::map<std::string, GenTableDetail> details; 61 }; 62 63 struct Asset { 64 enum Status : int32_t { 65 STATUS_UNKNOWN, 66 STATUS_NORMAL, 67 STATUS_INSERT, 68 STATUS_UPDATE, 69 STATUS_DELETE, 70 STATUS_ABNORMAL, 71 STATUS_DOWNLOADING, 72 STATUS_BUTT 73 }; 74 75 static constexpr uint64_t NO_EXPIRES_TIME = 0; 76 uint32_t version = 0; 77 uint32_t status = STATUS_UNKNOWN; 78 uint64_t expiresTime = NO_EXPIRES_TIME; 79 std::string id; 80 std::string name; 81 std::string uri; 82 std::string createTime; 83 std::string modifyTime; 84 std::string size; 85 std::string hash; 86 std::string path; 87 }; 88 89 struct Reference { 90 std::string sourceTable; 91 std::string targetTable; 92 std::map<std::string, std::string> refFields; 93 }; 94 95 struct SyncParam { 96 int32_t mode; 97 int32_t wait; 98 bool isCompensation = false; 99 int32_t triggerMode = MODE_DEFAULT; 100 std::string prepareTraceId; 101 int32_t user; 102 }; 103 104 enum SyncStage : int8_t { 105 PREPARE = 0, 106 START, 107 END 108 }; 109 110 struct ReportParam { 111 int32_t user = 0; 112 std::string bundleName; 113 std::string prepareTraceId; 114 SyncStage syncStage = SyncStage::PREPARE; 115 int32_t errCode = 0; 116 }; 117 118 using Assets = std::vector<Asset>; 119 using Bytes = std::vector<uint8_t>; 120 using Relations = std::map<std::string, std::string>; 121 using Value = std::variant<std::monostate, int64_t, double, std::string, bool, Bytes, Asset, Assets, Relations>; 122 using Values = std::vector<Value>; 123 using VBucket = std::map<std::string, Value>; 124 using VBuckets = std::vector<VBucket>; 125 using GenDetails = std::map<std::string, GenProgressDetail>; 126 using GenAsync = std::function<void(const GenDetails &details)>; 127 template<typename T> 128 inline constexpr size_t TYPE_INDEX = Traits::variant_index_of_v<T, Value>; 129 130 inline constexpr size_t TYPE_MAX = Traits::variant_size_of_v<Value>; 131 132 enum class QueryOperation : uint32_t { 133 ILLEGAL = 0, 134 IN = 1, 135 OR = 0x101, 136 AND, 137 EQUAL_TO = 0x201, 138 BEGIN_GROUP = 0x301, 139 END_GROUP 140 }; 141 142 struct QueryNode { 143 QueryOperation op = QueryOperation::ILLEGAL; 144 std::string fieldName; 145 std::vector<Value> fieldValue; 146 }; 147 using QueryNodes = std::vector<QueryNode>; 148 149 struct GenQuery { 150 virtual ~GenQuery() = default; 151 virtual bool IsEqual(uint64_t tid) = 0; 152 virtual std::vector<std::string> GetTables() = 0; SetQueryNodesGenQuery153 virtual void SetQueryNodes(const std::string& tableName, QueryNodes&& nodes) {}; GetQueryNodesGenQuery154 virtual QueryNodes GetQueryNodes(const std::string& tableName) 155 { 156 return {}; 157 }; 158 159 template<typename T> QueryInterfaceGenQuery160 int32_t QueryInterface(T *&query) 161 { 162 if (!IsEqual(T::TYPE_ID)) { 163 return E_INVALID_ARGS; 164 } 165 query = static_cast<T *>(this); 166 return E_OK; 167 }; 168 }; 169 170 template<typename T, typename O> GetItem(T && input,O & output)171 bool GetItem(T &&input, O &output) 172 { 173 return false; 174 } 175 176 template<typename T, typename O, typename First, typename... Rest> GetItem(T && input,O & output)177 bool GetItem(T &&input, O &output) 178 { 179 auto val = Traits::get_if<First>(&input); 180 if (val != nullptr) { 181 output = std::move(*val); 182 return true; 183 } 184 return GetItem<T, O, Rest...>(std::move(input), output); 185 } 186 187 template<typename T, typename... Types> Convert(T && input,std::variant<Types...> & output)188 bool Convert(T &&input, std::variant<Types...> &output) 189 { 190 return GetItem<T, decltype(output), Types...>(std::move(input), output); 191 } 192 } // namespace OHOS::DistributedData 193 #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_STORE_GENERAL_VALUE_H 194