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 class VirtualSingleVerSyncDBInterface : public SingleVerKvDBSyncInterface { 40 public: 41 VirtualSingleVerSyncDBInterface(); 42 int GetInterfaceType() const override; 43 44 void IncRefCount() override; 45 46 void DecRefCount() override; 47 48 std::vector<uint8_t> GetIdentifier() const override; 49 50 int GetMetaData(const Key& key, Value& value) const override; 51 52 int PutMetaData(const Key& key, const Value& value) override; 53 54 int DeleteMetaData(const std::vector<Key> &keys) override; 55 // Delete multiple meta data records with key prefix in a transaction. 56 int DeleteMetaDataByPrefixKey(const Key &keyPrefix) const override; 57 58 int GetAllMetaKeys(std::vector<Key>& keys) const override; 59 60 int GetSyncData(Timestamp begin, Timestamp end, std::vector<DataItem> &dataItems, 61 ContinueToken &continueStmtToken, const DataSizeSpecInfo &dataSizeInfo) const override; 62 63 int GetSyncDataNext(std::vector<DataItem> &dataItems, ContinueToken &continueStmtToken, 64 const DataSizeSpecInfo &dataSizeInfo) const override; 65 66 void ReleaseContinueToken(ContinueToken& continueStmtToken) const override; 67 68 void GetMaxTimestamp(Timestamp& stamp) const override; 69 70 int RemoveDeviceData(const std::string &deviceName, bool isNeedNotify) override; 71 72 int GetSyncData(const Key& key, VirtualDataItem& dataItem); 73 74 int PutSyncData(const DataItem& item); 75 76 int PutData(const Key &key, const Value &value, const Timestamp &time, int flag); 77 78 int GetSyncData(Timestamp begin, Timestamp end, std::vector<SingleVerKvEntry *> &entries, 79 ContinueToken &continueStmtToken, const DataSizeSpecInfo &dataSizeInfo) const override; 80 81 int GetSyncData(QueryObject &query, const SyncTimeRange &timeRange, const DataSizeSpecInfo &dataSizeInfo, 82 ContinueToken &continueStmtToken, std::vector<SingleVerKvEntry *> &entries) const override; 83 84 int GetSyncDataNext(std::vector<SingleVerKvEntry *> &entries, ContinueToken &continueStmtToken, 85 const DataSizeSpecInfo &dataSizeInfo) const override; 86 87 int PutSyncDataWithQuery(const QueryObject &query, const std::vector<SingleVerKvEntry *> &entries, 88 const std::string &deviceName) override; 89 90 SchemaObject GetSchemaInfo() const override; 91 92 bool CheckCompatible(const std::string& schema, uint8_t type) const override; 93 94 void SetSchemaInfo(const std::string& schema); 95 96 const KvDBProperties &GetDbProperties() const override; 97 98 void SetSaveDataDelayTime(uint64_t milliDelayTime); 99 100 int GetSecurityOption(SecurityOption &option) const override; 101 102 bool IsReadable() const override; 103 104 void SetSecurityOption(SecurityOption &option); 105 106 void NotifyRemotePushFinished(const std::string &targetId) const override; 107 108 int GetDatabaseCreateTimestamp(Timestamp &outTime) const override; 109 110 int GetCompressionOption(bool &needCompressOnSync, uint8_t &compressionRate) const override; 111 int GetCompressionAlgo(std::set<CompressAlgorithm> &algorithmSet) const override; 112 113 // return E_OK if subscribe is legal, ERROR on exception. 114 int CheckAndInitQueryCondition(QueryObject &query) const override; 115 116 int InterceptData(std::vector<SingleVerKvEntry *> &entries, const std::string &sourceID, 117 const std::string &targetID) const override; 118 119 int AddSubscribe(const std::string &subscribeId, const QueryObject &query, bool needCacheSubscribe) override; 120 121 int RemoveSubscribe(const std::string &subscribeId) override; 122 123 int RemoveSubscribe(const std::vector<std::string> &subscribeIds) override; 124 125 void SetBusy(bool busy); 126 127 void PutDeviceData(const std::string &deviceName, const Key &key, const Value &value); 128 129 void GetDeviceData(const std::string &deviceName, const Key &key, Value &value); 130 131 void SetIdentifier(std::vector<uint8_t> &identifier); 132 133 void SetDbProperties(KvDBProperties &kvDBProperties); 134 135 void DelayGetSyncData(uint32_t milliDelayTime); 136 137 void SetGetDataErrCode(int whichTime, int errCode, bool isGetDataControl); 138 void ResetDataControl(); 139 private: 140 int GetSyncData(Timestamp begin, Timestamp end, uint32_t blockSize, std::vector<VirtualDataItem>& dataItems, 141 ContinueToken& continueStmtToken) const; 142 143 int GetSyncDataNext(std::vector<VirtualDataItem>& dataItems, 144 uint32_t blockSize, ContinueToken& continueStmtToken) const; 145 146 int PutSyncData(std::vector<VirtualDataItem>& dataItems, const std::string &deviceName); 147 148 int DataControl() const; 149 150 mutable std::map<std::vector<uint8_t>, std::vector<uint8_t>> metadata_; 151 std::vector<VirtualDataItem> dbData_; 152 std::map<std::string, uint32_t> deviceMapping_; // key: deviceName, value: deviceId 153 uint32_t availableDeviceId_ = 0; 154 std::string schema_; 155 SchemaObject schemaObj_; 156 KvDBProperties properties_; 157 uint64_t saveDataDelayTime_ = 0; 158 SecurityOption secOption_; 159 bool busy_ = false; 160 161 std::mutex deviceDataLock_; 162 std::map<std::string, std::map<Key, Value>> deviceData_; 163 std::vector<uint8_t> identifier_; 164 uint64_t getDataDelayTime_ = 0; 165 uint64_t dbCreateTime_; 166 167 int countDown_ = -1; 168 int expectedErrCode_ = E_OK; 169 bool isGetDataControl_ = true; // control get data: true, control save data : false 170 }; 171 } // namespace DistributedDB 172 173 #endif // KVDB_SYNCABLE_TEST_H