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