1 /* 2 * Copyright (c) 2022 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 DISTRIBUTEDDATASERVICE_RDB_SERVICE_H 17 #define DISTRIBUTEDDATASERVICE_RDB_SERVICE_H 18 19 #include <map> 20 #include <mutex> 21 #include <string> 22 23 #include "cloud/cloud_event.h" 24 #include "commonevent/data_change_event.h" 25 #include "commonevent/set_searchable_event.h" 26 #include "concurrent_map.h" 27 #include "feature/static_acts.h" 28 #include "metadata/secret_key_meta_data.h" 29 #include "metadata/store_meta_data.h" 30 #include "rdb_notifier_proxy.h" 31 #include "rdb_query.h" 32 #include "rdb_service_stub.h" 33 #include "rdb_watcher.h" 34 #include "snapshot/bind_event.h" 35 #include "store/auto_cache.h" 36 #include "store/general_store.h" 37 #include "store/general_value.h" 38 #include "store_observer.h" 39 #include "visibility.h" 40 #include "process_communicator_impl.h" 41 42 namespace OHOS::DistributedRdb { 43 using namespace OHOS::AppDistributedKv; 44 class RdbServiceImpl : public RdbServiceStub { 45 public: 46 using StoreMetaData = OHOS::DistributedData::StoreMetaData; 47 using SecretKeyMetaData = DistributedData::SecretKeyMetaData; 48 using DetailAsync = DistributedData::GeneralStore::DetailAsync; 49 using Database = DistributedData::Database; 50 using Handler = std::function<void(int, std::map<std::string, std::vector<std::string>> &)>; 51 using StoreInfo = DistributedData::StoreInfo; 52 RdbServiceImpl(); 53 virtual ~RdbServiceImpl(); 54 55 /* IPC interface */ 56 std::string ObtainDistributedTableName(const std::string& device, const std::string& table) override; 57 58 int32_t InitNotifier(const RdbSyncerParam ¶m, sptr<IRemoteObject> notifier) override; 59 60 int32_t SetDistributedTables(const RdbSyncerParam ¶m, const std::vector<std::string> &tables, 61 const std::vector<Reference> &references, bool isRebuild, int32_t type = DISTRIBUTED_DEVICE) override; 62 63 std::pair<int32_t, std::shared_ptr<ResultSet>> RemoteQuery(const RdbSyncerParam& param, const std::string& device, 64 const std::string& sql, const std::vector<std::string>& selectionArgs) override; 65 66 int32_t Sync(const RdbSyncerParam ¶m, const Option &option, const PredicatesMemo &predicates, 67 const AsyncDetail &async) override; 68 69 int32_t Subscribe(const RdbSyncerParam ¶m, const SubscribeOption &option, RdbStoreObserver *observer) override; 70 71 int32_t UnSubscribe(const RdbSyncerParam ¶m, const SubscribeOption &option, 72 RdbStoreObserver *observer) override; 73 74 int32_t RegisterAutoSyncCallback(const RdbSyncerParam& param, 75 std::shared_ptr<DetailProgressObserver> observer) override; 76 77 int32_t UnregisterAutoSyncCallback(const RdbSyncerParam& param, 78 std::shared_ptr<DetailProgressObserver> observer) override; 79 80 int32_t ResolveAutoLaunch(const std::string &identifier, DistributedDB::AutoLaunchParam ¶m) override; 81 82 int32_t OnAppExit(pid_t uid, pid_t pid, uint32_t tokenId, const std::string &bundleName) override; 83 84 int32_t Delete(const RdbSyncerParam ¶m) override; 85 86 std::pair<int32_t, std::shared_ptr<ResultSet>> QuerySharingResource(const RdbSyncerParam& param, 87 const PredicatesMemo& predicates, const std::vector<std::string>& columns) override; 88 89 int32_t OnBind(const BindInfo &bindInfo) override; 90 91 int32_t OnReady(const std::string &device) override; 92 93 int32_t OnInitialize() override; 94 95 int32_t NotifyDataChange(const RdbSyncerParam ¶m, const RdbChangedData &rdbChangedData, 96 const RdbNotifyConfig &rdbNotifyConfig) override; 97 int32_t SetSearchable(const RdbSyncerParam& param, bool isSearchable) override; 98 int32_t Disable(const RdbSyncerParam& param) override; 99 int32_t Enable(const RdbSyncerParam& param) override; 100 101 int32_t BeforeOpen(RdbSyncerParam ¶m) override; 102 103 int32_t AfterOpen(const RdbSyncerParam ¶m) override; 104 105 int32_t ReportStatistic(const RdbSyncerParam ¶m, const RdbStatEvent &statEvent) override; 106 107 int32_t GetPassword(const RdbSyncerParam ¶m, std::vector<std::vector<uint8_t>> &password) override; 108 109 std::pair<int32_t, uint32_t> LockCloudContainer(const RdbSyncerParam ¶m) override; 110 111 int32_t UnlockCloudContainer(const RdbSyncerParam ¶m) override; 112 113 int32_t GetDebugInfo(const RdbSyncerParam ¶m, std::map<std::string, RdbDebugInfo> &debugInfo) override; 114 115 int32_t GetDfxInfo(const RdbSyncerParam ¶m, DistributedRdb::RdbDfxInfo &dfxInfo) override; 116 117 int32_t VerifyPromiseInfo(const RdbSyncerParam ¶m) override; 118 119 private: 120 using Watchers = DistributedData::AutoCache::Watchers; 121 using StaticActs = DistributedData::StaticActs; 122 using DBStatus = DistributedDB::DBStatus; 123 using SyncResult = std::pair<std::vector<std::string>, std::map<std::string, DBStatus>>; 124 using AutoCache = DistributedData::AutoCache; 125 struct SyncAgent { 126 SyncAgent() = default; 127 explicit SyncAgent(const std::string &bundleName); 128 int32_t count_ = 0; 129 std::map<std::string, int> callBackStores_; 130 std::string bundleName_; 131 sptr<RdbNotifierProxy> notifier_ = nullptr; 132 std::shared_ptr<RdbWatcher> watcher_ = nullptr; 133 void SetNotifier(sptr<RdbNotifierProxy> notifier); 134 void SetWatcher(std::shared_ptr<RdbWatcher> watcher); 135 }; 136 using SyncAgents = std::map<int32_t, SyncAgent>; 137 138 class RdbStatic : public StaticActs { 139 public: ~RdbStatic()140 ~RdbStatic() override {}; 141 int32_t OnAppUninstall(const std::string &bundleName, int32_t user, int32_t index) override; 142 int32_t OnAppUpdate(const std::string &bundleName, int32_t user, int32_t index) override; 143 int32_t OnClearAppStorage(const std::string &bundleName, int32_t user, int32_t index, int32_t tokenId) override; 144 private: 145 static constexpr inline int32_t INVALID_TOKENID = 0; 146 int32_t CloseStore(const std::string &bundleName, int32_t user, int32_t index, 147 int32_t tokenId = INVALID_TOKENID) const; 148 }; 149 150 class Factory { 151 public: 152 Factory(); 153 ~Factory(); 154 private: 155 std::shared_ptr<RdbServiceImpl> product_; 156 std::shared_ptr<RdbStatic> staticActs_; 157 }; 158 159 static constexpr inline uint32_t WAIT_TIME = 30 * 1000; 160 static constexpr inline uint32_t SHARE_WAIT_TIME = 60; // seconds 161 162 void RegisterRdbServiceInfo(); 163 164 void RegisterHandler(); 165 166 void DumpRdbServiceInfo(int fd, std::map<std::string, std::vector<std::string>> ¶ms); 167 168 void DoCloudSync(const RdbSyncerParam ¶m, const Option &option, const PredicatesMemo &predicates, 169 const AsyncDetail &async); 170 171 void DoCompensateSync(const DistributedData::BindEvent& event); 172 173 int DoSync(const RdbSyncerParam ¶m, const Option &option, const PredicatesMemo &predicates, 174 const AsyncDetail &async); 175 176 int DoAutoSync( 177 const std::vector<std::string> &devices, const Database &dataBase, std::vector<std::string> tableNames); 178 179 std::vector<std::string> GetReuseDevice(const std::vector<std::string> &devices); 180 int DoOnlineSync(const std::vector<std::string> &devices, const Database &dataBase); 181 182 int DoDataChangeSync(const StoreInfo &storeInfo, const RdbChangedData &rdbChangedData); 183 184 Watchers GetWatchers(uint32_t tokenId, const std::string &storeName); 185 186 DetailAsync GetCallbacks(uint32_t tokenId, const std::string &storeName); 187 188 bool CheckAccess(const std::string& bundleName, const std::string& storeName); 189 190 std::shared_ptr<DistributedData::GeneralStore> GetStore(const RdbSyncerParam& param); 191 192 std::shared_ptr<DistributedData::GeneralStore> GetStore(const StoreMetaData &storeMetaData); 193 194 void OnAsyncComplete(uint32_t tokenId, pid_t pid, uint32_t seqNum, Details &&result); 195 196 StoreMetaData GetStoreMetaData(const RdbSyncerParam ¶m); 197 198 StoreMetaData GetStoreMetaData(const Database &dataBase); 199 200 int32_t SetSecretKey(const RdbSyncerParam ¶m, const StoreMetaData &meta); 201 202 int32_t Upgrade(const RdbSyncerParam ¶m, const StoreMetaData &old); 203 204 std::pair<int32_t, std::shared_ptr<DistributedData::Cursor>> AllocResource( 205 StoreInfo& storeInfo, std::shared_ptr<RdbQuery> rdbQuery); 206 207 static Details HandleGenDetails(const DistributedData::GenDetails &details); 208 209 static std::string TransferStringToHex(const std::string& origStr); 210 211 static std::string RemoveSuffix(const std::string& name); 212 213 static std::pair<int32_t, int32_t> GetInstIndexAndUser(uint32_t tokenId, const std::string &bundleName); 214 215 static std::string GetSubUser(const int32_t subUser); 216 217 static bool GetDBPassword(const StoreMetaData &metaData, DistributedDB::CipherPassword &password); 218 219 static bool SaveAppIDMeta(const StoreMetaData &meta, const StoreMetaData &old); 220 221 void GetSchema(const RdbSyncerParam ¶m); 222 223 void SetReturnParam(StoreMetaData &metadata, RdbSyncerParam ¶m); 224 225 bool IsNeedMetaSync(const StoreMetaData &meta, const std::vector<std::string> &uuids); 226 227 SyncResult ProcessResult(const std::map<std::string, int32_t> &results); 228 229 StoreInfo GetStoreInfo(const RdbSyncerParam ¶m); 230 231 int32_t SaveDebugInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); 232 233 int32_t SaveDfxInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); 234 235 int32_t SavePromiseInfo(const StoreMetaData &metaData, const RdbSyncerParam ¶m); 236 237 int32_t PostSearchEvent(int32_t evtId, const RdbSyncerParam& param, 238 DistributedData::SetSearchableEvent::EventInfo &eventInfo); 239 240 bool IsPostImmediately(const int32_t callingPid, const RdbNotifyConfig &rdbNotifyConfig, StoreInfo &storeInfo, 241 DistributedData::DataChangeEvent::EventInfo &eventInfo, const std::string &storeName); 242 void UpdateMeta(const StoreMetaData &meta, const StoreMetaData &localMeta, AutoCache::Store store); 243 244 bool UpgradeCloneSecretKey(const StoreMetaData &meta); 245 246 static Factory factory_; 247 ConcurrentMap<uint32_t, SyncAgents> syncAgents_; 248 std::shared_ptr<ExecutorPool> executors_; 249 ConcurrentMap<int32_t, std::map<std::string, ExecutorPool::TaskId>> heartbeatTaskIds_; 250 }; 251 } // namespace OHOS::DistributedRdb 252 #endif