• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 "napi_rdb_store.h"
17 
18 #include <cinttypes>
19 #include <string>
20 #include <vector>
21 
22 #include "js_utils.h"
23 #include "logger.h"
24 #include "napi_async_call.h"
25 #include "napi_rdb_error.h"
26 #include "napi_rdb_predicates.h"
27 #include "napi_rdb_trace.h"
28 #include "napi_result_set.h"
29 #include "rdb_errno.h"
30 
31 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
32 #include "rdb_utils.h"
33 using namespace OHOS::DataShare;
34 #endif
35 
36 using namespace OHOS::Rdb;
37 using namespace OHOS::NativeRdb;
38 using namespace OHOS::AppDataMgrJsKit;
39 
40 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
41 using OHOS::DistributedRdb::SubscribeMode;
42 using OHOS::DistributedRdb::SubscribeOption;
43 using OHOS::DistributedRdb::SyncOption;
44 using OHOS::DistributedRdb::SyncResult;
45 #endif
46 
47 namespace OHOS {
48 namespace RdbJsKit {
49 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
50 struct PredicatesProxy {
51     std::shared_ptr<DataShareAbsPredicates> predicates_;
52 };
53 #endif
54 struct RdbStoreContext : public BaseContext {
55     bool isNapiString = false;
56     std::string device;
57     std::string tableName;
58     std::vector<std::string> tablesName;
59     std::string whereClause;
60     std::vector<std::string> whereArgs;
61     std::vector<std::string> selectionArgs;
62     std::string sql;
63     RdbPredicatesProxy *predicatesProxy;
64     std::vector<std::string> columns;
65     ValuesBucket valuesBucket;
66     std::vector<ValuesBucket> valuesBuckets;
67     std::map<std::string, ValueObject> numberMaps;
68     std::vector<ValueObject> bindArgs;
69     uint64_t rowId;
70     uint64_t insertNum;
71     std::vector<uint8_t> newKey;
72 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
73     std::shared_ptr<AbsSharedResultSet> resultSet;
74 #else
75     std::shared_ptr<ResultSet> resultSet;
76 #endif
77     std::shared_ptr<ResultSet> stepResultSet;
78     std::string aliasName;
79     std::string pathName;
80     std::string srcName;
81     int32_t enumArg;
82 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
83     DistributedRdb::SyncResult syncResult;
84 #endif
85     std::shared_ptr<RdbPredicates> rdbPredicates = nullptr;
86 
RdbStoreContextOHOS::RdbJsKit::RdbStoreContext87     RdbStoreContext() : predicatesProxy(nullptr), rowId(0), insertNum(0), enumArg(0)
88     {
89     }
~RdbStoreContextOHOS::RdbJsKit::RdbStoreContext90     virtual ~RdbStoreContext()
91     {
92     }
93 };
94 
95 static __thread napi_ref constructor_ = nullptr;
96 static __thread napi_ref constructorV9_ = nullptr;
97 
RdbStoreProxy()98 RdbStoreProxy::RdbStoreProxy()
99 {
100 }
101 
~RdbStoreProxy()102 RdbStoreProxy::~RdbStoreProxy()
103 {
104     LOG_DEBUG("RdbStoreProxy destructor");
105 }
106 
Init(napi_env env,napi_value exports)107 void RdbStoreProxy::Init(napi_env env, napi_value exports)
108 {
109     napi_property_descriptor descriptors[] = {
110         DECLARE_NAPI_FUNCTION("delete", Delete),
111         DECLARE_NAPI_FUNCTION("update", Update),
112         DECLARE_NAPI_FUNCTION("insert", Insert),
113         DECLARE_NAPI_FUNCTION("batchInsert", BatchInsert),
114         DECLARE_NAPI_FUNCTION("querySql", QuerySql),
115         DECLARE_NAPI_FUNCTION("query", Query),
116         DECLARE_NAPI_FUNCTION("executeSql", ExecuteSql),
117         DECLARE_NAPI_FUNCTION("replace", Replace),
118         DECLARE_NAPI_FUNCTION("count", Count),
119         DECLARE_NAPI_FUNCTION("addAttach", Attach),
120         DECLARE_NAPI_FUNCTION("beginTransaction", BeginTransaction),
121         DECLARE_NAPI_FUNCTION("rollBack", RollBack),
122         DECLARE_NAPI_FUNCTION("commit", Commit),
123         DECLARE_NAPI_FUNCTION("queryByStep", QueryByStep),
124         DECLARE_NAPI_FUNCTION("getVersion", GetVersion),
125         DECLARE_NAPI_FUNCTION("setVersion", SetVersion),
126         DECLARE_NAPI_GETTER("isInTransaction", IsInTransaction),
127         DECLARE_NAPI_GETTER("isOpen", IsOpen),
128         DECLARE_NAPI_GETTER("path", GetPath),
129         DECLARE_NAPI_GETTER("isHoldingConnection", IsHoldingConnection),
130         DECLARE_NAPI_GETTER("isReadOnly", IsReadOnly),
131         DECLARE_NAPI_GETTER("isMemoryRdb", IsMemoryRdb),
132 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
133         DECLARE_NAPI_FUNCTION("setDistributedTables", SetDistributedTables),
134         DECLARE_NAPI_FUNCTION("obtainDistributedTableName", ObtainDistributedTableName),
135         DECLARE_NAPI_FUNCTION("sync", Sync),
136         DECLARE_NAPI_FUNCTION("on", OnEvent),
137         DECLARE_NAPI_FUNCTION("off", OffEvent),
138 #endif
139     };
140     napi_value cons = nullptr;
141     NAPI_CALL_RETURN_VOID(env, napi_define_class(env, "RdbStore", NAPI_AUTO_LENGTH, Initialize, nullptr,
142                                    sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &cons));
143     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, cons, 1, &constructor_));
144 
145     NAPI_CALL_RETURN_VOID(env, napi_define_class(env, "RdbStoreV9", NAPI_AUTO_LENGTH, InitializeV9, nullptr,
146                                    sizeof(descriptors) / sizeof(napi_property_descriptor), descriptors, &cons));
147     NAPI_CALL_RETURN_VOID(env, napi_create_reference(env, cons, 1, &constructorV9_));
148 
149     LOG_DEBUG("Init RdbStoreProxy end");
150 }
151 
InnerInitialize(napi_env env,napi_callback_info info,int version)152 napi_value RdbStoreProxy::InnerInitialize(napi_env env, napi_callback_info info, int version)
153 {
154     napi_value self;
155     NAPI_CALL(env, napi_get_cb_info(env, info, NULL, NULL, &self, nullptr));
156     auto finalize = [](napi_env env, void *data, void *hint) {
157         RdbStoreProxy *proxy = reinterpret_cast<RdbStoreProxy *>(data);
158         delete proxy;
159     };
160     auto *proxy = new (std::nothrow) RdbStoreProxy();
161     if (proxy == nullptr) {
162         return nullptr;
163     }
164     proxy->apiversion = version;
165     napi_status status = napi_wrap(env, self, proxy, finalize, nullptr, nullptr);
166     if (status != napi_ok) {
167         LOG_ERROR("RdbStoreProxy::Initialize napi_wrap failed! code:%{public}d!", status);
168         finalize(env, proxy, nullptr);
169         return nullptr;
170     }
171     return self;
172 }
173 
Initialize(napi_env env,napi_callback_info info)174 napi_value RdbStoreProxy::Initialize(napi_env env, napi_callback_info info)
175 {
176     return InnerInitialize(env, info, APIVERSION_8);
177 }
178 
InitializeV9(napi_env env,napi_callback_info info)179 napi_value RdbStoreProxy::InitializeV9(napi_env env, napi_callback_info info)
180 {
181     return InnerInitialize(env, info, APIVERSION_V9);
182 }
183 
NewInstance(napi_env env,std::shared_ptr<OHOS::NativeRdb::RdbStore> value,int version)184 napi_value RdbStoreProxy::NewInstance(napi_env env, std::shared_ptr<OHOS::NativeRdb::RdbStore> value, int version)
185 {
186     if (value == nullptr) {
187         LOG_ERROR("RdbStoreProxy::NewInstance get native rdb is null.");
188         return nullptr;
189     }
190     napi_value cons;
191     napi_status status;
192     if (version > APIVERSION_8) {
193         status = napi_get_reference_value(env, constructorV9_, &cons);
194     } else {
195         status = napi_get_reference_value(env, constructor_, &cons);
196     }
197 
198     if (status != napi_ok) {
199         LOG_ERROR("RdbStoreProxy::NewInstance get constructor failed! code:%{public}d!", status);
200         return nullptr;
201     }
202 
203     napi_value instance = nullptr;
204     status = napi_new_instance(env, cons, 0, nullptr, &instance);
205     if (status != napi_ok) {
206         LOG_ERROR("RdbStoreProxy::NewInstance napi_new_instance failed! code:%{public}d!", status);
207         return nullptr;
208     }
209 
210     RdbStoreProxy *proxy = nullptr;
211     status = napi_unwrap(env, instance, reinterpret_cast<void **>(&proxy));
212     if (proxy == nullptr) {
213         LOG_ERROR("RdbStoreProxy::NewInstance native instance is nullptr! code:%{public}d!", status);
214         return instance;
215     }
216     proxy->rdbStore_ = std::move(value);
217     proxy->apiversion = version;
218     return instance;
219 }
220 
GetNativeInstance(napi_env env,napi_value self)221 RdbStoreProxy *RdbStoreProxy::GetNativeInstance(napi_env env, napi_value self)
222 {
223     RdbStoreProxy *proxy = nullptr;
224     napi_status status = napi_unwrap(env, self, reinterpret_cast<void **>(&proxy));
225     if (proxy == nullptr) {
226         LOG_ERROR("RdbStoreProxy::GetNativePredicates native instance is nullptr! code:%{public}d!", status);
227         return nullptr;
228     }
229     return proxy;
230 }
231 
ParserThis(const napi_env & env,const napi_value & self,std::shared_ptr<RdbStoreContext> context)232 int ParserThis(const napi_env &env, const napi_value &self, std::shared_ptr<RdbStoreContext> context)
233 {
234     RdbStoreProxy *obj = RdbStoreProxy::GetNativeInstance(env, self);
235     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("RdbStore", "not nullptr.");
236     RDB_CHECK_RETURN_CALL_RESULT(obj, context->SetError(paramError));
237     context->apiversion = obj->apiversion;
238     context->boundObj = obj;
239     LOG_DEBUG("ParserThis RdbStoreProxy is v%{public}d", obj->apiversion);
240     return OK;
241 }
242 
ParseTableName(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)243 int ParseTableName(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
244 {
245     context->tableName = JSUtils::Convert2String(env, arg);
246     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("table", "a non empty string.");
247     RDB_CHECK_RETURN_CALL_RESULT(!context->tableName.empty(), context->SetError(paramError));
248 
249     LOG_DEBUG("ParseTableName end");
250     return OK;
251 }
252 
ParseDevice(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)253 int ParseDevice(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
254 {
255     context->device = JSUtils::Convert2String(env, arg);
256     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("device", "a non empty string.");
257     RDB_CHECK_RETURN_CALL_RESULT(!context->device.empty(), context->SetError(paramError));
258 
259     LOG_DEBUG("ParseDevice end");
260     return OK;
261 }
262 
ParseTablesName(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)263 int ParseTablesName(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
264 {
265     uint32_t arrLen = 0;
266     napi_get_array_length(env, arg, &arrLen);
267     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("tables", "a string array.");
268     RDB_CHECK_RETURN_CALL_RESULT(arrLen >= 0, context->SetError(paramError));
269 
270     for (uint32_t i = 0; i < arrLen; ++i) {
271         napi_value element;
272         napi_get_element(env, arg, i, &element);
273         napi_valuetype type;
274         napi_typeof(env, element, &type);
275         if (type == napi_string) {
276             std::string table = JSUtils::Convert2String(env, element);
277             context->tablesName.push_back(table);
278         }
279     }
280     LOG_DEBUG("ParseTablesName end");
281     return OK;
282 }
283 
ParseSyncModeArg(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)284 int ParseSyncModeArg(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
285 {
286     napi_get_value_int32(env, arg, &context->enumArg);
287     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("mode", "a SyncMode.");
288     RDB_CHECK_RETURN_CALL_RESULT(context->enumArg == 0 || context->enumArg == 1, context->SetError(paramError));
289 
290     LOG_DEBUG("ParseSyncModeArg end");
291     return OK;
292 }
293 
CheckGlobalProperty(const napi_env env,const napi_value arg,const std::string & propertyName)294 bool CheckGlobalProperty(const napi_env env, const napi_value arg, const std::string &propertyName)
295 {
296     LOG_DEBUG("CheckGlobalProperty start: %{public}s", propertyName.c_str());
297     napi_value global = nullptr;
298     napi_status status = napi_get_global(env, &global);
299     if (status != napi_ok) {
300         return false;
301     }
302     napi_value constructor = nullptr;
303     status = napi_get_named_property(env, global, propertyName.c_str(), &constructor);
304     if (status != napi_ok) {
305         return false;
306     }
307     bool result = false;
308     status = napi_instanceof(env, arg, constructor, &result);
309     return (status == napi_ok ? result : false);
310 }
311 
ParsePredicates(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)312 int ParsePredicates(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
313 {
314     LOG_DEBUG("ParsePredicates start");
315     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("predicates", "an RdbPredicates.");
316     if (CheckGlobalProperty(env, arg, "RdbPredicatesConstructor")
317         || CheckGlobalProperty(env, arg, "RdbPredicatesConstructorV9")) {
318         LOG_DEBUG("Parse RDB Predicates");
319         napi_unwrap(env, arg, reinterpret_cast<void **>(&context->predicatesProxy));
320         RDB_CHECK_RETURN_CALL_RESULT(context->predicatesProxy != nullptr &&
321             context->predicatesProxy->GetPredicates() != nullptr, context->SetError(paramError));
322         context->tableName = context->predicatesProxy->GetPredicates()->GetTableName();
323         context->rdbPredicates = context->predicatesProxy->GetPredicates();
324         LOG_DEBUG("ParsePredicates end");
325         return OK;
326     }
327 
328     LOG_DEBUG("Isn't RdbPredicates, maybe DataShare Predicates.");
329 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
330     paramError = std::make_shared<ParamTypeError>("predicates", "an RdbPredicates or DataShare Predicates.");
331     PredicatesProxy *proxy = nullptr;
332     napi_unwrap(env, arg, reinterpret_cast<void **>(&proxy));
333     // proxy is nullptr, it isn't rdb predicates or datashare predicates
334     RDB_CHECK_RETURN_CALL_RESULT(proxy != nullptr, context->SetError(paramError));
335     // proxy is not nullptr, it's a datashare predicates.
336     LOG_DEBUG("Parse DataShare Predicates");
337     paramError = std::make_shared<ParamTypeError>("predicates", "an DataShare Predicates.");
338     LOG_ERROR("dsPredicates is null ? %{public}d", (proxy->predicates_ == nullptr));
339     RDB_CHECK_RETURN_CALL_RESULT(proxy->predicates_ != nullptr, context->SetError(paramError));
340     std::shared_ptr<DataShareAbsPredicates> dsPredicates = proxy->predicates_;
341     context->rdbPredicates = std::make_shared<RdbPredicates>(
342         RdbDataShareAdapter::RdbUtils::ToPredicates(*dsPredicates, context->tableName));
343 #endif
344     LOG_DEBUG("ParsePredicates end");
345     return OK;
346 }
347 
ParseSrcName(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)348 int ParseSrcName(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
349 {
350     context->srcName = JSUtils::Convert2String(env, arg);
351     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("srcName", "a non empty string.");
352     RDB_CHECK_RETURN_CALL_RESULT(!context->srcName.empty(), context->SetError(paramError));
353 
354     LOG_DEBUG("ParseSrcName end");
355     return OK;
356 }
357 
ParseColumns(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)358 int ParseColumns(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
359 {
360     napi_valuetype type;
361     napi_typeof(env, arg, &type);
362     if (type == napi_undefined || type == napi_null) {
363         return OK;
364     }
365     int32_t ret = JSUtils::Convert2Value(env, arg, context->columns);
366     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("columns", "a non empty string.");
367     RDB_CHECK_RETURN_CALL_RESULT(ret == napi_ok, context->SetError(paramError));
368     return OK;
369 }
370 
ParseWhereClause(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)371 int ParseWhereClause(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
372 {
373     context->whereClause = JSUtils::Convert2String(env, arg);
374     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("whereClause", "a non empty string.");
375     RDB_CHECK_RETURN_CALL_RESULT(!context->whereClause.empty(), context->SetError(paramError));
376 
377     LOG_DEBUG("ParseWhereClause end");
378     return OK;
379 }
380 
ParseAlias(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)381 int ParseAlias(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
382 {
383     context->aliasName = JSUtils::Convert2String(env, arg);
384     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("aliasName", "a non empty string.");
385     RDB_CHECK_RETURN_CALL_RESULT(!context->aliasName.empty(), context->SetError(paramError));
386 
387     LOG_DEBUG("ParseAlias end");
388     return OK;
389 }
390 
ParsePath(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)391 int ParsePath(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
392 {
393     context->pathName = JSUtils::Convert2String(env, arg);
394     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("pathName", "a non empty string.");
395     RDB_CHECK_RETURN_CALL_RESULT(!context->pathName.empty(), context->SetError(paramError));
396 
397     LOG_DEBUG("ParsePath end");
398     return OK;
399 }
400 
ParseWhereArgs(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)401 int ParseWhereArgs(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
402 {
403     napi_valuetype type;
404     napi_typeof(env, arg, &type);
405     if (type == napi_undefined || type == napi_null) {
406         return OK;
407     }
408     int32_t ret = JSUtils::Convert2Value(env, arg, context->whereArgs);
409     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("columns", "a non empty string.");
410     RDB_CHECK_RETURN_CALL_RESULT(ret == napi_ok, context->SetError(paramError));
411     return OK;
412 }
413 
ParseSelectionArgs(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)414 int ParseSelectionArgs(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
415 {
416     napi_valuetype type;
417     napi_typeof(env, arg, &type);
418     if (type == napi_undefined || type == napi_null) {
419         return OK;
420     }
421     int32_t ret = JSUtils::Convert2Value(env, arg, context->selectionArgs);
422     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("columns", "a non empty string.");
423     RDB_CHECK_RETURN_CALL_RESULT(ret == napi_ok, context->SetError(paramError));
424     return OK;
425 }
426 
ParseSql(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)427 int ParseSql(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
428 {
429     context->sql = JSUtils::Convert2String(env, arg);
430     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("sql", "a non empty string.");
431     RDB_CHECK_RETURN_CALL_RESULT(!context->sql.empty(), context->SetError(paramError));
432 
433     LOG_DEBUG("ParseSql end");
434     return OK;
435 }
436 
ParseValuesBucket(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)437 int ParseValuesBucket(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
438 {
439     napi_value keys = 0;
440     napi_get_property_names(env, arg, &keys);
441     uint32_t arrLen = 0;
442     napi_status status = napi_get_array_length(env, keys, &arrLen);
443     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("values", "a ValuesBucket.");
444     RDB_CHECK_RETURN_CALL_RESULT(status == napi_ok, context->SetError(paramError));
445 
446     for (size_t i = 0; i < arrLen; ++i) {
447         napi_value key;
448         status = napi_get_element(env, keys, i, &key);
449         if (status != napi_ok) {
450             LOG_DEBUG("ValuesBucket get_element errr");
451         }
452         RDB_CHECK_RETURN_CALL_RESULT(status == napi_ok, context->SetError(paramError));
453 
454         std::string keyStr = JSUtils::Convert2String(env, key);
455         napi_value value;
456         napi_get_property(env, arg, key, &value);
457 
458         ValueObject valueObject;
459         int32_t ret = JSUtils::Convert2Value(env, value, valueObject.value);
460         if (ret == napi_ok) {
461             context->valuesBucket.Put(keyStr, std::move(valueObject));
462         } else {
463             LOG_WARN("bad value type of key %{public}s", keyStr.c_str());
464         }
465     }
466     LOG_DEBUG("ParseValuesBucket end");
467     return OK;
468 }
469 
ParseValuesBuckets(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)470 int ParseValuesBuckets(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
471 {
472     bool isArray = false;
473     napi_is_array(env, arg, &isArray);
474     std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("values", "a ValuesBucket array.");
475     if (!isArray) {
476         context->insertNum = -1;
477         RDB_CHECK_RETURN_CALL_RESULT(isArray, context->SetError(paramError));
478     }
479     uint32_t arrLen = 0;
480     napi_status status = napi_get_array_length(env, arg, &arrLen);
481     RDB_CHECK_RETURN_CALL_RESULT(status == napi_ok || arrLen >= 0, context->SetError(paramError));
482 
483     for (uint32_t i = 0; i < arrLen; ++i) {
484         napi_value obj = nullptr;
485         status = napi_get_element(env, arg, i, &obj);
486         RDB_CHECK_RETURN_CALL_RESULT(status == napi_ok || arrLen >= 0, context->SetError(paramError));
487 
488         ParseValuesBucket(env, obj, context);
489         context->valuesBuckets.push_back(context->valuesBucket);
490         context->valuesBucket.Clear();
491     }
492     return OK;
493 }
494 
IsNapiString(napi_env env,napi_callback_info info)495 bool IsNapiString(napi_env env, napi_callback_info info)
496 {
497     constexpr size_t MIN_ARGC = 1;
498     size_t argc = MIN_ARGC;
499     napi_value args[1] = { 0 };
500     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
501     if (argc < MIN_ARGC) {
502         return false;
503     }
504     napi_valuetype type;
505     napi_typeof(env, args[0], &type);
506     if (type == napi_string) {
507         return true;
508     }
509     return false;
510 }
511 
Insert(napi_env env,napi_callback_info info)512 napi_value RdbStoreProxy::Insert(napi_env env, napi_callback_info info)
513 {
514     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
515     LOG_DEBUG("RdbStoreProxy::Insert start");
516     auto context = std::make_shared<RdbStoreContext>();
517     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
518         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
519         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
520         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
521         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseValuesBucket(env, argv[1], context));
522         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
523         return OK;
524     };
525     auto exec = [context]() {
526         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
527         int64_t rowId = 0;
528         LOG_DEBUG("RdbStoreProxy::Insert Async");
529         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
530         int errCode = obj->rdbStore_->Insert(rowId, context->tableName, context->valuesBucket);
531         context->rowId = rowId;
532         LOG_DEBUG("RdbStoreProxy::Insert errCode is: %{public}d", errCode);
533         return (errCode == E_OK) ? OK : ERR;
534     };
535     auto output = [context](napi_env env, napi_value &result) -> int {
536         napi_status status = napi_create_int64(env, context->rowId, &result);
537         LOG_DEBUG("RdbStoreProxy::Insert end");
538         return (status == napi_ok) ? OK : ERR;
539     };
540     context->SetAction(env, info, input, exec, output);
541 
542     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
543     return AsyncCall::Call(env, context);
544 }
545 
BatchInsert(napi_env env,napi_callback_info info)546 napi_value RdbStoreProxy::BatchInsert(napi_env env, napi_callback_info info)
547 {
548     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
549     LOG_DEBUG("RdbStoreProxy::BatchInsert start.");
550     auto context = std::make_shared<RdbStoreContext>();
551     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
552         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
553         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
554         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
555         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseValuesBuckets(env, argv[1], context));
556         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
557         return OK;
558     };
559     auto exec = [context]() {
560         LOG_INFO("RdbStoreProxy::BatchInsert Async.");
561         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
562         if (context->insertNum == -1UL) {
563             return E_OK;
564         }
565         int64_t outInsertNum = 0;
566         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
567         int errCode = obj->rdbStore_->BatchInsert(outInsertNum, context->tableName, context->valuesBuckets);
568         context->insertNum = outInsertNum;
569         return (errCode == E_OK) ? OK : ERR;
570     };
571     auto output = [context](napi_env env, napi_value &result) -> int {
572         napi_status status = napi_create_int64(env, context->insertNum, &result);
573         LOG_DEBUG("RdbStoreProxy::BatchInsert end.");
574         return (status == napi_ok) ? OK : ERR;
575     };
576     context->SetAction(env, info, input, exec, output);
577 
578     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
579     return AsyncCall::Call(env, context);
580 }
581 
Delete(napi_env env,napi_callback_info info)582 napi_value RdbStoreProxy::Delete(napi_env env, napi_callback_info info)
583 {
584     LOG_DEBUG("RdbStoreProxy::Delete start");
585     auto context = std::make_shared<RdbStoreContext>();
586     context->isNapiString = IsNapiString(env, info);
587     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
588         if (context->isNapiString) {
589             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
590             RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
591             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
592             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[1], context));
593         } else {
594             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1 or 2");
595             RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2, context->SetError(paramNumError));
596             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[0], context));
597         }
598         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
599         return OK;
600     };
601     auto exec = [context]() {
602         LOG_DEBUG("RdbStoreProxy::Delete Async");
603         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
604         int deletedRows = 0;
605         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
606         int errCode = obj->rdbStore_->Delete(deletedRows, *(context->rdbPredicates));
607         context->rowId = deletedRows;
608         LOG_DEBUG("RdbStoreProxy::Delete errCode is: %{public}d", errCode);
609         return (errCode == E_OK) ? OK : ERR;
610     };
611     auto output = [context](napi_env env, napi_value &result) -> int {
612         napi_status status = napi_create_int64(env, context->rowId, &result);
613         LOG_DEBUG("RdbStoreProxy::Delete end");
614         return (status == napi_ok) ? OK : ERR;
615     };
616     context->SetAction(env, info, input, exec, output);
617 
618     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
619     return AsyncCall::Call(env, context);
620 }
621 
Update(napi_env env,napi_callback_info info)622 napi_value RdbStoreProxy::Update(napi_env env, napi_callback_info info)
623 {
624     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
625     LOG_DEBUG("RdbStoreProxy::Update start");
626     auto context = std::make_shared<RdbStoreContext>();
627     context->isNapiString = IsNapiString(env, info);
628     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
629         if (context->isNapiString) {
630             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("3 or 4");
631             RDB_CHECK_RETURN_CALL_RESULT(argc == 3 || argc == 4, context->SetError(paramNumError));
632             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
633             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseValuesBucket(env, argv[1], context));
634             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[2], context));
635         } else {
636             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
637             RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
638             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseValuesBucket(env, argv[0], context));
639             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[1], context));
640         }
641         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
642         return OK;
643     };
644     auto exec = [context]() {
645         LOG_DEBUG("RdbStoreProxy::Update Async");
646         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
647         int changedRows = 0;
648         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
649         int errCode = obj->rdbStore_->Update(changedRows, context->valuesBucket, *(context->rdbPredicates));
650         context->rowId = changedRows;
651         LOG_DEBUG("RdbStoreProxy::Update errCode is: %{public}d", errCode);
652         return (errCode == E_OK) ? OK : ERR;
653     };
654     auto output = [context](napi_env env, napi_value &result) -> int {
655         napi_status status = napi_create_int64(env, context->rowId, &result);
656         LOG_DEBUG("RdbStoreProxy::Update end");
657         return (status == napi_ok) ? OK : ERR;
658     };
659     context->SetAction(env, info, input, exec, output);
660 
661     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
662     return AsyncCall::Call(env, context);
663 }
664 
Query(napi_env env,napi_callback_info info)665 napi_value RdbStoreProxy::Query(napi_env env, napi_callback_info info)
666 {
667     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
668     auto context = std::make_shared<RdbStoreContext>();
669     context->isNapiString = IsNapiString(env, info);
670     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
671         if (context->isNapiString) {
672             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1, 2 or 3");
673             RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2 || argc == 3, context->SetError(paramNumError));
674             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
675             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[1], context));
676             if (argc > 2) {
677                 RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseColumns(env, argv[2], context));
678             }
679         } else {
680             std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1 or 2");
681             RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2, context->SetError(paramNumError));
682             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[0], context));
683             if (argc > 1) {
684                 RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseColumns(env, argv[1], context));
685             }
686         }
687         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
688         return OK;
689     };
690     auto exec = [context]() {
691         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
692         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
693         context->resultSet = obj->rdbStore_->Query(*(context->rdbPredicates), context->columns);
694         LOG_DEBUG("RdbStoreProxy::Query result is nullptr ? %{public}d", (context->resultSet == nullptr));
695         return (context->resultSet != nullptr) ? OK : ERR;
696     };
697     auto output = [context](napi_env env, napi_value &result) -> int {
698         result = ResultSetProxy::NewInstance(
699             env, context->resultSet, context->apiversion);
700         return (result != nullptr) ? OK : ERR;
701     };
702     context->SetAction(env, info, input, exec, output);
703 
704     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
705     return AsyncCall::Call(env, context);
706 }
707 
QuerySql(napi_env env,napi_callback_info info)708 napi_value RdbStoreProxy::QuerySql(napi_env env, napi_callback_info info)
709 {
710     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
711     auto context = std::make_shared<RdbStoreContext>();
712     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
713         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1, 2 or 3");
714         RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2 || argc == 3, context->SetError(paramNumError));
715         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseSql(env, argv[0], context));
716         if (argc > 1) {
717 #if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM)
718             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseColumns(env, argv[1], context));
719 #else
720             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseSelectionArgs(env, argv[1], context));
721 #endif
722         }
723         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
724         return OK;
725     };
726     auto exec = [context]() {
727         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
728 #if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM)
729         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
730         context->resultSet = obj->rdbStore_->QueryByStep(context->sql, context->columns);
731         LOG_ERROR("RdbStoreProxy::QuerySql is nullptr ? %{public}d ", context->resultSet == nullptr);
732         return (context->resultSet != nullptr) ? OK : ERR;
733 #else
734         std::string selectionArgs = ",";
735         for (size_t i = 0; i < context->selectionArgs.size(); i++) {
736             selectionArgs += context->selectionArgs[i];
737         }
738         context->resultSet = obj->rdbStore_->QuerySql(context->sql, context->selectionArgs);
739         return (context->resultSet != nullptr) ? OK : ERR;
740 #endif
741     };
742     auto output = [context](napi_env env, napi_value &result) -> int {
743         result = ResultSetProxy::NewInstance(
744             env, context->resultSet, context->apiversion);
745         return (result != nullptr) ? OK : ERR;
746     };
747     context->SetAction(env, info, input, exec, output);
748 
749     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
750     return AsyncCall::Call(env, context);
751 }
752 
ParseBindArgs(const napi_env env,const napi_value arg,std::shared_ptr<RdbStoreContext> context)753 int ParseBindArgs(const napi_env env, const napi_value arg, std::shared_ptr<RdbStoreContext> context)
754 {
755     context->bindArgs.clear();
756     uint32_t arrLen = 0;
757     napi_get_array_length(env, arg, &arrLen);
758     if (arrLen == 0) {
759         return OK;
760     }
761     for (size_t i = 0; i < arrLen; ++i) {
762         napi_value element;
763         napi_get_element(env, arg, i, &element);
764 
765         ValueObject valueObject;
766         int32_t ret = JSUtils::Convert2Value(env, element, valueObject.value);
767         std::shared_ptr<Error> paramError = std::make_shared<ParamTypeError>("tables", "a string array.");
768         RDB_CHECK_RETURN_CALL_RESULT(ret == napi_ok, context->SetError(paramError));
769         context->bindArgs.push_back(valueObject);
770     }
771     return OK;
772 }
773 
ExecuteSql(napi_env env,napi_callback_info info)774 napi_value RdbStoreProxy::ExecuteSql(napi_env env, napi_callback_info info)
775 {
776     LOG_DEBUG("RdbStoreProxy::ExecuteSql start");
777     auto context = std::make_shared<RdbStoreContext>();
778     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
779         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1, 2 or 3");
780         RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2 || argc == 3, context->SetError(paramNumError));
781         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseSql(env, argv[0], context));
782         if (argc > 1) {
783             RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseBindArgs(env, argv[1], context));
784         }
785         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
786         return OK;
787     };
788     auto exec = [context]() {
789         LOG_DEBUG("RdbStoreProxy::ExecuteSql Async");
790         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
791         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
792         int errCode = obj->rdbStore_->ExecuteSql(context->sql, context->bindArgs);
793         LOG_DEBUG("RdbStoreProxy::ExecuteSql errCode is: %{public}d", errCode);
794         return (errCode == E_OK) ? OK : ERR;
795     };
796     auto output = [context](napi_env env, napi_value &result) -> int {
797         napi_status status = napi_get_undefined(env, &result);
798         LOG_DEBUG("RdbStoreProxy::ExecuteSql end");
799         return (status == napi_ok) ? OK : ERR;
800     };
801     context->SetAction(env, info, input, exec, output);
802 
803     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
804     return AsyncCall::Call(env, context);
805 }
806 
Count(napi_env env,napi_callback_info info)807 napi_value RdbStoreProxy::Count(napi_env env, napi_callback_info info)
808 {
809     LOG_DEBUG("RdbStoreProxy::Count start");
810     auto context = std::make_shared<RdbStoreContext>();
811     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
812         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1 or 2");
813         RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2, context->SetError(paramNumError));
814         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[0], context));
815         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
816         return OK;
817     };
818     auto exec = [context]() {
819         LOG_DEBUG("RdbStoreProxy::Count Async");
820         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
821         std::int64_t temp = 0;
822         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
823         CHECK_RETURN_ERR(context->predicatesProxy != nullptr &&
824             context->predicatesProxy->GetPredicates() != nullptr);
825         int errCode = obj->rdbStore_->Count(temp, *(context->predicatesProxy->GetPredicates()));
826         context->rowId = temp;
827         LOG_DEBUG("RdbStoreProxy::Count errCode is: %{public}d", errCode);
828         return (errCode == E_OK) ? OK : ERR;
829     };
830     auto output = [context](napi_env env, napi_value &result) -> int {
831         napi_status status = napi_create_int64(env, context->rowId, &result);
832         LOG_DEBUG("RdbStoreProxy::Count end");
833         return (status == napi_ok) ? OK : ERR;
834     };
835     context->SetAction(env, info, input, exec, output);
836 
837     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
838     return AsyncCall::Call(env, context);
839 }
840 
Replace(napi_env env,napi_callback_info info)841 napi_value RdbStoreProxy::Replace(napi_env env, napi_callback_info info)
842 {
843     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
844     LOG_DEBUG("RdbStoreProxy::Replace start");
845     auto context = std::make_shared<RdbStoreContext>();
846     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
847         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
848         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
849         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[0], context));
850         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseValuesBucket(env, argv[1], context));
851         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
852         return OK;
853     };
854     auto exec = [context]() {
855         LOG_DEBUG("RdbStoreProxy::Replace Async");
856         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
857         int64_t rowId = 0;
858         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
859         int errCode = obj->rdbStore_->Replace(rowId, context->tableName, context->valuesBucket);
860         context->rowId = rowId;
861         LOG_DEBUG("RdbStoreProxy::Replace errCode is:%{public}d", errCode);
862         return (errCode == E_OK) ? OK : ERR;
863     };
864     auto output = [context](napi_env env, napi_value &result) -> int {
865         napi_status status = napi_create_int64(env, context->rowId, &result);
866         LOG_DEBUG("RdbStoreProxy::Replace end");
867         return (status == napi_ok) ? OK : ERR;
868     };
869     context->SetAction(env, info, input, exec, output);
870 
871     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
872     return AsyncCall::Call(env, context);
873 }
874 
Attach(napi_env env,napi_callback_info info)875 napi_value RdbStoreProxy::Attach(napi_env env, napi_callback_info info)
876 {
877     LOG_DEBUG("RdbStoreProxy::Attach start");
878     auto context = std::make_shared<RdbStoreContext>();
879     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
880         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("3 or 4");
881         RDB_CHECK_RETURN_CALL_RESULT(argc == 3 || argc == 4, context->SetError(paramNumError));
882         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseAlias(env, argv[0], context));
883         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePath(env, argv[1], context));
884         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
885         return OK;
886     };
887     auto exec = [context]() {
888         LOG_DEBUG("RdbStoreProxy::Attach Async");
889         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
890         CHECK_RETURN_ERR(obj != nullptr && obj->rdbStore_ != nullptr);
891         int errCode = obj->rdbStore_->Attach(context->aliasName, context->pathName, context->newKey);
892         LOG_ERROR("RdbStoreProxy::Attach errCode is:%{public}d ", errCode);
893         return (errCode != E_OK) ? OK : ERR;
894     };
895     auto output = [context](napi_env env, napi_value &result) -> int {
896         napi_status status = napi_get_undefined(env, &result);
897         LOG_DEBUG("RdbStoreProxy::Attach end");
898         return (status == napi_ok) ? OK : ERR;
899     };
900     context->SetAction(env, info, input, exec, output);
901 
902     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
903     return AsyncCall::Call(env, context);
904 }
905 
IsHoldingConnection(napi_env env,napi_callback_info info)906 napi_value RdbStoreProxy::IsHoldingConnection(napi_env env, napi_callback_info info)
907 {
908     napi_value thisObj = nullptr;
909     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
910     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
911     NAPI_ASSERT(env, rdbStoreProxy != nullptr &&
912         rdbStoreProxy->rdbStore_ != nullptr, "RdbStoreProxy or rdbStore_ is nullptr");
913     bool out = rdbStoreProxy->rdbStore_->IsHoldingConnection();
914     LOG_DEBUG("RdbStoreProxy::IsHoldingConnection out is : %{public}d", out);
915     return JSUtils::Convert2JSValue(env, out);
916 }
917 
IsReadOnly(napi_env env,napi_callback_info info)918 napi_value RdbStoreProxy::IsReadOnly(napi_env env, napi_callback_info info)
919 {
920     napi_value thisObj = nullptr;
921     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
922     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
923     NAPI_ASSERT(env, rdbStoreProxy != nullptr
924         && rdbStoreProxy->rdbStore_ != nullptr, "RdbStoreProxy or rdbStore_ is nullptr");
925     bool out = rdbStoreProxy->rdbStore_->IsReadOnly();
926     LOG_DEBUG("RdbStoreProxy::IsReadOnly out is : %{public}d", out);
927     return JSUtils::Convert2JSValue(env, out);
928 }
929 
IsMemoryRdb(napi_env env,napi_callback_info info)930 napi_value RdbStoreProxy::IsMemoryRdb(napi_env env, napi_callback_info info)
931 {
932     napi_value thisObj = nullptr;
933     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
934     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
935     NAPI_ASSERT(env, rdbStoreProxy != nullptr
936         && rdbStoreProxy->rdbStore_ != nullptr, "RdbStoreProxy or rdbStore_ is nullptr");
937     bool out = rdbStoreProxy->rdbStore_->IsMemoryRdb();
938     LOG_DEBUG("RdbStoreProxy::IsMemoryRdb out is : %{public}d", out);
939     return JSUtils::Convert2JSValue(env, out);
940 }
941 
GetPath(napi_env env,napi_callback_info info)942 napi_value RdbStoreProxy::GetPath(napi_env env, napi_callback_info info)
943 {
944     napi_value thisObj = nullptr;
945     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
946     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
947     NAPI_ASSERT(env, rdbStoreProxy != nullptr
948         && rdbStoreProxy->rdbStore_ != nullptr, "RdbStoreProxy or rdbStore_ is nullptr");
949     std::string path = rdbStoreProxy->rdbStore_->GetPath();
950     LOG_DEBUG("RdbStoreProxy::GetPath path is empty ? %{public}d", path.empty());
951     return JSUtils::Convert2JSValue(env, path);
952 }
953 
BeginTransaction(napi_env env,napi_callback_info info)954 napi_value RdbStoreProxy::BeginTransaction(napi_env env, napi_callback_info info)
955 {
956     napi_value thisObj = nullptr;
957     NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr));
958     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
959     NAPI_ASSERT(env, rdbStoreProxy != nullptr
960         && rdbStoreProxy->rdbStore_ != nullptr, "RdbStoreProxy or rdbStore_ is nullptr");
961     int errCode = rdbStoreProxy->rdbStore_->BeginTransaction();
962     NAPI_ASSERT(env, errCode == E_OK, "call BeginTransaction failed");
963     LOG_DEBUG("RdbStoreProxy::BeginTransaction end, errCode is:%{public}d", errCode);
964     return nullptr;
965 }
966 
RollBack(napi_env env,napi_callback_info info)967 napi_value RdbStoreProxy::RollBack(napi_env env, napi_callback_info info)
968 {
969     napi_value thisObj = nullptr;
970     NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr));
971     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
972     NAPI_ASSERT(env, rdbStoreProxy != nullptr, "RdbStoreProxy is nullptr");
973     int errCode = rdbStoreProxy->rdbStore_->RollBack();
974     NAPI_ASSERT(env, errCode == E_OK, "call RollBack failed");
975     LOG_DEBUG("RdbStoreProxy::RollBack end, errCode is:%{public}d", errCode);
976     return nullptr;
977 }
978 
Commit(napi_env env,napi_callback_info info)979 napi_value RdbStoreProxy::Commit(napi_env env, napi_callback_info info)
980 {
981     napi_value thisObj = nullptr;
982     NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr));
983     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
984     NAPI_ASSERT(env, rdbStoreProxy != nullptr, "RdbStoreProxy is nullptr");
985     int errCode = rdbStoreProxy->rdbStore_->Commit();
986     NAPI_ASSERT(env, errCode == E_OK, "call Commit failed");
987     LOG_DEBUG("RdbStoreProxy::Commit end, errCode is:%{public}d", errCode);
988     return nullptr;
989 }
990 
QueryByStep(napi_env env,napi_callback_info info)991 napi_value RdbStoreProxy::QueryByStep(napi_env env, napi_callback_info info)
992 {
993     DISTRIBUTED_DATA_HITRACE(std::string(__FUNCTION__));
994     LOG_DEBUG("RdbStoreProxy::QueryByStep start");
995     auto context = std::make_shared<RdbStoreContext>();
996     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
997         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
998         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
999         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseSql(env, argv[0], context));
1000         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseColumns(env, argv[1], context));
1001         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
1002         return OK;
1003     };
1004     auto exec = [context]() {
1005         LOG_DEBUG("RdbStoreProxy::QueryByStep Async");
1006         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
1007         if (obj == nullptr || obj->rdbStore_ == nullptr) {
1008             return ERR;
1009         }
1010         context->stepResultSet = obj->rdbStore_->QueryByStep(context->sql, context->columns);
1011         LOG_ERROR("RdbStoreProxy::QueryByStep is nullptr ? %{public}d ", context->stepResultSet == nullptr);
1012         return (context->stepResultSet != nullptr) ? OK : ERR;
1013     };
1014     auto output = [context](napi_env env, napi_value &result) -> int {
1015         if (context->stepResultSet != nullptr) {
1016             result = ResultSetProxy::NewInstance(env, context->stepResultSet, context->apiversion);
1017         }
1018         LOG_DEBUG("RdbStoreProxy::QueryByStep end");
1019         return (result != nullptr) ? OK : ERR;
1020     };
1021     context->SetAction(env, info, input, exec, output);
1022 
1023     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
1024     return AsyncCall::Call(env, context);
1025 }
1026 
IsInTransaction(napi_env env,napi_callback_info info)1027 napi_value RdbStoreProxy::IsInTransaction(napi_env env, napi_callback_info info)
1028 {
1029     napi_value thisObj = nullptr;
1030     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
1031     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
1032     NAPI_ASSERT(env, rdbStoreProxy != nullptr, "RdbStoreProxy is nullptr");
1033     bool out = rdbStoreProxy->rdbStore_->IsInTransaction();
1034     LOG_DEBUG("RdbStoreProxy::IsInTransaction out is : %{public}d", out);
1035     return JSUtils::Convert2JSValue(env, out);
1036 }
1037 
IsOpen(napi_env env,napi_callback_info info)1038 napi_value RdbStoreProxy::IsOpen(napi_env env, napi_callback_info info)
1039 {
1040     napi_value thisObj = nullptr;
1041     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
1042     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
1043     NAPI_ASSERT(env, (rdbStoreProxy != nullptr) && (rdbStoreProxy->rdbStore_ != nullptr), "RdbStoreProxy is nullptr");
1044     bool out = rdbStoreProxy->rdbStore_->IsOpen();
1045     LOG_DEBUG("RdbStoreProxy::IsOpen out is : %{public}d", out);
1046     return JSUtils::Convert2JSValue(env, out);
1047 }
1048 
GetVersion(napi_env env,napi_callback_info info)1049 napi_value RdbStoreProxy::GetVersion(napi_env env, napi_callback_info info)
1050 {
1051     napi_value thisObj = nullptr;
1052     napi_get_cb_info(env, info, nullptr, nullptr, &thisObj, nullptr);
1053     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thisObj);
1054     NAPI_ASSERT(env, (rdbStoreProxy != nullptr) && (rdbStoreProxy->rdbStore_ != nullptr), "RdbStoreProxy is nullptr");
1055     int32_t version = 0;
1056     int out = rdbStoreProxy->rdbStore_->GetVersion(version);
1057     LOG_DEBUG("RdbStoreProxy::GetVersion out is : %{public}d", out);
1058     return JSUtils::Convert2JSValue(env, version);
1059 }
1060 
SetVersion(napi_env env,napi_callback_info info)1061 napi_value RdbStoreProxy::SetVersion(napi_env env, napi_callback_info info)
1062 {
1063     napi_value thiz;
1064     size_t argc = 1;
1065     napi_value args[1] = { 0 };
1066     napi_get_cb_info(env, info, &argc, args, &thiz, nullptr);
1067     NAPI_ASSERT(env, argc == 1, "RdbStoreProxy::SetVersion Invalid argvs!");
1068     RdbStoreProxy *rdbStoreProxy = GetNativeInstance(env, thiz);
1069     NAPI_ASSERT(env, (rdbStoreProxy != nullptr) && (rdbStoreProxy->rdbStore_ != nullptr), "RdbStoreProxy is nullptr");
1070     int32_t version = 0;
1071     napi_get_value_int32(env, args[0], &version);
1072     int out = rdbStoreProxy->rdbStore_->SetVersion(version);
1073     LOG_DEBUG("RdbStoreProxy::SetVersion out is : %{public}d", out);
1074     return nullptr;
1075 }
1076 
1077 #if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM)
SetDistributedTables(napi_env env,napi_callback_info info)1078 napi_value RdbStoreProxy::SetDistributedTables(napi_env env, napi_callback_info info)
1079 {
1080     LOG_DEBUG("RdbStoreProxy::SetDistributedTables start");
1081     auto context = std::make_shared<RdbStoreContext>();
1082     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
1083         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("1 or 2");
1084         RDB_CHECK_RETURN_CALL_RESULT(argc == 1 || argc == 2, context->SetError(paramNumError));
1085         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTablesName(env, argv[0], context));
1086         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
1087         return OK;
1088     };
1089     auto exec = [context]() {
1090         LOG_DEBUG("RdbStoreProxy::SetDistributedTables Async");
1091         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
1092         if (obj == nullptr || obj->rdbStore_.get() == nullptr) {
1093             return ERR;
1094         }
1095         int res = obj->rdbStore_->SetDistributedTables(context->tablesName);
1096         LOG_DEBUG("RdbStoreProxy::SetDistributedTables res is : %{public}d", res);
1097         return (res == E_OK || res == E_NOT_SUPPORTED) ? OK : ERR;
1098     };
1099     auto output = [context](napi_env env, napi_value &result) -> int {
1100         napi_status status = napi_get_undefined(env, &result);
1101         LOG_DEBUG("RdbStoreProxy::SetDistributedTables end");
1102         return (status == napi_ok) ? OK : ERR;
1103     };
1104     context->SetAction(env, info, input, exec, output);
1105 
1106     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
1107     return AsyncCall::Call(env, context);
1108 }
1109 
ObtainDistributedTableName(napi_env env,napi_callback_info info)1110 napi_value RdbStoreProxy::ObtainDistributedTableName(napi_env env, napi_callback_info info)
1111 {
1112     LOG_DEBUG("RdbStoreProxy::ObtainDistributedTableName start");
1113     auto context = std::make_shared<RdbStoreContext>();
1114     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
1115         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
1116         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
1117         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseDevice(env, argv[0], context));
1118         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseTableName(env, argv[1], context));
1119         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
1120         return OK;
1121     };
1122     auto exec = [context]() {
1123         LOG_DEBUG("RdbStoreProxy::ObtainDistributedTableName Async");
1124         RdbStoreProxy *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
1125         int errCode = E_ERROR;
1126         if (obj == nullptr || obj->rdbStore_.get() == nullptr) {
1127             return ERR;
1128         }
1129         auto name = obj->rdbStore_->ObtainDistributedTableName(context->device, context->tableName, errCode);
1130         LOG_INFO("RdbStoreProxy::ObtainDistributedTableName name is empty ? : %{public}d, errCode is %{public}d",
1131             name.empty(), errCode);
1132         context->tableName = name;
1133         return name.empty() ? ERR : OK;
1134     };
1135     auto output = [context](napi_env env, napi_value &result) -> int {
1136         napi_status status =
1137             napi_create_string_utf8(env, context->tableName.c_str(), context->tableName.length(), &result);
1138         LOG_DEBUG("RdbStoreProxy::ObtainDistributedTableName end");
1139         return (status == napi_ok) ? OK : ERR;
1140     };
1141     context->SetAction(env, info, input, exec, output);
1142 
1143     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
1144     return AsyncCall::Call(env, context);
1145 }
1146 
Sync(napi_env env,napi_callback_info info)1147 napi_value RdbStoreProxy::Sync(napi_env env, napi_callback_info info)
1148 {
1149     LOG_DEBUG("RdbStoreProxy::Sync start");
1150     auto context = std::make_shared<RdbStoreContext>();
1151     auto input = [context](napi_env env, size_t argc, napi_value *argv, napi_value self) -> int {
1152         std::shared_ptr<Error> paramNumError = std::make_shared<ParamNumError>("2 or 3");
1153         RDB_CHECK_RETURN_CALL_RESULT(argc == 2 || argc == 3, context->SetError(paramNumError));
1154         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParseSyncModeArg(env, argv[0], context));
1155         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParsePredicates(env, argv[1], context));
1156         RDB_ASYNC_PARAM_CHECK_FUNCTION(ParserThis(env, self, context));
1157         return OK;
1158     };
1159     auto exec = [context]() {
1160         LOG_DEBUG("RdbStoreProxy::Sync Async");
1161         auto *obj = reinterpret_cast<RdbStoreProxy *>(context->boundObj);
1162         SyncOption option;
1163         option.mode = static_cast<DistributedRdb::SyncMode>(context->enumArg);
1164         option.isBlock = true;
1165         if (obj == nullptr || obj->rdbStore_.get() == nullptr) {
1166             return ERR;
1167         }
1168         int res = obj->rdbStore_->Sync(option, *context->predicatesProxy->GetPredicates(),
1169             [context](const SyncResult &result) { context->syncResult = result; });
1170         LOG_INFO("RdbStoreProxy::Sync res is : %{public}d", res);
1171         return res == E_OK ? OK : ERR;
1172     };
1173     auto output = [context](napi_env env, napi_value &result) -> int {
1174         result = JSUtils::Convert2JSValue(env, context->syncResult);
1175         LOG_DEBUG("RdbStoreProxy::Sync end");
1176         return (result != nullptr) ? OK : ERR;
1177     };
1178     context->SetAction(env, info, input, exec, output);
1179 
1180     RDB_CHECK_RETURN_NULLPTR(context->error == nullptr || context->error->GetCode() == OK, "");
1181     return AsyncCall::Call(env, context);
1182 }
1183 
OnDataChangeEvent(napi_env env,size_t argc,napi_value * argv)1184 void RdbStoreProxy::OnDataChangeEvent(napi_env env, size_t argc, napi_value *argv)
1185 {
1186     napi_valuetype type;
1187     napi_typeof(env, argv[0], &type);
1188     if (type != napi_number) {
1189         LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: first argument is not number");
1190         return;
1191     }
1192     int32_t mode = SubscribeMode::SUBSCRIBE_MODE_MAX;
1193     napi_get_value_int32(env, argv[0], &mode);
1194     if (mode < 0 || mode >= SubscribeMode::SUBSCRIBE_MODE_MAX) {
1195         LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: first argument value is invalid");
1196         return;
1197     }
1198     LOG_INFO("RdbStoreProxy::OnDataChangeEvent: mode=%{public}d", mode);
1199 
1200     napi_typeof(env, argv[1], &type);
1201     if (type != napi_function) {
1202         LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: second argument is not function");
1203         return;
1204     }
1205 
1206     std::lock_guard<std::mutex> lockGuard(mutex_);
1207     for (const auto &observer : observers_[mode]) {
1208         if (observer != nullptr && *observer == argv[1]) {
1209             LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: duplicate subscribe");
1210             return;
1211         }
1212     }
1213     SubscribeOption option;
1214     option.mode = static_cast<SubscribeMode>(mode);
1215     auto observer = std::make_shared<NapiRdbStoreObserver>(env, argv[1]);
1216     int errCode = rdbStore_->Subscribe(option, observer.get());
1217     if (errCode != E_OK) {
1218         LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: subscribe failed");
1219         return;
1220     }
1221     observers_[mode].push_back(observer);
1222     LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: subscribe success");
1223 }
1224 
OffDataChangeEvent(napi_env env,size_t argc,napi_value * argv)1225 void RdbStoreProxy::OffDataChangeEvent(napi_env env, size_t argc, napi_value *argv)
1226 {
1227     napi_valuetype type;
1228     napi_typeof(env, argv[0], &type);
1229     if (type != napi_number) {
1230         LOG_ERROR("RdbStoreProxy::OffDataChangeEvent: first argument is not number");
1231         return;
1232     }
1233     int32_t mode = SubscribeMode::SUBSCRIBE_MODE_MAX;
1234     napi_get_value_int32(env, argv[0], &mode);
1235     if (mode < 0 || mode >= SubscribeMode::SUBSCRIBE_MODE_MAX) {
1236         LOG_ERROR("RdbStoreProxy::OffDataChangeEvent: first argument value is invalid");
1237         return;
1238     }
1239     LOG_INFO("RdbStoreProxy::OffDataChangeEvent: mode=%{public}d", mode);
1240 
1241     napi_typeof(env, argv[1], &type);
1242     if (type != napi_function) {
1243         LOG_ERROR("RdbStoreProxy::OffDataChangeEvent: second argument is not function");
1244         return;
1245     }
1246 
1247     SubscribeOption option;
1248     option.mode = static_cast<SubscribeMode>(mode);
1249     std::lock_guard<std::mutex> lockGuard(mutex_);
1250     for (auto it = observers_[mode].begin(); it != observers_[mode].end(); it++) {
1251         if (*it != nullptr && **it == argv[1]) {
1252             if (rdbStore_.get() == nullptr) {
1253                 LOG_ERROR("RdbStoreProxy::OnDataChangeEvent: rdbStore_ invalid");
1254                 return;
1255             }
1256             rdbStore_->UnSubscribe(option, it->get());
1257             observers_[mode].erase(it);
1258             LOG_INFO("RdbStoreProxy::OffDataChangeEvent: unsubscribe success");
1259             return;
1260         }
1261     }
1262     LOG_INFO("RdbStoreProxy::OffDataChangeEvent: not found");
1263 }
1264 
OnEvent(napi_env env,napi_callback_info info)1265 napi_value RdbStoreProxy::OnEvent(napi_env env, napi_callback_info info)
1266 {
1267     size_t argc = MAX_ON_EVENT_ARG_NUM;
1268     napi_value argv[MAX_ON_EVENT_ARG_NUM]{};
1269     napi_value self = nullptr;
1270     if (napi_get_cb_info(env, info, &argc, argv, &self, nullptr) != napi_ok) {
1271         LOG_ERROR("RdbStoreProxy::OnEvent: get args failed");
1272         return nullptr;
1273     }
1274     bool invalid_condition = argc < MIN_ON_EVENT_ARG_NUM || argc > MAX_ON_EVENT_ARG_NUM || self == nullptr;
1275     NAPI_ASSERT(env, !invalid_condition, "RdbStoreProxy::OnEvent: invalid args");
1276 
1277     auto proxy = RdbStoreProxy::GetNativeInstance(env, self);
1278     NAPI_ASSERT(env, proxy != nullptr, "RdbStoreProxy::OnEvent: invalid args");
1279 
1280     std::string event = JSUtils::Convert2String(env, argv[0]);
1281     if (event == "dataChange") {
1282         proxy->OnDataChangeEvent(env, argc - 1, argv + 1);
1283     }
1284 
1285     LOG_INFO("RdbStoreProxy::OnEvent end");
1286     return nullptr;
1287 }
1288 
OffEvent(napi_env env,napi_callback_info info)1289 napi_value RdbStoreProxy::OffEvent(napi_env env, napi_callback_info info)
1290 {
1291     size_t argc = MAX_ON_EVENT_ARG_NUM;
1292     napi_value argv[MAX_ON_EVENT_ARG_NUM]{};
1293     napi_value self = nullptr;
1294     if (napi_get_cb_info(env, info, &argc, argv, &self, nullptr) != napi_ok) {
1295         LOG_ERROR("RdbStoreProxy::OffEvent: get args failed");
1296         return nullptr;
1297     }
1298     bool invalid_condition = argc < MIN_ON_EVENT_ARG_NUM || argc > MAX_ON_EVENT_ARG_NUM || self == nullptr;
1299     NAPI_ASSERT(env, !invalid_condition, "RdbStoreProxy::OffEvent: invalid args");
1300 
1301     auto proxy = RdbStoreProxy::GetNativeInstance(env, self);
1302     NAPI_ASSERT(env, proxy != nullptr, "RdbStoreProxy::OffEvent: invalid args");
1303 
1304     std::string event = JSUtils::Convert2String(env, argv[0]);
1305     if (event == "dataChange") {
1306         proxy->OffDataChangeEvent(env, argc - 1, argv + 1);
1307     }
1308 
1309     LOG_INFO("RdbStoreProxy::OffEvent end");
1310     return nullptr;
1311 }
1312 #endif
1313 } // namespace RdbJsKit
1314 } // namespace OHOS
1315