1 /*
2 * Copyright (c) 2024 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 #include <cstdlib>
17 #include <string>
18 #include <variant>
19 #include <vector>
20 #include <map>
21 #include <iomanip>
22 #include "securec.h"
23 #include "ffi_remote_data.h"
24 #include "cj_lambda.h"
25
26 #include "distributed_kv_store_impl.h"
27 #include "distributed_kv_store_utils.h"
28
29 using namespace OHOS::FFI;
30
31 namespace OHOS::DistributedKVStore {
32
ConvertCJErrCode(Status status)33 static int32_t ConvertCJErrCode(Status status)
34 {
35 switch (status) {
36 case PERMISSION_DENIED:
37 // 202
38 return CJ_ERROR_PERMISSION_DENIED;
39 case INVALID_ARGUMENT:
40 case NOT_SUPPORT:
41 // 401
42 return CJ_ERROR_INVALID_ARGUMENT;
43 case OVER_MAX_LIMITS:
44 // 15100001
45 return CJ_ERROR_OVER_MAX_LIMITS;
46 case STORE_META_CHANGED:
47 case SECURITY_LEVEL_ERROR:
48 // 15100002
49 return CJ_ERROR_STORE_META_CHANGED;
50 case CRYPT_ERROR:
51 case DATA_CORRUPTED:
52 // 15100003
53 return CJ_ERROR_CRYPT_ERROR;
54 case NOT_FOUND:
55 case DB_ERROR:
56 // 15100004
57 return CJ_ERROR_NOT_FOUND;
58 case ALREADY_CLOSED:
59 // 15100005
60 return CJ_ERROR_ALREADY_CLOSED;
61 default:
62 return static_cast<int32_t>(status);
63 }
64 }
65
VectorToByteArray(std::vector<uint8_t> bytes)66 static CArrByte VectorToByteArray(std::vector<uint8_t> bytes)
67 {
68 uint8_t* head = static_cast<uint8_t*>(malloc(bytes.size() * sizeof(uint8_t)));
69 if (head == nullptr) {
70 return CArrByte{};
71 }
72 for (unsigned long i = 0; i < bytes.size(); i++) {
73 head[i] = bytes[i];
74 }
75 CArrByte byteArray = { head, bytes.size() };
76 return byteArray;
77 }
78
KVValueToValueType(const DistributedKv::Blob & blob)79 static ValueType KVValueToValueType(const DistributedKv::Blob& blob)
80 {
81 auto& data = blob.Data();
82 ValueType v = { 0 };
83 // number 2 means: valid Blob must have more than 2 bytes.
84 if (data.size() < 1) {
85 LOGI("Blob have no data!");
86 return {0};
87 }
88 // number 1 means: skip the first byte, byte[0] is real data type.
89 std::vector<uint8_t> real(data.begin() + 1, data.end());
90 if (data[0] == STRING) {
91 v.string = MallocCString(std::string(real.begin(), real.end()));
92 v.tag = STRING;
93 } else if (data[0] == INTEGER) {
94 uint32_t tmp4int = be32toh(*reinterpret_cast<uint32_t*>(&(real[0])));
95 v.integer = *reinterpret_cast<int32_t*>(&tmp4int);
96 v.tag = INTEGER;
97 } else if (data[0] == FLOAT) {
98 uint32_t tmp4flt = be32toh(*reinterpret_cast<uint32_t*>(&(real[0])));
99 v.flo = *reinterpret_cast<float*>((void*)(&tmp4flt));
100 v.tag = FLOAT;
101 } else if (data[0] == BYTE_ARRAY) {
102 v.byteArray = VectorToByteArray(std::vector<uint8_t>(real.begin(), real.end()));
103 v.tag = BYTE_ARRAY;
104 } else if (data[0] == BOOLEAN) {
105 v.boolean = static_cast<bool>(real[0]);
106 v.tag = BOOLEAN;
107 } else if (data[0] == DOUBLE) {
108 uint64_t tmp4dbl = be64toh(*reinterpret_cast<uint64_t*>(&(real[0])));
109 v.dou = *reinterpret_cast<double*>((void*)(&tmp4dbl));
110 v.tag = DOUBLE;
111 } else {
112 // for schema-db, if (data[0] == STRING), no beginning byte!
113 v.string = MallocCString(std::string(data.begin(), data.end()));
114 v.tag = STRING;
115 }
116 return v;
117 }
118
PushData(const ValueType & value,std::vector<uint8_t> & data,uint8_t tag)119 static void PushData(const ValueType &value, std::vector<uint8_t> &data, uint8_t tag)
120 {
121 switch (tag) {
122 case INTEGER: {
123 int32_t tmp = value.integer; // copy value, and make it available in stack space.
124 uint32_t tmp32 = htobe32(*reinterpret_cast<uint32_t*>(&tmp));
125 uint8_t *res = reinterpret_cast<uint8_t*>(&tmp32);
126 data.push_back(INTEGER);
127 data.insert(data.end(), res, res + sizeof(int32_t) / sizeof(uint8_t));
128 break;
129 }
130 case FLOAT: {
131 float tmp = value.flo; // copy value, and make it available in stack space.
132 uint32_t tmp32 = htobe32(*reinterpret_cast<uint32_t*>(&tmp));
133 uint8_t *res = reinterpret_cast<uint8_t*>(&tmp32);
134 data.push_back(FLOAT);
135 data.insert(data.end(), res, res + sizeof(float) / sizeof(uint8_t));
136 break;
137 }
138 case DOUBLE: {
139 double tmp = value.dou; // copy value, and make it available in stack space.
140 uint64_t tmp64 = htobe64(*reinterpret_cast<uint64_t*>(&tmp));
141 uint8_t *res = reinterpret_cast<uint8_t*>(&tmp64);
142 data.push_back(DOUBLE);
143 data.insert(data.end(), res, res + sizeof(double) / sizeof(uint8_t));
144 break;
145 }
146 default:
147 break;
148 }
149 }
150
ValueTypeToKVValue(const ValueType & value)151 static DistributedKv::Value ValueTypeToKVValue(const ValueType &value)
152 {
153 std::vector<uint8_t> data;
154 switch (value.tag) {
155 case STRING: {
156 std::string str = value.string;
157 data.push_back(STRING);
158 data.insert(data.end(), str.begin(), str.end());
159 break;
160 }
161 case INTEGER: {
162 PushData(value, data, value.tag);
163 break;
164 }
165 case FLOAT: {
166 PushData(value, data, value.tag);
167 break;
168 }
169 case BYTE_ARRAY: {
170 std::vector<uint8_t> bytes = std::vector<uint8_t>();
171 for (int64_t i = 0; i < value.byteArray.size; i++) {
172 bytes.push_back(value.byteArray.head[i]);
173 }
174 data.push_back(BYTE_ARRAY);
175 data.insert(data.end(), bytes.begin(), bytes.end());
176 break;
177 }
178 case BOOLEAN: {
179 data.push_back(BOOLEAN);
180 data.push_back(static_cast<uint8_t>(value.boolean));
181 break;
182 }
183 case DOUBLE: {
184 PushData(value, data, value.tag);
185 break;
186 }
187 default:
188 break;
189 }
190 return DistributedKv::Blob(data);
191 }
192
CJKVManager()193 CJKVManager::CJKVManager() {};
CJKVManager(const char * boudleName,OHOS::AbilityRuntime::Context * context)194 CJKVManager::CJKVManager(const char* boudleName, OHOS::AbilityRuntime::Context* context)
195 {
196 ContextParam param;
197 param.area = context->GetArea();
198 param.baseDir = context->GetDatabaseDir();
199 auto hapInfo = context->GetHapModuleInfo();
200 if (hapInfo != nullptr) {
201 param.hapName = hapInfo->moduleName;
202 }
203 param_ = std::make_shared<ContextParam>(std::move(param));
204 bundleName_ = boudleName;
205 }
206
GetKVStore(const char * cStoreId,const CJOptions cjOptions,int32_t & errCode)207 uint64_t CJKVManager::GetKVStore(const char* cStoreId, const CJOptions cjOptions, int32_t& errCode)
208 {
209 Options options;
210 options.createIfMissing = cjOptions.createIfMissing;
211 options.encrypt = cjOptions.encrypt;
212 options.backup = cjOptions.backup;
213 options.autoSync = cjOptions.autoSync;
214 options.kvStoreType = static_cast<KvStoreType>(cjOptions.kvStoreType);
215 options.securityLevel = cjOptions.securityLevel;
216 AppId appId = { bundleName_ };
217 std::string sStoreId = cStoreId;
218 StoreId storeId = { sStoreId };
219 options.baseDir = param_->baseDir;
220 options.area = param_->area + 1;
221 options.hapName = param_->hapName;
222 std::shared_ptr<DistributedKv::SingleKvStore> kvStore;
223 Status status = kvDataManager_.GetSingleKvStore(options, appId, storeId, kvStore);
224 if (status == DATA_CORRUPTED) {
225 options.rebuild = true;
226 status = kvDataManager_.GetSingleKvStore(options, appId, storeId, kvStore);
227 LOGE("Data has corrupted, rebuild db");
228 }
229 errCode = ConvertCJErrCode(status);
230 if (errCode != 0) {
231 return 0;
232 }
233 if (cjOptions.kvStoreType == 1) {
234 auto nativeKVStore = FFIData::Create<CJSingleKVStore>(sStoreId);
235 if (nativeKVStore == nullptr) {
236 errCode = -1;
237 return -1;
238 }
239 nativeKVStore->SetKvStorePtr(kvStore);
240 nativeKVStore->SetContextParam(param_);
241 return nativeKVStore->GetID();
242 }
243 auto nativeKVStore = FFIData::Create<CJDeviceKVStore>(sStoreId);
244 if (nativeKVStore == nullptr) {
245 errCode = -1;
246 return -1;
247 }
248 nativeKVStore->SetKvStorePtr(kvStore);
249 nativeKVStore->SetContextParam(param_);
250 return nativeKVStore->GetID();
251 }
252
CloseKVStore(const char * appId,const char * storeId)253 int32_t CJKVManager::CloseKVStore(const char* appId, const char* storeId)
254 {
255 std::string sAppId = appId;
256 std::string sStoreId = storeId;
257 AppId appIdBox = { sAppId };
258 StoreId storeIdBox { sStoreId };
259 Status status = kvDataManager_.CloseKvStore(appIdBox, storeIdBox);
260 if ((status == Status::SUCCESS) || (status == Status::STORE_NOT_FOUND) || (status == Status::STORE_NOT_OPEN)) {
261 status = Status::SUCCESS;
262 }
263 return ConvertCJErrCode(status);
264 }
265
DeleteKVStore(const char * appId,const char * storeId)266 int32_t CJKVManager::DeleteKVStore(const char* appId, const char* storeId)
267 {
268 std::string sAppId = appId;
269 std::string sStoreId = storeId;
270 AppId appIdBox = { sAppId };
271 StoreId storeIdBox { sStoreId };
272 std::string databaseDir = param_->baseDir;
273 Status status = kvDataManager_.DeleteKvStore(appIdBox, storeIdBox, databaseDir);
274 return ConvertCJErrCode(status);
275 }
276
VectorAppIdToCArr(const std::vector<StoreId> & storeIdList)277 static CArrStr VectorAppIdToCArr(const std::vector<StoreId>& storeIdList)
278 {
279 CArrStr strArray;
280 strArray.size = static_cast<int64_t>(storeIdList.size());
281 strArray.head = static_cast<char**>(malloc(strArray.size * sizeof(char*)));
282 if (strArray.head == nullptr) {
283 return CArrStr{0};
284 }
285 for (int64_t i = 0; i < strArray.size; i++) {
286 strArray.head[i] = MallocCString(storeIdList[i].storeId);
287 }
288 return strArray;
289 }
290
GetAllKVStoreId(const char * appId,int32_t & errCode)291 CArrStr CJKVManager::GetAllKVStoreId(const char* appId, int32_t& errCode)
292 {
293 std::string sAppId = appId;
294 AppId appIdBox = { sAppId };
295 std::vector<StoreId> storeIdList;
296 Status status = kvDataManager_.GetAllKvStoreId(appIdBox, storeIdList);
297 errCode = ConvertCJErrCode(status);
298 if (errCode != 0) {
299 return CArrStr{0};
300 }
301 return VectorAppIdToCArr(storeIdList);
302 }
303
OnDistributedDataServiceDie(void (* callbackId)())304 int32_t CJKVManager::OnDistributedDataServiceDie(void (*callbackId)())
305 {
306 std::lock_guard<std::mutex> lck(deathMutex_);
307 auto onChange = [lambda = CJLambda::Create(callbackId)]() -> void { lambda(); };
308 auto deathRecipient = std::make_shared<DeathRecipient>(callbackId, onChange);
309 kvDataManager_.RegisterKvStoreServiceDeathRecipient(deathRecipient);
310 deathRecipient_.push_back(deathRecipient);
311 return 0;
312 }
313
OffDistributedDataServiceDie(void (* callbackId)())314 int32_t CJKVManager::OffDistributedDataServiceDie(void (*callbackId)())
315 {
316 std::lock_guard<std::mutex> lck(deathMutex_);
317 auto it = deathRecipient_.begin();
318 while (it != deathRecipient_.end()) {
319 if ((*it)->m_callbackId == callbackId) {
320 kvDataManager_.UnRegisterKvStoreServiceDeathRecipient(*it);
321 it = deathRecipient_.erase(it);
322 break; // specified observer is current iterator
323 }
324 ++it;
325 }
326 return 0;
327 }
328
OffAllDistributedDataServiceDie()329 int32_t CJKVManager::OffAllDistributedDataServiceDie()
330 {
331 std::lock_guard<std::mutex> lck(deathMutex_);
332 for (auto& observer : deathRecipient_) {
333 kvDataManager_.UnRegisterKvStoreServiceDeathRecipient(observer);
334 }
335 deathRecipient_.clear();
336 return 0;
337 }
338
CJSingleKVStore(const std::string & storeId)339 CJSingleKVStore::CJSingleKVStore(const std::string& storeId)
340 {
341 storeId_ = storeId;
342 }
343
GetKvStorePtr()344 std::shared_ptr<SingleKvStore> CJSingleKVStore::GetKvStorePtr()
345 {
346 return kvStore_;
347 }
348
SetKvStorePtr(std::shared_ptr<SingleKvStore> kvStore)349 void CJSingleKVStore::SetKvStorePtr(std::shared_ptr<SingleKvStore> kvStore)
350 {
351 kvStore_ = kvStore;
352 }
353
SetContextParam(std::shared_ptr<ContextParam> param)354 void CJSingleKVStore::SetContextParam(std::shared_ptr<ContextParam> param)
355 {
356 param_ = param;
357 }
358
Put(const std::string & key,const ValueType & value)359 int32_t CJSingleKVStore::Put(const std::string &key, const ValueType &value)
360 {
361 auto tempKey = DistributedKv::Key(key);
362 Status status = kvStore_->Put(tempKey, ValueTypeToKVValue(value));
363 return ConvertCJErrCode(status);
364 }
365
CEntryToEntry(const CEntry & cEntry)366 static Entry CEntryToEntry(const CEntry &cEntry)
367 {
368 std::string key = cEntry.key;
369 Entry entry = {DistributedKv::Key(key), ValueTypeToKVValue(cEntry.value)};
370 return entry;
371 }
372
CArrayEntryToEntries(const CArrEntry & cArrEntry)373 static std::vector<Entry> CArrayEntryToEntries(const CArrEntry &cArrEntry)
374 {
375 std::vector<Entry> entrys;
376 int64_t arrSize = cArrEntry.size;
377
378 for (int64_t i = 0; i < arrSize; i++) {
379 Entry entry = CEntryToEntry(cArrEntry.head[i]);
380 entrys.push_back(entry);
381 }
382 return entrys;
383 }
384
EntriesToCArrEntry(const std::vector<Entry> & entries)385 static CArrEntry EntriesToCArrEntry(const std::vector<Entry> &entries)
386 {
387 CEntry *cEntries = static_cast<CEntry*>(malloc(entries.size() * sizeof(CEntry)));
388 if (cEntries == nullptr) {
389 return CArrEntry{};
390 }
391 for (size_t i = 0; i < entries.size(); i++) {
392 cEntries[i].key = MallocCString(entries[i].key.ToString());
393 cEntries[i].value = KVValueToValueType(entries[i].value);
394 }
395 return CArrEntry{.head = cEntries, .size = int64_t(entries.size())};
396 }
397
ChangeNotificationToCChangeNotification(const ChangeNotification & c)398 static CChangeNotification ChangeNotificationToCChangeNotification(const ChangeNotification &c)
399 {
400 std::vector<Entry> insertEntries = c.GetInsertEntries();
401 std::vector<Entry> updateEntries = c.GetUpdateEntries();
402 std::vector<Entry> deleteEntries = c.GetDeleteEntries();
403 std::string deviceId = c.GetDeviceId();
404 return CChangeNotification{.insertEntries = EntriesToCArrEntry(insertEntries),
405 .updateEntries = EntriesToCArrEntry(updateEntries),
406 .deleteEntries = EntriesToCArrEntry(deleteEntries),
407 .deviceId = MallocCString(deviceId)};
408 }
409
PutBatch(const CArrEntry & cArrEntry)410 int32_t CJSingleKVStore::PutBatch(const CArrEntry &cArrEntry)
411 {
412 Status status = kvStore_->PutBatch(CArrayEntryToEntries(cArrEntry));
413 return ConvertCJErrCode(status);
414 }
415
Delete(const std::string & key)416 int32_t CJSingleKVStore::Delete(const std::string &key)
417 {
418 auto tempKey = DistributedKv::Key(key);
419 Status status = kvStore_->Delete(tempKey);
420 return ConvertCJErrCode(status);
421 }
422
CArrStrToVectorKey(const CArrStr & cArrStr)423 static std::vector<Key> CArrStrToVectorKey(const CArrStr &cArrStr)
424 {
425 std::vector<Key> keys;
426 int64_t size = cArrStr.size;
427 for (int64_t i = 0; i < size; i++) {
428 std::string str = cArrStr.head[i];
429 keys.push_back(DistributedKv::Key(str));
430 }
431 return keys;
432 }
433
DeleteBatch(const CArrStr & cArrStr)434 int32_t CJSingleKVStore::DeleteBatch(const CArrStr &cArrStr)
435 {
436 Status status = kvStore_->DeleteBatch(CArrStrToVectorKey(cArrStr));
437 return ConvertCJErrCode(status);
438 }
439
RemoveDeviceData(const std::string & deviceId)440 int32_t CJSingleKVStore::RemoveDeviceData(const std::string &deviceId)
441 {
442 Status status = kvStore_->RemoveDeviceData(deviceId);
443 return ConvertCJErrCode(status);
444 }
445
Get(const std::string & key,int32_t & errCode)446 ValueType CJSingleKVStore::Get(const std::string &key, int32_t& errCode)
447 {
448 auto s_key = DistributedKv::Key(key);
449 OHOS::DistributedKv::Value value;
450 Status status = kvStore_->Get(key, value);
451 errCode = ConvertCJErrCode(status);
452 if (errCode != 0) {
453 return ValueType{0};
454 }
455 return KVValueToValueType(value);
456 }
457
GetEntries(OHOS::sptr<CQuery> query,int32_t & errCode)458 CArrEntry CJSingleKVStore::GetEntries(OHOS::sptr<CQuery> query, int32_t& errCode)
459 {
460 std::vector<DistributedKVStore::Entry> entries;
461 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
462 Status status = kvStore_->GetEntries(dataQuery, entries);
463 errCode = ConvertCJErrCode(status);
464 return EntriesToCArrEntry(entries);
465 }
466
GetEntries(const std::string & keyPrefix,int32_t & errCode)467 CArrEntry CJSingleKVStore::GetEntries(const std::string &keyPrefix, int32_t& errCode)
468 {
469 std::vector<DistributedKVStore::Entry> entries;
470 DistributedKVStore::DataQuery dataQuery;
471 dataQuery.KeyPrefix(keyPrefix);
472 Status status = kvStore_->GetEntries(dataQuery, entries);
473 errCode = ConvertCJErrCode(status);
474 return EntriesToCArrEntry(entries);
475 }
476
GetResultSetByString(const std::string & keyPrefix,int32_t & errCode)477 int64_t CJSingleKVStore::GetResultSetByString(const std::string &keyPrefix, int32_t& errCode)
478 {
479 DistributedKVStore::DataQuery dataQuery;
480 dataQuery.KeyPrefix(keyPrefix);
481 std::shared_ptr<DistributedKv::KvStoreResultSet> kvResultSet;
482 Status status = GetKvStorePtr()->GetResultSet(dataQuery, kvResultSet);
483 errCode = ConvertCJErrCode(status);
484 auto nativeCKVStoreResultSet = FFIData::Create<OHOS::DistributedKVStore::CKvStoreResultSet>(kvResultSet);
485 if (nativeCKVStoreResultSet == nullptr) {
486 return -1;
487 }
488 return nativeCKVStoreResultSet->GetID();
489 }
490
GetResultSetByQuery(OHOS::sptr<CQuery> query,int32_t & errCode)491 int64_t CJSingleKVStore::GetResultSetByQuery(OHOS::sptr<CQuery> query, int32_t& errCode)
492 {
493 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
494 std::shared_ptr<DistributedKv::KvStoreResultSet> kvResultSet;
495 Status status = GetKvStorePtr()->GetResultSet(dataQuery, kvResultSet);
496 errCode = ConvertCJErrCode(status);
497 auto nativeCKVStoreResultSet = FFIData::Create<OHOS::DistributedKVStore::CKvStoreResultSet>(kvResultSet);
498 if (nativeCKVStoreResultSet == nullptr) {
499 return -1;
500 }
501 return nativeCKVStoreResultSet->GetID();
502 }
503
CloseResultSet(OHOS::sptr<CKvStoreResultSet> resultSet)504 int32_t CJSingleKVStore::CloseResultSet(OHOS::sptr<CKvStoreResultSet> resultSet)
505 {
506 std::shared_ptr<DistributedKv::KvStoreResultSet> ptrKvResultSet = resultSet->GetKvStoreResultSet();
507 Status status = kvStore_->CloseResultSet(ptrKvResultSet);
508 return ConvertCJErrCode(status);
509 }
510
GetResultSize(OHOS::sptr<CQuery> query,int32_t & errCode)511 int32_t CJSingleKVStore::GetResultSize(OHOS::sptr<CQuery> query, int32_t& errCode)
512 {
513 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
514 int resultSize = 0;
515 Status status = kvStore_->GetCount(dataQuery, resultSize);
516 errCode = ConvertCJErrCode(status);
517 return resultSize;
518 }
519
Backup(const std::string & file)520 int32_t CJSingleKVStore::Backup(const std::string &file)
521 {
522 Status status = kvStore_->Backup(file, param_->baseDir);
523 return ConvertCJErrCode(status);
524 }
525
Restore(const std::string & file)526 int32_t CJSingleKVStore::Restore(const std::string &file)
527 {
528 Status status = kvStore_->Restore(file, param_->baseDir);
529 return ConvertCJErrCode(status);
530 }
531
CArrStrToVectorString(const CArrStr & cArrStr)532 static std::vector<std::string> CArrStrToVectorString(const CArrStr &cArrStr)
533 {
534 std::vector<std::string> strings;
535 int64_t size = cArrStr.size;
536 for (int64_t i = 0; i < size; i++) {
537 std::string str = cArrStr.head[i];
538 strings.push_back(str);
539 }
540 return strings;
541 }
542
MapToCStringNum(const std::map<std::string,DistributedKv::Status> & results)543 static CStringNum MapToCStringNum(const std::map<std::string, DistributedKv::Status>& results)
544 {
545 CStringNum cStringNum;
546 cStringNum.headChar = (char**)malloc(sizeof(char*) * results.size());
547 if (cStringNum.headChar == nullptr) {
548 return CStringNum{0};
549 }
550 cStringNum.headNum = (int32_t*)malloc(sizeof(int32_t) * results.size());
551 if (cStringNum.headNum == nullptr) {
552 free(cStringNum.headChar);
553 return CStringNum{0};
554 }
555 cStringNum.size = results.size();
556 int64_t i = 0;
557 for (auto& it : results) {
558 cStringNum.headChar[i] = MallocCString(it.first);
559 cStringNum.headNum[i] = ConvertCJErrCode(it.second);
560 i++;
561 }
562 return cStringNum;
563 }
564
DeleteBackup(const CArrStr & cArrStr,int32_t & errCode)565 CStringNum CJSingleKVStore::DeleteBackup(const CArrStr &cArrStr, int32_t& errCode)
566 {
567 std::map<std::string, DistributedKv::Status> results;
568 Status status = kvStore_->DeleteBackup(CArrStrToVectorString(cArrStr), param_->baseDir, results);
569 errCode = ConvertCJErrCode(status);
570 return MapToCStringNum(results);
571 }
572
StartTransaction()573 int32_t CJSingleKVStore::StartTransaction()
574 {
575 Status status = kvStore_->StartTransaction();
576 return ConvertCJErrCode(status);
577 }
578
Commit()579 int32_t CJSingleKVStore::Commit()
580 {
581 Status status = kvStore_->Commit();
582 return ConvertCJErrCode(status);
583 }
584
Rollback()585 int32_t CJSingleKVStore::Rollback()
586 {
587 Status status = kvStore_->Rollback();
588 return ConvertCJErrCode(status);
589 }
590
EnableSync(bool enabled)591 int32_t CJSingleKVStore::EnableSync(bool enabled)
592 {
593 Status status = kvStore_->SetCapabilityEnabled(enabled);
594 return ConvertCJErrCode(status);
595 }
596
SetSyncRange(const CArrStr & localLabels,const CArrStr & remoteSupportLabels)597 int32_t CJSingleKVStore::SetSyncRange(const CArrStr &localLabels, const CArrStr &remoteSupportLabels)
598 {
599 Status status = kvStore_->SetCapabilityRange(CArrStrToVectorString(localLabels),
600 CArrStrToVectorString(remoteSupportLabels));
601 return ConvertCJErrCode(status);
602 }
603
SetSyncParam(uint32_t defaultAllowedDelayMs)604 int32_t CJSingleKVStore::SetSyncParam(uint32_t defaultAllowedDelayMs)
605 {
606 KvSyncParam syncParam { defaultAllowedDelayMs };
607 Status status = kvStore_->SetSyncParam(syncParam);
608 return ConvertCJErrCode(status);
609 }
610
Sync(const CArrStr deviceIds,uint8_t mode,uint32_t delayMs)611 int32_t CJSingleKVStore::Sync(const CArrStr deviceIds, uint8_t mode, uint32_t delayMs)
612 {
613 Status status = kvStore_->Sync(CArrStrToVectorString(deviceIds), static_cast<SyncMode>(mode), delayMs);
614 return ConvertCJErrCode(status);
615 }
616
SyncByQuery(const CArrStr deviceIds,OHOS::sptr<CQuery> query,uint8_t mode,uint32_t delayMs)617 int32_t CJSingleKVStore::SyncByQuery(const CArrStr deviceIds, OHOS::sptr<CQuery> query, uint8_t mode, uint32_t delayMs)
618 {
619 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
620 Status status = kvStore_->Sync(CArrStrToVectorString(deviceIds),
621 static_cast<SyncMode>(mode), dataQuery, nullptr, delayMs);
622 return ConvertCJErrCode(status);
623 }
624
ToSubscribeType(uint8_t type)625 static SubscribeType ToSubscribeType(uint8_t type)
626 {
627 switch (type) {
628 case 0: // 0 means SUBSCRIBE_TYPE_LOCAL
629 return SubscribeType::SUBSCRIBE_TYPE_LOCAL;
630 case 1: // 1 means SUBSCRIBE_TYPE_REMOTE
631 return SubscribeType::SUBSCRIBE_TYPE_REMOTE;
632 case 2: // 2 means SUBSCRIBE_TYPE_ALL
633 return SubscribeType::SUBSCRIBE_TYPE_ALL;
634 default:
635 return SubscribeType::SUBSCRIBE_TYPE_LOCAL;
636 }
637 }
638
OnDataChange(uint8_t type,void (* callbackId)(const CChangeNotification valueRef))639 int32_t CJSingleKVStore::OnDataChange(uint8_t type, void (*callbackId)(const CChangeNotification valueRef))
640 {
641 std::lock_guard<std::mutex> lck(listMutex_);
642 auto onChange = [lambda = CJLambda::Create(callbackId)](const ChangeNotification& valueRef) ->
643 void { lambda(ChangeNotificationToCChangeNotification(valueRef)); };
644 auto observer = std::make_shared<DataObserver>(callbackId, onChange);
645 auto subscribeType = ToSubscribeType(type);
646 Status status = kvStore_->SubscribeKvStore(subscribeType, observer);
647 int32_t errCode = ConvertCJErrCode(status);
648 if (errCode != 0) {
649 return errCode;
650 }
651 dataObserver_[type].push_back(observer);
652 return errCode;
653 }
654
OffDataChange(void (* callbackId)(const CChangeNotification valueRef))655 int32_t CJSingleKVStore::OffDataChange(void (*callbackId)(const CChangeNotification valueRef))
656 {
657 std::lock_guard<std::mutex> lck(listMutex_);
658 for (uint8_t type = SUBSCRIBE_LOCAL; type < SUBSCRIBE_COUNT; type++) {
659 auto it = dataObserver_[type].begin();
660 while (it != dataObserver_[type].end()) {
661 int32_t errCode = 0;
662 if ((*it)->m_callbackId == callbackId) {
663 auto subscribeType = ToSubscribeType(type);
664 Status status = kvStore_->UnSubscribeKvStore(subscribeType, *it);
665 errCode = ConvertCJErrCode(status);
666 it = dataObserver_[type].erase(it);
667 }
668 if (errCode != 0) {
669 return errCode;
670 }
671 ++it;
672 }
673 }
674 return 0;
675 }
676
OffAllDataChange()677 int32_t CJSingleKVStore::OffAllDataChange()
678 {
679 std::lock_guard<std::mutex> lck(listMutex_);
680 for (uint8_t type = SUBSCRIBE_LOCAL; type < SUBSCRIBE_COUNT; type++) {
681 for (auto& observer : dataObserver_[type]) {
682 auto subscribeType = ToSubscribeType(type);
683 Status status = kvStore_->UnSubscribeKvStore(subscribeType, observer);
684 int32_t errCode = ConvertCJErrCode(status);
685 if (errCode != 0) {
686 return errCode;
687 }
688 }
689 dataObserver_[type].clear();
690 }
691 return 0;
692 }
693
OnSyncComplete(void (* callbackId)(const CStringNum valueRef))694 int32_t CJSingleKVStore::OnSyncComplete(void (*callbackId)(const CStringNum valueRef))
695 {
696 std::lock_guard<std::mutex> lck(listMutex_);
697 auto onChange = [lambda = CJLambda::Create(callbackId)]
698 (const std::map<std::string, DistributedKv::Status>& valueRef) ->
699 void { lambda(MapToCStringNum(valueRef)); };
700 auto observer = std::make_shared<SyncObserver>(callbackId, onChange);
701 Status status = kvStore_->RegisterSyncCallback(observer);
702 int32_t errCode = ConvertCJErrCode(status);
703 if (errCode != 0) {
704 return errCode;
705 }
706 syncObservers_.push_back(observer);
707 return errCode;
708 }
709
OffAllSyncComplete()710 int32_t CJSingleKVStore::OffAllSyncComplete()
711 {
712 std::lock_guard<std::mutex> lck(listMutex_);
713 Status status = kvStore_->UnRegisterSyncCallback();
714 int32_t errCode = ConvertCJErrCode(status);
715 if (errCode == 0) {
716 syncObservers_.clear();
717 }
718 return errCode;
719 }
720
GetSecurityLevel(int32_t & errCode)721 int32_t CJSingleKVStore::GetSecurityLevel(int32_t& errCode)
722 {
723 SecurityLevel securityLevel;
724 Status status = kvStore_->GetSecurityLevel(securityLevel);
725 errCode = ConvertCJErrCode(status);
726 return static_cast<int32_t>(securityLevel);
727 }
728
729 constexpr int DEVICEID_WIDTH = 4;
730
GetDeviceKey(const std::string & deviceId,const std::string & key)731 static std::string GetDeviceKey(const std::string& deviceId, const std::string& key)
732 {
733 std::ostringstream oss;
734 if (!deviceId.empty()) {
735 oss << std::setfill('0') << std::setw(DEVICEID_WIDTH) << deviceId.length() << deviceId;
736 }
737 oss << key;
738 return oss.str();
739 }
740
CJDeviceKVStore(const std::string & storeId)741 CJDeviceKVStore::CJDeviceKVStore(const std::string& storeId)
742 : CJSingleKVStore(storeId)
743 {
744 }
745
Get(const std::string & deviceId,const std::string & key,int32_t & errCode)746 ValueType CJDeviceKVStore::Get(const std::string &deviceId, const std::string &key, int32_t& errCode)
747 {
748 std::string deviceKey = GetDeviceKey(deviceId, key);
749 auto s_key = DistributedKv::Key(deviceKey);
750 OHOS::DistributedKv::Value value;
751 Status status = GetKvStorePtr()->Get(key, value);
752 errCode = ConvertCJErrCode(status);
753 if (errCode != 0) {
754 return ValueType{0};
755 }
756 return KVValueToValueType(value);
757 }
758
GetEntriesByDataQuery(DistributedKVStore::DataQuery dataQuery,int32_t & errCode)759 CArrEntry CJDeviceKVStore::GetEntriesByDataQuery(DistributedKVStore::DataQuery dataQuery, int32_t& errCode)
760 {
761 std::vector<DistributedKVStore::Entry> entries;
762 Status status = GetKvStorePtr()->GetEntries(dataQuery, entries);
763 errCode = ConvertCJErrCode(status);
764 if (errCode != 0) {
765 return CArrEntry{};
766 }
767 CEntry *cEntries = static_cast<CEntry*>(malloc(entries.size() * sizeof(CEntry)));
768 if (cEntries == nullptr) {
769 errCode = -1;
770 return CArrEntry{};
771 }
772 for (size_t i = 0; i < entries.size(); i++) {
773 cEntries[i].key = MallocCString(entries[i].key.ToString());
774 cEntries[i].value = KVValueToValueType(entries[i].value);
775 }
776 return CArrEntry{.head = cEntries, .size = int64_t(entries.size())};
777 }
778
GetEntries(const std::string & deviceId,const std::string & keyPrefix,int32_t & errCode)779 CArrEntry CJDeviceKVStore::GetEntries(const std::string &deviceId, const std::string &keyPrefix, int32_t& errCode)
780 {
781 DistributedKVStore::DataQuery dataQuery;
782 dataQuery.KeyPrefix(keyPrefix);
783 dataQuery.DeviceId(deviceId);
784
785 return GetEntriesByDataQuery(dataQuery, errCode);
786 }
787
GetEntries(const std::string & deviceId,OHOS::sptr<CQuery> query,int32_t & errCode)788 CArrEntry CJDeviceKVStore::GetEntries(const std::string &deviceId, OHOS::sptr<CQuery> query, int32_t& errCode)
789 {
790 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
791 dataQuery.DeviceId(deviceId);
792
793 return GetEntriesByDataQuery(dataQuery, errCode);
794 }
795
GetResultSet(const std::string & deviceId,const std::string & keyPrefix,int32_t & errCode)796 int64_t CJDeviceKVStore::GetResultSet(const std::string &deviceId, const std::string &keyPrefix, int32_t& errCode)
797 {
798 DistributedKVStore::DataQuery dataQuery;
799 dataQuery.KeyPrefix(keyPrefix);
800 dataQuery.DeviceId(deviceId);
801
802 std::shared_ptr<DistributedKv::KvStoreResultSet> kvResultSet;
803 Status status = GetKvStorePtr()->GetResultSet(dataQuery, kvResultSet);
804 errCode = ConvertCJErrCode(status);
805 if (errCode != 0) {
806 return -1;
807 }
808 auto nativeCKvStoreResultSet = FFIData::Create<OHOS::DistributedKVStore::CKvStoreResultSet>(kvResultSet);
809 if (nativeCKvStoreResultSet == nullptr) {
810 errCode = -1;
811 return -1;
812 }
813 return nativeCKvStoreResultSet->GetID();
814 }
815
GetResultSetQuery(const std::string & deviceId,OHOS::sptr<CQuery> query,int32_t & errCode)816 int64_t CJDeviceKVStore::GetResultSetQuery(const std::string &deviceId, OHOS::sptr<CQuery> query, int32_t& errCode)
817 {
818 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
819 dataQuery.DeviceId(deviceId);
820
821 std::shared_ptr<DistributedKv::KvStoreResultSet> kvResultSet;
822 Status status = GetKvStorePtr()->GetResultSet(dataQuery, kvResultSet);
823 errCode = ConvertCJErrCode(status);
824 if (errCode != 0) {
825 return -1;
826 }
827 auto nativeCKvStoreResultSet = FFIData::Create<OHOS::DistributedKVStore::CKvStoreResultSet>(kvResultSet);
828 if (nativeCKvStoreResultSet == nullptr) {
829 errCode = -1;
830 return -1;
831 }
832 return nativeCKvStoreResultSet->GetID();
833 }
834
GetResultSize(const std::string & deviceId,OHOS::sptr<CQuery> query,int32_t & errCode)835 int32_t CJDeviceKVStore::GetResultSize(const std::string &deviceId, OHOS::sptr<CQuery> query, int32_t& errCode)
836 {
837 DistributedKVStore::DataQuery dataQuery = query->GetDataQuery();
838 dataQuery.DeviceId(deviceId);
839
840 int32_t resultSize = 0;
841 Status status = GetKvStorePtr()->GetCount(dataQuery, resultSize);
842 errCode = ConvertCJErrCode(status);
843 return resultSize;
844 }
845
CKvStoreResultSet(std::shared_ptr<DistributedKv::KvStoreResultSet> cKvResultSet)846 CKvStoreResultSet::CKvStoreResultSet(std::shared_ptr<DistributedKv::KvStoreResultSet> cKvResultSet)
847 {
848 kvResultSet = cKvResultSet;
849 }
850
GetKvStoreResultSet()851 std::shared_ptr<DistributedKv::KvStoreResultSet> CKvStoreResultSet::GetKvStoreResultSet()
852 {
853 return kvResultSet;
854 }
855
GetCount()856 int32_t CKvStoreResultSet::GetCount()
857 {
858 return kvResultSet->GetCount();
859 }
860
GetPosition()861 int32_t CKvStoreResultSet::GetPosition()
862 {
863 return kvResultSet->GetPosition();
864 }
865
MoveToFirst()866 bool CKvStoreResultSet::MoveToFirst()
867 {
868 return kvResultSet->MoveToFirst();
869 }
870
MoveToLast()871 bool CKvStoreResultSet::MoveToLast()
872 {
873 return kvResultSet->MoveToLast();
874 }
875
MoveToNext()876 bool CKvStoreResultSet::MoveToNext()
877 {
878 return kvResultSet->MoveToNext();
879 }
880
MoveToPrevious()881 bool CKvStoreResultSet::MoveToPrevious()
882 {
883 return kvResultSet->MoveToPrevious();
884 }
885
Move(int32_t offset)886 bool CKvStoreResultSet::Move(int32_t offset)
887 {
888 return kvResultSet->Move(offset);
889 }
890
MoveToPosition(int32_t position)891 bool CKvStoreResultSet::MoveToPosition(int32_t position)
892 {
893 return kvResultSet->MoveToPosition(position);
894 }
895
IsFirst()896 bool CKvStoreResultSet::IsFirst()
897 {
898 return kvResultSet->IsFirst();
899 }
900
IsLast()901 bool CKvStoreResultSet::IsLast()
902 {
903 return kvResultSet->IsLast();
904 }
905
IsBeforeFirst()906 bool CKvStoreResultSet::IsBeforeFirst()
907 {
908 return kvResultSet->IsBeforeFirst();
909 }
910
IsAfterLast()911 bool CKvStoreResultSet::IsAfterLast()
912 {
913 return kvResultSet->IsAfterLast();
914 }
915
GetEntry()916 CEntry CKvStoreResultSet::GetEntry()
917 {
918 Entry entry;
919 auto status = kvResultSet->GetEntry(entry);
920 if (status != Status::SUCCESS)
921 return CEntry{};
922 auto& data = entry.key.Data();
923 return CEntry{.key = MallocCString(std::string(data.begin(), data.end())),
924 .value = KVValueToValueType(entry.value)};
925 }
926
GetDataQuery() const927 const DistributedKv::DataQuery& CQuery::GetDataQuery() const
928 {
929 return query_;
930 }
931
Reset()932 void CQuery::Reset()
933 {
934 query_.Reset();
935 }
936
EqualTo(const std::string & field,ValueType & value)937 void CQuery::EqualTo(const std::string &field, ValueType &value)
938 {
939 switch (value.tag) {
940 case STRING: {
941 std::string str = value.string;
942 query_.EqualTo(field, str);
943 break;
944 }
945 case INTEGER: {
946 query_.EqualTo(field, value.integer);
947 break;
948 }
949 case FLOAT: {
950 query_.EqualTo(field, value.flo);
951 break;
952 }
953 case BOOLEAN: {
954 query_.EqualTo(field, value.boolean);
955 break;
956 }
957 case DOUBLE: {
958 query_.EqualTo(field, value.dou);
959 break;
960 }
961 default: {
962 break;
963 }
964 }
965 }
966
NotEqualTo(const std::string & field,ValueType & value)967 void CQuery::NotEqualTo(const std::string &field, ValueType &value)
968 {
969 switch (value.tag) {
970 case STRING: {
971 std::string str = value.string;
972 query_.NotEqualTo(field, str);
973 break;
974 }
975 case INTEGER: {
976 query_.NotEqualTo(field, value.integer);
977 break;
978 }
979 case FLOAT: {
980 query_.NotEqualTo(field, value.flo);
981 break;
982 }
983 case BOOLEAN: {
984 query_.NotEqualTo(field, value.boolean);
985 break;
986 }
987 case DOUBLE: {
988 query_.NotEqualTo(field, value.dou);
989 break;
990 }
991 default: {
992 break;
993 }
994 }
995 }
996
GreaterThan(const std::string & field,ValueType & value)997 void CQuery::GreaterThan(const std::string &field, ValueType &value)
998 {
999 switch (value.tag) {
1000 case STRING: {
1001 std::string str = value.string;
1002 query_.GreaterThan(field, str);
1003 break;
1004 }
1005 case INTEGER: {
1006 query_.GreaterThan(field, value.integer);
1007 break;
1008 }
1009 case FLOAT: {
1010 query_.GreaterThan(field, value.flo);
1011 break;
1012 }
1013 case BOOLEAN: {
1014 query_.GreaterThan(field, value.boolean);
1015 break;
1016 }
1017 case DOUBLE: {
1018 query_.GreaterThan(field, value.dou);
1019 break;
1020 }
1021 default: {
1022 break;
1023 }
1024 }
1025 }
1026
LessThan(const std::string & field,ValueType & value)1027 void CQuery::LessThan(const std::string &field, ValueType &value)
1028 {
1029 switch (value.tag) {
1030 case STRING: {
1031 std::string str = value.string;
1032 query_.LessThan(field, str);
1033 break;
1034 }
1035 case INTEGER: {
1036 query_.LessThan(field, value.integer);
1037 break;
1038 }
1039 case FLOAT: {
1040 query_.LessThan(field, value.flo);
1041 break;
1042 }
1043 case BOOLEAN: {
1044 query_.LessThan(field, value.boolean);
1045 break;
1046 }
1047 case DOUBLE: {
1048 query_.LessThan(field, value.dou);
1049 break;
1050 }
1051 default: {
1052 break;
1053 }
1054 }
1055 }
1056
GreaterThanOrEqualTo(const std::string & field,ValueType & value)1057 void CQuery::GreaterThanOrEqualTo(const std::string &field, ValueType &value)
1058 {
1059 switch (value.tag) {
1060 case STRING: {
1061 std::string str = value.string;
1062 query_.GreaterThanOrEqualTo(field, str);
1063 break;
1064 }
1065 case INTEGER: {
1066 query_.GreaterThanOrEqualTo(field, value.integer);
1067 break;
1068 }
1069 case FLOAT: {
1070 query_.GreaterThanOrEqualTo(field, value.flo);
1071 break;
1072 }
1073 case BOOLEAN: {
1074 query_.GreaterThanOrEqualTo(field, value.boolean);
1075 break;
1076 }
1077 case DOUBLE: {
1078 query_.GreaterThanOrEqualTo(field, value.dou);
1079 break;
1080 }
1081 default: {
1082 break;
1083 }
1084 }
1085 }
1086
LessThanOrEqualTo(const std::string & field,ValueType & value)1087 void CQuery::LessThanOrEqualTo(const std::string &field, ValueType &value)
1088 {
1089 switch (value.tag) {
1090 case STRING: {
1091 std::string str = value.string;
1092 query_.LessThanOrEqualTo(field, str);
1093 break;
1094 }
1095 case INTEGER: {
1096 query_.LessThanOrEqualTo(field, value.integer);
1097 break;
1098 }
1099 case FLOAT: {
1100 query_.LessThanOrEqualTo(field, value.flo);
1101 break;
1102 }
1103 case BOOLEAN: {
1104 query_.LessThanOrEqualTo(field, value.boolean);
1105 break;
1106 }
1107 case DOUBLE: {
1108 query_.LessThanOrEqualTo(field, value.dou);
1109 break;
1110 }
1111 default: {
1112 break;
1113 }
1114 }
1115 }
1116
IsNull(const std::string & field)1117 void CQuery::IsNull(const std::string &field)
1118 {
1119 query_.IsNull(field);
1120 }
1121
InNumber(const std::string & field,const CArrNumber & valueList)1122 void CQuery::InNumber(const std::string &field, const CArrNumber &valueList)
1123 {
1124 switch (valueList.tag) {
1125 case INTEGER: {
1126 query_.In(field, std::vector<int32_t>(valueList.intList, valueList.intList + valueList.size));
1127 break;
1128 }
1129 case FLOAT: {
1130 query_.In(field, std::vector<double>(valueList.floatList, valueList.floatList + valueList.size));
1131 break;
1132 }
1133 case DOUBLE: {
1134 query_.In(field, std::vector<double>(valueList.doubleList, valueList.doubleList + valueList.size));
1135 break;
1136 }
1137 default: {
1138 break;
1139 }
1140 }
1141 }
1142
CArrayStrToVectorString(const CArrStr & cArrStr)1143 static std::vector<std::string> CArrayStrToVectorString(const CArrStr &cArrStr)
1144 {
1145 std::vector<std::string> strs;
1146 int64_t size = cArrStr.size;
1147 for (int64_t i = 0; i < size; i++) {
1148 std::string str = cArrStr.head[i];
1149 strs.push_back(str);
1150 }
1151 return strs;
1152 }
1153
InString(const std::string & field,const CArrStr & valueList)1154 void CQuery::InString(const std::string &field, const CArrStr &valueList)
1155 {
1156 query_.In(field, CArrayStrToVectorString(valueList));
1157 }
1158
NotInNumber(const std::string & field,const CArrNumber & valueList)1159 void CQuery::NotInNumber(const std::string &field, const CArrNumber &valueList)
1160 {
1161 switch (valueList.tag) {
1162 case INTEGER: {
1163 query_.NotIn(field, std::vector<int32_t>(valueList.intList, valueList.intList + valueList.size));
1164 break;
1165 }
1166 case FLOAT: {
1167 query_.NotIn(field, std::vector<double>(valueList.floatList, valueList.floatList + valueList.size));
1168 break;
1169 }
1170 case DOUBLE: {
1171 query_.NotIn(field, std::vector<double>(valueList.doubleList, valueList.doubleList + valueList.size));
1172 break;
1173 }
1174 default: {
1175 break;
1176 }
1177 }
1178 }
1179
NotInString(const std::string & field,const CArrStr & valueList)1180 void CQuery::NotInString(const std::string &field, const CArrStr &valueList)
1181 {
1182 query_.NotIn(field, CArrayStrToVectorString(valueList));
1183 }
1184
Like(const std::string & field,const std::string & value)1185 void CQuery::Like(const std::string &field, const std::string &value)
1186 {
1187 query_.Like(field, value);
1188 }
1189
Unlike(const std::string & field,const std::string & value)1190 void CQuery::Unlike(const std::string &field, const std::string &value)
1191 {
1192 query_.Unlike(field, value);
1193 }
1194
And()1195 void CQuery::And()
1196 {
1197 query_.And();
1198 }
1199
Or()1200 void CQuery::Or()
1201 {
1202 query_.Or();
1203 }
1204
OrderByAsc(const std::string & field)1205 void CQuery::OrderByAsc(const std::string &field)
1206 {
1207 query_.OrderByAsc(field);
1208 }
1209
OrderByDesc(const std::string & field)1210 void CQuery::OrderByDesc(const std::string &field)
1211 {
1212 query_.OrderByDesc(field);
1213 }
1214
Limit(int32_t total,int32_t offset)1215 void CQuery::Limit(int32_t total, int32_t offset)
1216 {
1217 query_.Limit(total, offset);
1218 }
1219
IsNotNull(const std::string & field)1220 void CQuery::IsNotNull(const std::string &field)
1221 {
1222 query_.IsNotNull(field);
1223 }
1224
BeginGroup()1225 void CQuery::BeginGroup()
1226 {
1227 query_.BeginGroup();
1228 }
1229
EndGroup()1230 void CQuery::EndGroup()
1231 {
1232 query_.EndGroup();
1233 }
1234
PrefixKey(const std::string & prefix)1235 void CQuery::PrefixKey(const std::string &prefix)
1236 {
1237 query_.KeyPrefix(prefix);
1238 }
1239
SetSuggestIndex(const std::string & index)1240 void CQuery::SetSuggestIndex(const std::string &index)
1241 {
1242 query_.SetSuggestIndex(index);
1243 }
1244
DeviceId(const std::string & deviceId)1245 void CQuery::DeviceId(const std::string &deviceId)
1246 {
1247 query_.DeviceId(deviceId);
1248 }
1249
GetSqlLike()1250 const std::string CQuery::GetSqlLike()
1251 {
1252 return query_.ToString();
1253 }
1254
DeathRecipient(void (* callbackId)(),const std::function<void ()> & callbackRef)1255 CJKVManager::DeathRecipient::DeathRecipient(void (*callbackId)(), const std::function<void()>& callbackRef)
1256 {
1257 if (callbackId == nullptr) {
1258 LOGI("WARNING: nullptr");
1259 }
1260 m_callbackId = callbackId;
1261 m_callbackRef = callbackRef;
1262 }
1263
OnRemoteDied()1264 void CJKVManager::DeathRecipient::OnRemoteDied()
1265 {
1266 m_callbackRef();
1267 }
1268
DataObserver(void (* callbackId)(const CChangeNotification),const std::function<void (DistributedKv::ChangeNotification)> & callbackRef)1269 CJSingleKVStore::DataObserver::DataObserver(void (*callbackId)(const CChangeNotification),
1270 const std::function<void(DistributedKv::ChangeNotification)>& callbackRef)
1271 {
1272 if (callbackId == nullptr) {
1273 LOGI("WARNING: nullptr");
1274 }
1275 m_callbackId = callbackId;
1276 m_callbackRef = callbackRef;
1277 }
1278
OnChange(const DistributedKv::ChangeNotification & notification)1279 void CJSingleKVStore::DataObserver::OnChange(const DistributedKv::ChangeNotification& notification)
1280 {
1281 m_callbackRef(notification);
1282 }
1283
SyncObserver(void (* callbackId)(const CStringNum),const std::function<void (std::map<std::string,DistributedKv::Status>)> & callbackRef)1284 CJSingleKVStore::SyncObserver::SyncObserver(void (*callbackId)(const CStringNum),
1285 const std::function<void(std::map<std::string, DistributedKv::Status>)>& callbackRef)
1286 {
1287 if (callbackId == nullptr) {
1288 LOGI("WARNING: nullptr");
1289 }
1290 m_callbackId = callbackId;
1291 m_callbackRef = callbackRef;
1292 }
1293
SyncCompleted(const std::map<std::string,DistributedKv::Status> & results)1294 void CJSingleKVStore::SyncObserver::SyncCompleted(const std::map<std::string, DistributedKv::Status>& results)
1295 {
1296 m_callbackRef(results);
1297 }
1298 }