• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }