1 /* 2 * Copyright (c) 2021 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 KVDB_SYNCABLE_TEST_H 17 #define KVDB_SYNCABLE_TEST_H 18 19 #include <map> 20 #include <mutex> 21 #include <vector> 22 23 #include "single_ver_kvdb_sync_interface.h" 24 #include "query_object.h" 25 #include "store_types.h" 26 27 namespace DistributedDB { 28 struct VirtualDataItem { 29 Key key; 30 Value value; 31 Timestamp timestamp = 0; 32 Timestamp writeTimestamp = 0; 33 uint64_t flag = 0; 34 bool isLocal = true; 35 uint32_t deviceId = 0; // 0: means local 36 static const uint64_t DELETE_FLAG = 0x01; 37 static const uint64_t LOCAL_FLAG = 0x02; 38 }; 39 40 struct VirtualContinueToken { 41 Timestamp begin = 0u; 42 Timestamp end = 0u; 43 }; 44 class VirtualSingleVerSyncDBInterface : public SingleVerKvDBSyncInterface { 45 public: 46 VirtualSingleVerSyncDBInterface(); 47 int GetInterfaceType() const override; 48 49 void IncRefCount() override; 50 51 void DecRefCount() override; 52 53 std::vector<uint8_t> GetIdentifier() const override; 54 55 int GetMetaData(const Key& key, Value& value) const override; 56 57 int PutMetaData(const Key& key, const Value& value, bool isInTransaction) override; 58 59 int DeleteMetaData(const std::vector<Key> &keys) override; 60 // Delete multiple meta data records with key prefix in a transaction. 61 int DeleteMetaDataByPrefixKey(const Key &keyPrefix) const override; 62 63 int GetAllMetaKeys(std::vector<Key>& keys) const override; 64 65 int GetSyncData(Timestamp begin, Timestamp end, std::vector<DataItem> &dataItems, 66 ContinueToken &continueStmtToken, const DataSizeSpecInfo &dataSizeInfo) const override; 67 68 int GetSyncDataNext(std::vector<DataItem> &dataItems, ContinueToken &continueStmtToken, 69 const DataSizeSpecInfo &dataSizeInfo) const override; 70 71 void ReleaseContinueToken(ContinueToken& continueStmtToken) const override; 72 73 void GetMaxTimestamp(Timestamp& stamp) const override; 74 75 int RemoveDeviceData(const std::string &deviceName, bool isNeedNotify) override; 76 77 int GetSyncData(const Key& key, VirtualDataItem& dataItem); 78 79 int PutSyncData(const DataItem& item); 80 81 int PutData(const Key &key, const Value &value, const Timestamp &time, int flag); 82 83 int GetSyncData(Timestamp begin, Timestamp end, std::vector<SingleVerKvEntry *> &entries, 84 ContinueToken &continueStmtToken, const DataSizeSpecInfo &dataSizeInfo) const override; 85 86 int GetSyncData(QueryObject &query, const SyncTimeRange &timeRange, const DataSizeSpecInfo &dataSizeInfo, 87 ContinueToken &continueStmtToken, std::vector<SingleVerKvEntry *> &entries) const override; 88 89 int GetUnSyncTotal(Timestamp begin, Timestamp end, uint32_t &total) const override; 90 91 int GetUnSyncTotal(QueryObject &query, const SyncTimeRange &timeRange, uint32_t &total) const override; 92 93 int GetSyncDataNext(std::vector<SingleVerKvEntry *> &entries, ContinueToken &continueStmtToken, 94 const DataSizeSpecInfo &dataSizeInfo) const override; 95 96 int PutSyncDataWithQuery(const QueryObject &query, const std::vector<SingleVerKvEntry *> &entries, 97 const std::string &deviceName) override; 98 99 SchemaObject GetSchemaInfo() const override; 100 101 bool CheckCompatible(const std::string& schema, uint8_t type) const override; 102 103 void SetSchemaInfo(const std::string& schema); 104 105 const KvDBProperties &GetDbProperties() const override; 106 107 void SetSaveDataDelayTime(uint64_t milliDelayTime); 108 109 int GetSecurityOption(SecurityOption &option) const override; 110 111 bool IsReadable() const override; 112 113 void SetSecurityOption(SecurityOption &option); 114 115 void NotifyRemotePushFinished(const std::string &targetId) const override; 116 117 int GetDatabaseCreateTimestamp(Timestamp &outTime) const override; 118 119 int GetCompressionOption(bool &needCompressOnSync, uint8_t &compressionRate) const override; 120 int GetCompressionAlgo(std::set<CompressAlgorithm> &algorithmSet) const override; 121 122 // return E_OK if subscribe is legal, ERROR on exception. 123 int CheckAndInitQueryCondition(QueryObject &query) const override; 124 125 int InterceptData(std::vector<SingleVerKvEntry *> &entries, const std::string &sourceID, 126 const std::string &targetID, bool isPush) const override; 127 128 int AddSubscribe(const std::string &subscribeId, const QueryObject &query, bool needCacheSubscribe) override; 129 130 int RemoveSubscribe(const std::string &subscribeId) override; 131 132 int RemoveSubscribe(const std::vector<std::string> &subscribeIds) override; 133 134 void SetBusy(bool busy, bool readBusy = false); 135 136 void PutDeviceData(const std::string &deviceName, const Key &key, const Value &value); 137 138 void GetDeviceData(const std::string &deviceName, const Key &key, Value &value); 139 140 void SetIdentifier(std::vector<uint8_t> &identifier); 141 142 void SetDbProperties(KvDBProperties &kvDBProperties); 143 144 void DelayGetSyncData(uint32_t milliDelayTime); 145 146 void SetGetDataErrCode(int whichTime, int errCode, bool isGetDataControl); 147 void ResetDataControl(); 148 149 void SetSaveDataCallback(const std::function<void()> &callback); 150 151 void ForkGetSecurityOption(std::function<int(SecurityOption &)> callBack); 152 153 void SetPushNotifier(const std::function<void(const std::string &)> &pushNotifier); 154 155 void SetCompressSync(bool compressSync); 156 private: 157 int GetSyncData(Timestamp begin, Timestamp end, const DataSizeSpecInfo &dataSizeInfo, 158 std::vector<VirtualDataItem> &dataItems, ContinueToken &continueStmtToken) const; 159 160 int GetSyncDataNext(std::vector<VirtualDataItem>& dataItems, 161 uint32_t blockSize, ContinueToken& continueStmtToken) const; 162 163 int PutSyncData(std::vector<VirtualDataItem>& dataItems, const std::string &deviceName); 164 165 int DataControl() const; 166 167 bool GetDataInner(Timestamp begin, Timestamp end, Timestamp ¤tWaterMark, 168 const DataSizeSpecInfo &dataSizeInfo, std::vector<VirtualDataItem> &dataItems) const; 169 170 mutable std::map<std::vector<uint8_t>, std::vector<uint8_t>> metadata_; 171 std::vector<VirtualDataItem> dbData_; 172 std::map<std::string, uint32_t> deviceMapping_; // key: deviceName, value: deviceId 173 uint32_t availableDeviceId_ = 0; 174 std::string schema_; 175 SchemaObject schemaObj_; 176 KvDBProperties properties_; 177 uint64_t saveDataDelayTime_ = 0; 178 SecurityOption secOption_; 179 bool busy_ = false; 180 bool readBusy_ = false; 181 182 std::mutex deviceDataLock_; 183 std::map<std::string, std::map<Key, Value>> deviceData_; 184 std::vector<uint8_t> identifier_; 185 uint64_t getDataDelayTime_ = 0; 186 uint64_t dbCreateTime_; 187 188 int countDown_ = -1; 189 int expectedErrCode_ = E_OK; 190 bool isGetDataControl_ = true; // control get data: true, control save data : false 191 192 std::mutex saveDataMutex_; 193 std::function<void()> saveDataCallback_; 194 195 std::function<int(SecurityOption &)> getSecurityOptionCallBack_; 196 197 mutable std::mutex pushNotifierMutex_; 198 std::function<void(const std::string &)> pushNotifier_; 199 200 bool compressSync_ = false; 201 }; 202 } // namespace DistributedDB 203 204 #endif // KVDB_SYNCABLE_TEST_H