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 #ifndef OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_WATER_MANAGER_H 16 #define OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_WATER_MANAGER_H 17 #include <map> 18 #include <set> 19 #include <string> 20 #include "serializable/serializable.h" 21 #include "lru_bucket.h" 22 23 namespace OHOS { 24 namespace DistributedData { 25 class WaterVersionManager { 26 public: 27 enum Type { 28 BEGIN, 29 DYNAMIC = BEGIN, 30 STATIC, 31 BUTT 32 }; 33 class WaterVersionMetaData final : public Serializable { 34 public: 35 static constexpr uint32_t DEFAULT_VERSION = 0; 36 std::string deviceId; 37 uint32_t version = DEFAULT_VERSION; 38 uint64_t waterVersion = 0; 39 Type type; 40 std::vector<std::string> keys; 41 std::vector<std::vector<uint64_t>> infos; 42 bool Marshal(json &node) const override; 43 bool Unmarshal(const json &node) override; 44 bool IsValid(); 45 std::string ToAnonymousString() const; 46 std::string GetKey() const; 47 uint64_t GetVersion() const; GetLevel()48 uint16_t GetLevel() const 49 { 50 // low 4 bit is mask 51 return (waterVersion & 0xFFF) << 4; 52 } 53 static std::string GetPrefix(); 54 55 private: 56 static constexpr const char *KEY_PREFIX = "WaterVersionMeta"; 57 }; 58 API_EXPORT static WaterVersionManager &GetInstance(); 59 API_EXPORT void Init(); 60 API_EXPORT std::string GenerateWaterVersion(const std::string &bundleName, const std::string &storeName); 61 std::string GetWaterVersion(const std::string &bundleName, const std::string &storeName); 62 std::pair<bool, uint64_t> GetVersion(const std::string &deviceId, Type type); 63 std::string GetWaterVersion(const std::string &deviceId, Type type); 64 bool SetWaterVersion(const std::string &bundleName, const std::string &storeName, 65 const std::string &waterVersion); 66 bool DelWaterVersion(const std::string &deviceId); 67 68 private: 69 WaterVersionManager(); 70 ~WaterVersionManager(); 71 WaterVersionManager(const WaterVersionManager &) = delete; 72 WaterVersionManager(WaterVersionManager &&) noexcept = delete; 73 WaterVersionManager& operator=(const WaterVersionManager &) = delete; 74 WaterVersionManager& operator=(WaterVersionManager &&) = delete; 75 static constexpr size_t MAX_DEVICES = 16; 76 class WaterVersion { 77 public: 78 WaterVersion() = default; 79 void SetType(Type type); 80 void AddKey(const std::string &key); 81 bool InitWaterVersion(const WaterVersionMetaData &metaData); 82 std::pair<bool, WaterVersionMetaData> GenerateWaterVersion(const std::string &key); 83 std::pair<bool, WaterVersionMetaData> GetWaterVersion(const std::string &deviceId); 84 bool SetWaterVersion(const std::string &key, const WaterVersionMetaData &metaData); 85 bool DelWaterVersion(const std::string &deviceId); 86 private: 87 static constexpr uint16_t INVALID_VERSION = 0xFFF; 88 Type type_; 89 std::mutex mutex_; 90 std::vector<std::string> keys_; 91 LRUBucket<std::string, WaterVersionMetaData> versions_{ MAX_DEVICES }; 92 }; 93 static bool InitMeta(WaterVersionMetaData &metaData); 94 static WaterVersionMetaData Upgrade(const std::vector<std::string> &keys, const WaterVersionMetaData& meta); 95 static std::string Merge(const std::string &bundleName, const std::string &storeName); 96 static std::pair<std::string, std::string> Split(const std::string &key); 97 static void UpdateWaterVersion(WaterVersionMetaData &metaData); 98 static void SaveMatrix(const WaterVersionMetaData &metaData); 99 std::vector<WaterVersion> waterVersions_; 100 }; 101 } // namespace DistributedData 102 } // namespace OHOS 103 #endif //OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_WATER_MANAGER_H