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