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