• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H
17 #define OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H
18 #include <set>
19 #include <vector>
20 
21 #include "concurrent_map.h"
22 #include "device_matrix.h"
23 #include "kv_store_delegate_manager.h"
24 #include "kv_store_nb_delegate.h"
25 #include "kvdb_notifier_proxy.h"
26 #include "kvdb_service_stub.h"
27 #include "kvdb_watcher.h"
28 #include "kvstore_sync_manager.h"
29 #include "metadata/meta_data_manager.h"
30 #include "metadata/store_meta_data.h"
31 #include "metadata/store_meta_data_local.h"
32 #include "metadata/strategy_meta_data.h"
33 #include "store/auto_cache.h"
34 #include "store/general_value.h"
35 #include "utils/ref_count.h"
36 namespace OHOS::DistributedKv {
37 class KVDBServiceImpl final : public KVDBServiceStub {
38 public:
39     using DBLaunchParam = DistributedDB::AutoLaunchParam;
40     using Handler = std::function<void(int, std::map<std::string, std::vector<std::string>> &)>;
41     using RefCount = DistributedData::RefCount;
42     using StoreMetaData = OHOS::DistributedData::StoreMetaData;
43     KVDBServiceImpl();
44     virtual ~KVDBServiceImpl();
45     Status GetStoreIds(const AppId &appId, int32_t subUser, std::vector<StoreId> &storeIds) override;
46     Status BeforeCreate(const AppId &appId, const StoreId &storeId, const Options &options) override;
47     Status AfterCreate(const AppId &appId, const StoreId &storeId, const Options &options,
48         const std::vector<uint8_t> &password) override;
49     Status Delete(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
50     Status Close(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
51     Status CloudSync(const AppId &appId, const StoreId &storeId, const SyncInfo &syncInfo) override;
52     Status Sync(const AppId &appId, const StoreId &storeId, int32_t subUser, SyncInfo &syncInfo) override;
53     Status RegServiceNotifier(const AppId &appId, sptr<IKVDBNotifier> notifier) override;
54     Status UnregServiceNotifier(const AppId &appId) override;
55     Status SetSyncParam(const AppId &appId, const StoreId &storeId, int32_t subUser,
56         const KvSyncParam &syncParam) override;
57     Status GetSyncParam(const AppId &appId, const StoreId &storeId, int32_t subUser, KvSyncParam &syncParam) override;
58     Status EnableCapability(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
59     Status DisableCapability(const AppId &appId, const StoreId &storeId, int32_t subUser) override;
60     Status SetCapability(const AppId &appId, const StoreId &storeId, int32_t subUser,
61         const std::vector<std::string> &local, const std::vector<std::string> &remote) override;
62     Status AddSubscribeInfo(const AppId &appId, const StoreId &storeId, int32_t subUser,
63         const SyncInfo &syncInfo) override;
64     Status RmvSubscribeInfo(const AppId &appId, const StoreId &storeId, int32_t subUser,
65         const SyncInfo &syncInfo) override;
66     Status Subscribe(const AppId &appId, const StoreId &storeId, int32_t subUser,
67         sptr<IKvStoreObserver> observer) override;
68     Status Unsubscribe(const AppId &appId, const StoreId &storeId, int32_t subUser,
69         sptr<IKvStoreObserver> observer) override;
70     Status GetBackupPassword(const AppId &appId, const StoreId &storeId, int32_t subUser,
71         std::vector<std::vector<uint8_t>> &passwords, int32_t passwordType) override;
72     Status NotifyDataChange(const AppId &appId, const StoreId &storeId, uint64_t delay) override;
73     Status PutSwitch(const AppId &appId, const SwitchData &data) override;
74     Status GetSwitch(const AppId &appId, const std::string &networkId, SwitchData &data) override;
75     Status SubscribeSwitchData(const AppId &appId) override;
76     Status UnsubscribeSwitchData(const AppId &appId) override;
77     Status SetConfig(const AppId &appId, const StoreId &storeId, const StoreConfig &storeConfig) override;
78     int32_t OnBind(const BindInfo &bindInfo) override;
79     int32_t OnInitialize() override;
80     int32_t OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &appId) override;
81     int32_t ResolveAutoLaunch(const std::string &identifier, DBLaunchParam &param) override;
82     int32_t OnUserChange(uint32_t code, const std::string &user, const std::string &account) override;
83     Status RemoveDeviceData(const AppId &appId, const StoreId &storeId, int32_t subUser,
84         const std::string &device) override;
85 
86 private:
87     using StrategyMeta = OHOS::DistributedData::StrategyMeta;
88     using StoreMetaDataLocal = OHOS::DistributedData::StoreMetaDataLocal;
89     using ChangeType = OHOS::DistributedData::DeviceMatrix::ChangeType;
90     using DBStore = DistributedDB::KvStoreNbDelegate;
91     using DBManager = DistributedDB::KvStoreDelegateManager;
92     using SyncEnd = KvStoreSyncManager::SyncEnd;
93     using DBResult = std::map<std::string, DistributedDB::DBStatus>;
94     using DBStatus = DistributedDB::DBStatus;
95     using DBMode = DistributedDB::SyncMode;
96     using Action = OHOS::DistributedData::MetaDataManager::Action;
97     using GeneralError = DistributedData::GeneralError;
98     enum SyncAction {
99         ACTION_SYNC,
100         ACTION_SUBSCRIBE,
101         ACTION_UNSUBSCRIBE,
102     };
103     struct SyncAgent {
104         pid_t pid_ = 0;
105         int32_t switchesObserverCount_ = 0;
106         bool staticsChanged_ = false;
107         bool dynamicChanged_ = false;
108         AppId appId_;
109         sptr<IKVDBNotifier> notifier_;
110         std::map<std::string, uint32_t> delayTimes_;
111         std::map<std::string, std::set<std::shared_ptr<KVDBWatcher>>> watchers_;
112         void ReInit(pid_t pid, const AppId &appId);
113     };
114     class Factory {
115     public:
116         Factory();
117         ~Factory();
118 
119     private:
120         std::shared_ptr<KVDBServiceImpl> product_;
121     };
122 
123     void Init();
124     void AddOptions(const Options &options, StoreMetaData &metaData);
125     StoreMetaData GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0);
126     StoreMetaData GetDistributedDataMeta(const std::string &deviceId);
127     StrategyMeta GetStrategyMeta(const AppId &appId, const StoreId &storeId, int32_t subUser = 0);
128     int32_t GetInstIndex(uint32_t tokenId, const AppId &appId);
129     bool IsNeedMetaSync(const StoreMetaData &meta, const std::vector<std::string> &uuids);
130     Status DoCloudSync(const StoreMetaData &meta, const SyncInfo &syncInfo);
131     void DoCloudSync(bool statics, bool dynamic);
132     Status DoSync(const StoreMetaData &meta, const SyncInfo &info, const SyncEnd &complete, int32_t type);
133     Status DoSyncInOrder(const StoreMetaData &meta, const SyncInfo &info, const SyncEnd &complete, int32_t type);
134     Status DoSyncBegin(const std::vector<std::string> &devices, const StoreMetaData &meta, const SyncInfo &info,
135         const SyncEnd &complete, int32_t type);
136     Status DoComplete(const StoreMetaData &meta, const SyncInfo &info, RefCount refCount, const DBResult &dbResult);
137     uint32_t GetSyncDelayTime(uint32_t delay, const StoreId &storeId, const std::string &subUser = "");
138     Status ConvertDbStatus(DBStatus status) const;
139     Status ConvertGeneralErr(GeneralError error) const;
140     DBMode ConvertDBMode(SyncMode syncMode) const;
141     ChangeType ConvertType(SyncMode syncMode) const;
142     SwitchState ConvertAction(Action action) const;
143     SyncMode GetSyncMode(bool local, bool remote) const;
144     std::vector<std::string> ConvertDevices(const std::vector<std::string> &deviceIds) const;
145     DistributedData::GeneralStore::SyncMode ConvertGeneralSyncMode(SyncMode syncMode, SyncAction syncAction) const;
146     DBResult HandleGenBriefDetails(const DistributedData::GenDetails &details);
147     ProgressDetail HandleGenDetails(const DistributedData::GenDetails &details);
148     void OnAsyncComplete(uint32_t tokenId, uint64_t seqNum, ProgressDetail &&detail);
149     DistributedData::AutoCache::Watchers GetWatchers(uint32_t tokenId, const std::string &storeId,
150         const std::string &userId);
151     using SyncResult = std::pair<std::vector<std::string>, std::map<std::string, DBStatus>>;
152     SyncResult ProcessResult(const std::map<std::string, int32_t> &results);
153     void SaveLocalMetaData(const Options &options, const StoreMetaData &metaData);
154     void RegisterKvServiceInfo();
155     void RegisterHandler();
156     void DumpKvServiceInfo(int fd, std::map<std::string, std::vector<std::string>> &params);
157     void TryToSync(const StoreMetaData &metaData, bool force = false);
158     bool IsRemoteChange(const StoreMetaData &metaData, const std::string &device);
159     bool IsOHOSType(const std::vector<std::string> &ids);
160     Status ConvertDbStatusNative(DBStatus status);
161     bool CompareTripleIdentifier(const std::string &accountId, const std::string &identifier,
162         const StoreMetaData &storeMeta);
163     std::string GenerateKey(const std::string &userId, const std::string &storeId) const;
164     static Factory factory_;
165     ConcurrentMap<uint32_t, SyncAgent> syncAgents_;
166     std::shared_ptr<ExecutorPool> executors_;
167     std::atomic_uint64_t syncId_ = 0;
168     static constexpr int32_t OH_OS_TYPE = 10;
169 };
170 } // namespace OHOS::DistributedKv
171 #endif // OHOS_DISTRIBUTED_DATA_SERVICE_KVDB_SERVICE_IMPL_H