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 #ifndef OMIT_MULTI_VER
16 #include "virtual_multi_ver_sync_db_interface.h"
17 
18 #include "db_common.h"
19 #include "kvdb_manager.h"
20 #include "multi_ver_natural_store_snapshot.h"
21 
22 namespace DistributedDB {
VirtualMultiVerSyncDBInterface()23 VirtualMultiVerSyncDBInterface::VirtualMultiVerSyncDBInterface() : kvStore_(nullptr), connection_(nullptr)
24 {
25 }
26 
~VirtualMultiVerSyncDBInterface()27 VirtualMultiVerSyncDBInterface::~VirtualMultiVerSyncDBInterface()
28 {
29     DeleteDatabase();
30 }
31 
GetInterfaceType() const32 int VirtualMultiVerSyncDBInterface::GetInterfaceType() const
33 {
34     return IKvDBSyncInterface::SYNC_MVD;
35 }
36 
IncRefCount()37 void VirtualMultiVerSyncDBInterface::IncRefCount()
38 {
39     kvStore_->IncRefCount();
40 }
41 
DecRefCount()42 void VirtualMultiVerSyncDBInterface::DecRefCount()
43 {
44     kvStore_->DecRefCount();
45 }
46 
GetIdentifier() const47 std::vector<uint8_t> VirtualMultiVerSyncDBInterface::GetIdentifier() const
48 {
49     return kvStore_->GetIdentifier();
50 }
51 
GetMaxTimestamp(Timestamp & stamp) const52 void VirtualMultiVerSyncDBInterface::GetMaxTimestamp(Timestamp &stamp) const
53 {
54     return kvStore_->GetMaxTimestamp(stamp);
55 }
56 
GetMetaData(const Key & key,Value & value) const57 int VirtualMultiVerSyncDBInterface::GetMetaData(const Key &key, Value &value) const
58 {
59     return kvStore_->GetMetaData(key, value);
60 }
61 
PutMetaData(const Key & key,const Value & value,bool isInTransaction)62 int VirtualMultiVerSyncDBInterface::PutMetaData(const Key &key, const Value &value, bool isInTransaction)
63 {
64     return kvStore_->PutMetaData(key, value, isInTransaction);
65 }
66 
DeleteMetaData(const std::vector<Key> & keys)67 int VirtualMultiVerSyncDBInterface::DeleteMetaData(const std::vector<Key> &keys)
68 {
69     return kvStore_->DeleteMetaData(keys);
70 }
71 
GetAllMetaKeys(std::vector<Key> & keys) const72 int VirtualMultiVerSyncDBInterface::GetAllMetaKeys(std::vector<Key> &keys) const
73 {
74     return kvStore_->GetAllMetaKeys(keys);
75 }
76 
IsCommitExisted(const MultiVerCommitNode & commit) const77 bool VirtualMultiVerSyncDBInterface::IsCommitExisted(const MultiVerCommitNode &commit) const
78 {
79     return kvStore_->IsCommitExisted(commit);
80 }
81 
GetDeviceLatestCommit(std::map<std::string,MultiVerCommitNode> & commits) const82 int VirtualMultiVerSyncDBInterface::GetDeviceLatestCommit(std::map<std::string, MultiVerCommitNode> &commits) const
83 {
84     return kvStore_->GetDeviceLatestCommit(commits);
85 }
86 
GetCommitTree(const std::map<std::string,MultiVerCommitNode> & inCommit,std::vector<MultiVerCommitNode> & outCommit) const87 int VirtualMultiVerSyncDBInterface::GetCommitTree(const std::map<std::string, MultiVerCommitNode> &inCommit,
88     std::vector<MultiVerCommitNode> &outCommit) const
89 {
90     return kvStore_->GetCommitTree(inCommit, outCommit);
91 }
92 
GetCommitData(const MultiVerCommitNode & commit,std::vector<MultiVerKvEntry * > & entries) const93 int VirtualMultiVerSyncDBInterface::GetCommitData(const MultiVerCommitNode &commit,
94     std::vector<MultiVerKvEntry *> &entries) const
95 {
96     return kvStore_->GetCommitData(commit, entries);
97 }
98 
CreateKvEntry(const std::vector<uint8_t> & entries)99 MultiVerKvEntry *VirtualMultiVerSyncDBInterface::CreateKvEntry(const std::vector<uint8_t> &entries)
100 {
101     return kvStore_->CreateKvEntry(entries);
102 }
103 
ReleaseKvEntry(const MultiVerKvEntry * entry)104 void VirtualMultiVerSyncDBInterface::ReleaseKvEntry(const MultiVerKvEntry *entry)
105 {
106     return kvStore_->ReleaseKvEntry(entry);
107 }
108 
IsValueSliceExisted(const ValueSliceHash & value) const109 bool VirtualMultiVerSyncDBInterface::IsValueSliceExisted(const ValueSliceHash &value) const
110 {
111     return kvStore_->IsValueSliceExisted(value);
112 }
113 
GetValueSlice(const ValueSliceHash & hashValue,ValueSlice & sliceValue) const114 int VirtualMultiVerSyncDBInterface::GetValueSlice(const ValueSliceHash &hashValue, ValueSlice &sliceValue) const
115 {
116     return kvStore_->GetValueSlice(hashValue, sliceValue);
117 }
118 
PutValueSlice(const ValueSliceHash & hashValue,const ValueSlice & sliceValue) const119 int VirtualMultiVerSyncDBInterface::PutValueSlice(const ValueSliceHash &hashValue, const ValueSlice &sliceValue) const
120 {
121     return kvStore_->PutValueSlice(hashValue, sliceValue);
122 }
123 
PutCommitData(const MultiVerCommitNode & commit,const std::vector<MultiVerKvEntry * > & entries,const std::string & deviceName)124 int VirtualMultiVerSyncDBInterface::PutCommitData(const MultiVerCommitNode &commit,
125     const std::vector<MultiVerKvEntry *> &entries, const std::string &deviceName)
126 {
127     return kvStore_->PutCommitData(commit, entries, deviceName);
128 }
129 
MergeSyncCommit(const MultiVerCommitNode & commit,const std::vector<MultiVerCommitNode> & commits)130 int VirtualMultiVerSyncDBInterface::MergeSyncCommit(const MultiVerCommitNode &commit,
131     const std::vector<MultiVerCommitNode> &commits)
132 {
133     return kvStore_->MergeSyncCommit(commit, commits);
134 }
135 
TransferSyncCommitDevInfo(MultiVerCommitNode & commit,const std::string & devId,bool isSyncedIn) const136 int VirtualMultiVerSyncDBInterface::TransferSyncCommitDevInfo(MultiVerCommitNode &commit, const std::string &devId,
137     bool isSyncedIn) const
138 {
139     return kvStore_->TransferSyncCommitDevInfo(commit, devId, isSyncedIn);
140 }
141 
Initialize(const std::string & deviceId)142 int VirtualMultiVerSyncDBInterface::Initialize(const std::string &deviceId)
143 {
144     std::string dir;
145     testTool_.TestDirInit(dir);
146     KvDBProperties prop;
147     prop.SetStringProp(KvDBProperties::USER_ID, "sync_test");
148     prop.SetStringProp(KvDBProperties::APP_ID, "sync_test");
149     prop.SetStringProp(KvDBProperties::STORE_ID, deviceId);
150     std::string identifier = DBCommon::TransferHashString("sync_test-sync_test-" + deviceId);
151 
152     prop.SetStringProp(KvDBProperties::IDENTIFIER_DATA, identifier);
153     std::string identifierDir = DBCommon::TransferStringToHex(identifier);
154     prop.SetStringProp(KvDBProperties::IDENTIFIER_DIR, identifierDir);
155     prop.SetStringProp(KvDBProperties::DATA_DIR, dir + "/commitstore");
156     prop.SetIntProp(KvDBProperties::DATABASE_TYPE, KvDBProperties::MULTI_VER_TYPE_SQLITE);
157     prop.SetBoolProp(KvDBProperties::CREATE_IF_NECESSARY, true);
158 
159     int errCode = E_OK;
160     IKvDB *kvDB = KvDBManager::OpenDatabase(prop, errCode);
161     if (errCode != E_OK) {
162         LOGE("[VirtualMultiVerSyncDBInterface] db create failed path, err %d", errCode);
163         return errCode;
164     }
165     kvStore_ = static_cast<MultiVerNaturalStore *>(kvDB);
166     IKvDBConnection *conn = kvDB->GetDBConnection(errCode);
167     if (errCode != E_OK) {
168         LOGE("[VirtualMultiVerSyncDBInterface] connection get failed path, err %d", errCode);
169         RefObject::DecObjRef(kvStore_);
170         kvStore_ = nullptr;
171         return errCode;
172     }
173     RefObject::DecObjRef(kvStore_);
174     connection_ = static_cast<MultiVerNaturalStoreConnection *>(conn);
175     return E_OK;
176 }
177 
GetData(const Key & key,Key & value)178 int VirtualMultiVerSyncDBInterface::GetData(const Key &key, Key &value)
179 {
180     IKvDBSnapshot *snapshot = nullptr;
181     int errCode = connection_->GetSnapshot(snapshot);
182     if (errCode != E_OK) {
183         LOGE("[VirtualMultiVerSyncDBInterface] GetSnapshot failed err %d", errCode);
184         return errCode;
185     }
186     errCode = snapshot->Get(key, value);
187     connection_->ReleaseSnapshot(snapshot);
188     return errCode;
189 }
190 
PutData(const Key & key,const Key & value)191 int VirtualMultiVerSyncDBInterface::PutData(const Key &key, const Key &value)
192 {
193     IOption option;
194     return connection_->Put(option, key, value);
195 }
196 
DeleteData(const Key & key)197 int VirtualMultiVerSyncDBInterface::DeleteData(const Key &key)
198 {
199     IOption option;
200     return connection_->Delete(option, key);
201 }
202 
StartTransaction()203 int VirtualMultiVerSyncDBInterface::StartTransaction()
204 {
205     return connection_->StartTransaction();
206 }
207 
Commit()208 int VirtualMultiVerSyncDBInterface::Commit()
209 {
210     return connection_->Commit();
211 }
212 
DeleteDatabase()213 int VirtualMultiVerSyncDBInterface::DeleteDatabase()
214 {
215     if (connection_ != nullptr) {
216         KvDBProperties prop = kvStore_->GetMyProperties();
217         int errCode = connection_->Close();
218         if (errCode != E_OK) {
219             return errCode;
220         }
221         connection_ = nullptr;
222         kvStore_ = nullptr;
223         return KvDBManager::RemoveDatabase(prop);
224     }
225     return -E_NOT_FOUND;
226 }
227 
GetDbProperties() const228 const KvDBProperties &VirtualMultiVerSyncDBInterface::GetDbProperties() const
229 {
230     return properties_;
231 }
232 
DeleteMetaDataByPrefixKey(const Key & keyPrefix) const233 int VirtualMultiVerSyncDBInterface::DeleteMetaDataByPrefixKey(const Key &keyPrefix) const
234 {
235     return -E_NOT_SUPPORT;
236 }
237 }  // namespace DistributedDB
238 #endif // OMIT_MULTI_VER
239 
240