1 /*
2 * Copyright (c) 2025 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 #define LOG_TAG "NapiCloudDb"
17
18 #include <future>
19
20 #include "napi_cloud_db.h"
21
22 #include "napi_errno.h"
23 #include "napi_error_utils.h"
24 #include "napi_parser.h"
25 #include "napi_utils.h"
26 #include "napi/native_node_api.h"
27
28 namespace OHOS::CollaborationEdit {
29 constexpr size_t HANDLER_PARAM_NUM = 1;
30 constexpr size_t PROMISE_PARAM_NUM = 2;
31 const std::string CURSOR = "cursor";
32
33 enum CallBackResult : int32_t {
34 CALL_BACK_RESULT_INVALID = -1,
35 CALL_BACK_RESULT_OK = 0,
36 CALL_BACK_RESULT_ERR,
37 CALL_BACK_RESULT_QUERY_END,
38 };
39
40 struct BatchInsertInfo {
41 std::vector<CloudParamsAdapterT> inputParam;
42 std::promise<int> promiseRes;
43 int32_t callBackErrCode;
44 };
45
46 struct AssetInfo {
47 AssetOpConfig config;
48 std::promise<void> promiseRes;
49 int32_t callBackErrCode;
50 };
51
52 struct QueryInfo {
53 std::vector<QueryConditionT> inputParam;
54 std::promise<std::vector<CloudParamsAdapterT>> promiseRes;
55 int32_t callBackErrCode;
56 };
57
NapiCloudDb()58 NapiCloudDb::NapiCloudDb() {}
59
~NapiCloudDb()60 NapiCloudDb::~NapiCloudDb()
61 {
62 napi_release_threadsafe_function(batchInsertInnerFunc_, napi_tsfn_release);
63 napi_release_threadsafe_function(queryInnerFunc_, napi_tsfn_release);
64 napi_release_threadsafe_function(downloadAssetInnerFunc_, napi_tsfn_release);
65 napi_release_threadsafe_function(uploadAssetInnerFunc_, napi_tsfn_release);
66 napi_release_threadsafe_function(deleteAssetInnerFunc_, napi_tsfn_release);
67 napi_release_threadsafe_function(deleteLocalAssetInnerFunc_, napi_tsfn_release);
68
69 batchInsertInnerFunc_ = nullptr;
70 queryInnerFunc_ = nullptr;
71 downloadAssetInnerFunc_ = nullptr;
72 uploadAssetInnerFunc_ = nullptr;
73 deleteAssetInnerFunc_ = nullptr;
74 deleteLocalAssetInnerFunc_ = nullptr;
75 }
76
BatchInsert(const std::vector<CloudParamsAdapterT> & cloudParamsAdapter)77 int32_t NapiCloudDb::BatchInsert(const std::vector<CloudParamsAdapterT> &cloudParamsAdapter)
78 {
79 napi_status ret = napi_acquire_threadsafe_function(batchInsertInnerFunc_);
80 if (ret != napi_ok) {
81 LOG_ERROR("[BatchInsert] acquire thread function go wrong, ret=%{public}d", ret);
82 return CALL_BACK_RESULT_ERR;
83 }
84 BatchInsertInfo *batchInsertInfo = new BatchInsertInfo();
85 batchInsertInfo->inputParam = cloudParamsAdapter;
86
87 auto future = batchInsertInfo->promiseRes.get_future();
88 ret = napi_call_threadsafe_function(batchInsertInnerFunc_, reinterpret_cast<void *>(batchInsertInfo),
89 napi_tsfn_blocking);
90 if (ret != napi_ok) {
91 LOG_ERROR("[BatchInsert] call thread function go wrong, ret=%{public}d", ret);
92 delete batchInsertInfo;
93 return CALL_BACK_RESULT_ERR;
94 }
95 auto result = future.get();
96
97 int32_t errCode = batchInsertInfo->callBackErrCode;
98 LOG_INFO("[BatchInsert] batch insert complete, result = %{public}d, errCode = %{public}d", result, errCode);
99 delete batchInsertInfo;
100 return errCode;
101 }
102
Query(const std::vector<QueryConditionT> & queryConditions,std::vector<CloudParamsAdapterT> & extends)103 int32_t NapiCloudDb::Query(const std::vector<QueryConditionT> &queryConditions,
104 std::vector<CloudParamsAdapterT> &extends)
105 {
106 napi_status ret = napi_acquire_threadsafe_function(queryInnerFunc_);
107 if (ret != napi_ok) {
108 LOG_ERROR("acquire thread function go wrong, ret=%{public}d", ret);
109 return CALL_BACK_RESULT_ERR;
110 }
111 QueryInfo *queryInfo = new QueryInfo();
112 queryInfo->inputParam = queryConditions;
113
114 auto future = queryInfo->promiseRes.get_future();
115 ret = napi_call_threadsafe_function(queryInnerFunc_, reinterpret_cast<void *>(queryInfo), napi_tsfn_blocking);
116 if (ret != napi_ok) {
117 LOG_ERROR("call thread function go wrong, ret=%{public}d", ret);
118 delete queryInfo;
119 return CALL_BACK_RESULT_ERR;
120 }
121 auto result = future.get();
122 extends = std::move(result);
123
124 int32_t errCode = queryInfo->callBackErrCode;
125 LOG_INFO("query complete, result size = %{public}zu, errCode = %{public}d", extends.size(), errCode);
126 delete queryInfo;
127 return errCode;
128 }
129
DownloadAsset(const std::string equipId,std::string path)130 int32_t NapiCloudDb::DownloadAsset(const std::string equipId, std::string path)
131 {
132 napi_status ret = napi_acquire_threadsafe_function(downloadAssetInnerFunc_);
133 if (ret != napi_ok) {
134 LOG_ERROR("[DownloadAsset] acquire thread function go wrong, ret=%{public}d", ret);
135 return CALL_BACK_RESULT_ERR;
136 }
137 AssetInfo *downloadAssetInfo = new AssetInfo();
138 downloadAssetInfo->config.inputPath = path;
139 ret = napi_call_threadsafe_function(downloadAssetInnerFunc_, (void*)downloadAssetInfo, napi_tsfn_blocking);
140 if (ret != napi_ok) {
141 LOG_ERROR("[DownloadAsset] call thread function go wrong, ret=%{public}d", ret);
142 delete downloadAssetInfo;
143 return CALL_BACK_RESULT_ERR;
144 }
145
146 LOG_INFO("[DownloadAsset] download asset complete");
147 return CALL_BACK_RESULT_OK;
148 }
149
UploadAsset(const std::string path)150 int32_t NapiCloudDb::UploadAsset(const std::string path)
151 {
152 napi_status ret = napi_acquire_threadsafe_function(uploadAssetInnerFunc_);
153 if (ret != napi_ok) {
154 LOG_ERROR("[UploadAsset] acquire thread function go wrong, ret=%{public}d", ret);
155 return CALL_BACK_RESULT_ERR;
156 }
157 AssetInfo *assetInfo = new AssetInfo();
158 assetInfo->config.inputPath = path;
159 auto future = assetInfo->promiseRes.get_future();
160 ret = napi_call_threadsafe_function(uploadAssetInnerFunc_, (void*)assetInfo, napi_tsfn_blocking);
161 if (ret != napi_ok) {
162 LOG_ERROR("[UploadAsset] call thread function go wrong, ret=%{public}d", ret);
163 delete assetInfo;
164 return CALL_BACK_RESULT_ERR;
165 }
166 future.wait();
167
168 int32_t errCode = assetInfo->callBackErrCode;
169 LOG_INFO("[UploadAsset] upload asset complete, errCode=%{public}d", errCode);
170 delete assetInfo;
171 return errCode;
172 }
173
DeleteAsset(const std::string path)174 int32_t NapiCloudDb::DeleteAsset(const std::string path)
175 {
176 napi_status ret = napi_acquire_threadsafe_function(deleteAssetInnerFunc_);
177 if (ret != napi_ok) {
178 LOG_ERROR("[DeleteAsset] acquire thread function go wrong, ret=%{public}d", ret);
179 return CALL_BACK_RESULT_ERR;
180 }
181 AssetInfo *assetInfo = new AssetInfo();
182 assetInfo->config.inputPath = path;
183 auto future = assetInfo->promiseRes.get_future();
184 ret = napi_call_threadsafe_function(deleteAssetInnerFunc_, (void*)assetInfo, napi_tsfn_blocking);
185 if (ret != napi_ok) {
186 LOG_ERROR("[DeleteAsset] call thread function go wrong, ret=%{public}d", ret);
187 delete assetInfo;
188 return CALL_BACK_RESULT_ERR;
189 }
190 future.wait();
191
192 int32_t errCode = assetInfo->callBackErrCode;
193 LOG_INFO("[DeleteAsset] Delete asset complete, errCode=%{public}d", errCode);
194 delete assetInfo;
195 return errCode;
196 }
197
DeleteLocalAsset(const std::string path)198 int32_t NapiCloudDb::DeleteLocalAsset(const std::string path)
199 {
200 napi_status ret = napi_acquire_threadsafe_function(deleteLocalAssetInnerFunc_);
201 if (ret != napi_ok) {
202 LOG_ERROR("[DeleteLocalAsset] acquire thread function go wrong, ret=%{public}d", ret);
203 return CALL_BACK_RESULT_ERR;
204 }
205 AssetInfo *assetInfo = new AssetInfo();
206 assetInfo->config.inputPath = path;
207 ret = napi_call_threadsafe_function(deleteLocalAssetInnerFunc_, (void*)assetInfo, napi_tsfn_blocking);
208 if (ret != napi_ok) {
209 LOG_ERROR("[DeleteLocalAsset] call thread function go wrong, ret=%{public}d", ret);
210 delete assetInfo;
211 return CALL_BACK_RESULT_ERR;
212 }
213
214 LOG_INFO("[DeleteLocalAsset] delete local asset complete");
215 return CALL_BACK_RESULT_OK;
216 }
217
GetCloudParamsVector(napi_env env,void * data,napi_value & arrayParams)218 void NapiCloudDb::GetCloudParamsVector(napi_env env, void *data, napi_value &arrayParams)
219 {
220 int i = 0;
221 std::vector<CloudParamsAdapterT> *cloudParamsAdapter = reinterpret_cast<std::vector<CloudParamsAdapterT> *>(data);
222 if (cloudParamsAdapter == nullptr) {
223 return;
224 }
225 for (const auto ¶msAdapter : *cloudParamsAdapter) {
226 napi_value cursor = nullptr;
227 NapiUtils::SetValue(env, paramsAdapter.cursor, cursor);
228 napi_value id = nullptr;
229 NapiUtils::SetValue(env, paramsAdapter.id, id);
230 napi_value record = nullptr;
231 NapiUtils::SetValue(env, paramsAdapter.record, record);
232
233 napi_value editObjectRecord = nullptr;
234 napi_create_object(env, &editObjectRecord);
235 napi_set_named_property(env, editObjectRecord, "cursor", cursor);
236 napi_set_named_property(env, editObjectRecord, "id", id);
237 napi_set_named_property(env, editObjectRecord, "data", record);
238
239 napi_set_element(env, arrayParams, i, editObjectRecord);
240 i++;
241 }
242 }
243
GetJsQueryParams(napi_env env,std::vector<QueryConditionT> conditions,napi_value & arrayParams)244 void NapiCloudDb::GetJsQueryParams(napi_env env, std::vector<QueryConditionT> conditions, napi_value &arrayParams)
245 {
246 uint32_t i = 0;
247 for (QueryConditionT condition : conditions) {
248 napi_value predicate = nullptr;
249 napi_value fieldName = nullptr;
250 napi_value fieldValue = nullptr;
251
252 NapiUtils::SetValue(env, static_cast<int32_t>(condition.predicate), predicate);
253 NapiUtils::SetValue(env, condition.fieldName, fieldName);
254 if (condition.fieldName == CURSOR) {
255 NapiUtils::SetValue(env, condition.fieldValue_num, fieldValue);
256 } else {
257 NapiUtils::SetValue(env, condition.fieldValue_str, fieldValue);
258 }
259
260 napi_value queryCondition = nullptr;
261 napi_create_object(env, &queryCondition);
262 napi_set_named_property(env, queryCondition, "condition", predicate);
263 napi_set_named_property(env, queryCondition, "fieldName", fieldName);
264 napi_set_named_property(env, queryCondition, "fieldValue", fieldValue);
265
266 napi_set_element(env, arrayParams, i, queryCondition);
267 i++;
268 }
269 }
270
BatchInsertInner(napi_env env,napi_value jsCb,void * context,void * data)271 void NapiCloudDb::BatchInsertInner(napi_env env, napi_value jsCb, void *context, void *data)
272 {
273 BatchInsertInfo *batchInsertInfo = reinterpret_cast<BatchInsertInfo *>(data);
274 std::vector<CloudParamsAdapterT> inputParam = batchInsertInfo->inputParam;
275 napi_value arrayParams = nullptr;
276 napi_status status = napi_create_array(env, &arrayParams);
277 if (status != napi_ok) {
278 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
279 return;
280 }
281 GetCloudParamsVector(env, &inputParam, arrayParams);
282
283 napi_value promise = nullptr;
284 status = napi_call_function(env, nullptr, jsCb, HANDLER_PARAM_NUM, &arrayParams, &promise);
285 if (status != napi_ok) {
286 LOG_ERROR("[BatchInsertInner] napi call function go wrong, status = %{public}d", status);
287 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
288 return;
289 }
290 napi_value thenFunc = nullptr;
291 status = napi_get_named_property(env, promise, "then", &thenFunc);
292 if (status != napi_ok) {
293 LOG_ERROR("[BatchInsertInner] napi get named property fail, status = %{public}d", status);
294 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
295 return;
296 }
297 napi_value resolvedCallback;
298 napi_value rejectedCallback;
299 status = napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH,
300 NapiCloudDb::BatchInsertResolvedCallback, data, &resolvedCallback);
301 if (status != napi_ok) {
302 LOG_ERROR("[BatchInsertInner] resolvedCallback, status = %{public}d", status);
303 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
304 return;
305 }
306 status = napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH,
307 NapiCloudDb::BatchInsertRejectedCallback, data, &rejectedCallback);
308 if (status != napi_ok) {
309 LOG_ERROR("[BatchInsertInner] rejectedCallback, status = %{public}d", status);
310 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
311 return;
312 }
313 napi_value argv[2] = {resolvedCallback, rejectedCallback};
314 batchInsertInfo->callBackErrCode = CALL_BACK_RESULT_INVALID;
315 status = napi_call_function(env, promise, thenFunc, PROMISE_PARAM_NUM, argv, nullptr);
316 if (batchInsertInfo->callBackErrCode == CALL_BACK_RESULT_INVALID) {
317 batchInsertInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
318 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
319 LOG_ERROR("[BatchInsertInner] napi call function go wrong");
320 }
321 ClearLastException(env);
322 }
323
QueryInner(napi_env env,napi_value jsCb,void * context,void * data)324 void NapiCloudDb::QueryInner(napi_env env, napi_value jsCb, void *context, void *data)
325 {
326 QueryInfo *queryInfo = reinterpret_cast<QueryInfo *>(data);
327 std::vector<QueryConditionT> inputParam = queryInfo->inputParam;
328 napi_value arrayParams = nullptr;
329 napi_status status = napi_create_array(env, &arrayParams);
330 if (status != napi_ok) {
331 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
332 return;
333 }
334 GetJsQueryParams(env, inputParam, arrayParams);
335
336 napi_value promise = nullptr;
337 status = napi_call_function(env, nullptr, jsCb, HANDLER_PARAM_NUM, &arrayParams, &promise);
338 if (status != napi_ok) {
339 LOG_ERROR("napi call function go wrong, status = %{public}d", status);
340 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
341 return;
342 }
343
344 napi_value thenFunc = nullptr;
345 status = napi_get_named_property(env, promise, "then", &thenFunc);
346 if (status != napi_ok) {
347 LOG_ERROR("napi get named property fail, status = %{public}d", status);
348 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
349 return;
350 }
351 napi_value resolvedCallback;
352 napi_value rejectedCallback;
353 status = napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH,
354 NapiCloudDb::QueryResolvedCallback, data, &resolvedCallback);
355 if (status != napi_ok) {
356 LOG_ERROR("resolvedCallback, status = %{public}d", status);
357 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
358 return;
359 }
360 status = napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH,
361 NapiCloudDb::QueryRejectedCallback, data, &rejectedCallback);
362 if (status != napi_ok) {
363 LOG_ERROR("rejectedCallback, status = %{public}d", status);
364 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
365 return;
366 }
367 napi_value argv[2] = {resolvedCallback, rejectedCallback};
368 queryInfo->callBackErrCode = CALL_BACK_RESULT_INVALID;
369 status = napi_call_function(env, promise, thenFunc, PROMISE_PARAM_NUM, argv, nullptr);
370 if (queryInfo->callBackErrCode == CALL_BACK_RESULT_INVALID) {
371 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
372 queryInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
373 LOG_ERROR("napi call function go wrong");
374 }
375 ClearLastException(env);
376 }
377
DownloadAssetInner(napi_env env,napi_value jsCb,void * context,void * data)378 void NapiCloudDb::DownloadAssetInner(napi_env env, napi_value jsCb, void *context, void *data)
379 {
380 HandleAssetAsyncInner(env, jsCb, context, data);
381 }
382
UploadAssetInner(napi_env env,napi_value jsCb,void * context,void * data)383 void NapiCloudDb::UploadAssetInner(napi_env env, napi_value jsCb, void *context, void *data)
384 {
385 HandleAssetInner(env, jsCb, context, data);
386 }
387
DeleteAssetInner(napi_env env,napi_value jsCb,void * context,void * data)388 void NapiCloudDb::DeleteAssetInner(napi_env env, napi_value jsCb, void *context, void *data)
389 {
390 HandleAssetInner(env, jsCb, context, data);
391 }
392
DeleteLocalAssetInner(napi_env env,napi_value jsCb,void * context,void * data)393 void NapiCloudDb::DeleteLocalAssetInner(napi_env env, napi_value jsCb, void *context, void *data)
394 {
395 HandleAssetAsyncInner(env, jsCb, context, data);
396 }
397
HandleAssetInner(napi_env env,napi_value jsCb,void * context,void * data)398 void NapiCloudDb::HandleAssetInner(napi_env env, napi_value jsCb, void *context, void *data)
399 {
400 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
401 napi_value param = Parser::ParseFromAssetOpConfig(env, assetInfo->config);
402 napi_value promise = nullptr;
403 napi_status status = napi_call_function(env, nullptr, jsCb, HANDLER_PARAM_NUM, ¶m, &promise);
404 if (status != napi_ok) {
405 LOG_ERROR("[HandleAssetInner] napi call function go wrong, status = %{public}d", status);
406 assetInfo->promiseRes.set_value();
407 return;
408 }
409
410 napi_value thenFunc = nullptr;
411 status = napi_get_named_property(env, promise, "then", &thenFunc);
412 if (status != napi_ok) {
413 LOG_ERROR("[HandleAssetInner] napi get named property fail, status = %{public}d", status);
414 assetInfo->promiseRes.set_value();
415 return;
416 }
417 napi_value resolvedCallback;
418 napi_value rejectedCallback;
419 status = napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH,
420 NapiCloudDb::HandleAssetResolvedCallback, data, &resolvedCallback);
421 if (status != napi_ok) {
422 LOG_ERROR("[HandleAssetInner] napi create resolvedCallback go wrong, status = %{public}d", status);
423 assetInfo->promiseRes.set_value();
424 return;
425 }
426 status = napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH,
427 NapiCloudDb::HandleAssetRejectedCallback, data, &rejectedCallback);
428 if (status != napi_ok) {
429 LOG_ERROR("[HandleAssetInner] napi create rejectedCallback go wrong, status = %{public}d", status);
430 assetInfo->promiseRes.set_value();
431 return;
432 }
433 napi_value argv[PROMISE_PARAM_NUM] = {resolvedCallback, rejectedCallback};
434 assetInfo->callBackErrCode = CALL_BACK_RESULT_INVALID;
435 status = napi_call_function(env, promise, thenFunc, PROMISE_PARAM_NUM, argv, nullptr);
436 if (assetInfo->callBackErrCode == CALL_BACK_RESULT_INVALID) {
437 assetInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
438 LOG_ERROR("[HandleAssetInner] napi call function go wrong");
439 }
440 assetInfo->promiseRes.set_value();
441 ClearLastException(env);
442 }
443
HandleAssetAsyncInner(napi_env env,napi_value jsCb,void * context,void * data)444 void NapiCloudDb::HandleAssetAsyncInner(napi_env env, napi_value jsCb, void *context, void *data)
445 {
446 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
447 napi_value param = Parser::ParseFromAssetOpConfig(env, assetInfo->config);
448 napi_value promise = nullptr;
449 napi_status status = napi_call_function(env, nullptr, jsCb, HANDLER_PARAM_NUM, ¶m, &promise);
450 if (status != napi_ok) {
451 LOG_ERROR("[HandleAssetAsyncInner] napi call function go wrong, status = %{public}d", status);
452 return;
453 }
454
455 napi_value thenFunc = nullptr;
456 status = napi_get_named_property(env, promise, "then", &thenFunc);
457 if (status != napi_ok) {
458 LOG_ERROR("[HandleAssetAsyncInner] napi get named property fail, status = %{public}d", status);
459 return;
460 }
461 napi_value resolvedCallback;
462 napi_value rejectedCallback;
463 status = napi_create_function(env, "resolvedCallback", NAPI_AUTO_LENGTH,
464 NapiCloudDb::HandleAssetAsyncResolvedCallback, data, &resolvedCallback);
465 if (status != napi_ok) {
466 LOG_ERROR("[HandleAssetAsyncInner] napi create resolvedCallback go wrong, status = %{public}d", status);
467 return;
468 }
469 status = napi_create_function(env, "rejectedCallback", NAPI_AUTO_LENGTH,
470 NapiCloudDb::HandleAssetAsyncRejectedCallback, data, &rejectedCallback);
471 if (status != napi_ok) {
472 LOG_ERROR("[HandleAssetAsyncInner] napi create rejectedCallback go wrong, status = %{public}d", status);
473 return;
474 }
475 napi_value argv[PROMISE_PARAM_NUM] = {resolvedCallback, rejectedCallback};
476 status = napi_call_function(env, promise, thenFunc, PROMISE_PARAM_NUM, argv, nullptr);
477 if (status != napi_ok) {
478 LOG_ERROR("[HandleAssetAsyncInner] napi call function go wrong, status: %{public}d", status);
479 }
480 ClearLastException(env);
481 }
482
BatchInsertResolvedCallback(napi_env env,napi_callback_info info)483 napi_value NapiCloudDb::BatchInsertResolvedCallback(napi_env env, napi_callback_info info)
484 {
485 void *data = nullptr;
486 size_t argc = 1;
487 napi_value argv[1];
488 napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, &data);
489 if (status != napi_ok) {
490 LOG_ERROR("[ResolvedCallback] napi get callback info go wrong, status = %{public}d", status);
491 return nullptr;
492 }
493
494 int32_t num = 0;
495 NapiUtils::GetValue(env, argv[0], num);
496 BatchInsertInfo *batchInsertInfo = reinterpret_cast<BatchInsertInfo *>(data);
497 batchInsertInfo->promiseRes.set_value(num);
498 batchInsertInfo->callBackErrCode = CALL_BACK_RESULT_OK;
499 return nullptr;
500 }
501
BatchInsertRejectedCallback(napi_env env,napi_callback_info info)502 napi_value NapiCloudDb::BatchInsertRejectedCallback(napi_env env, napi_callback_info info)
503 {
504 void *data = nullptr;
505 napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, nullptr, &data);
506 if (status != napi_ok) {
507 LOG_ERROR("[RejectedCallback] napi get callback info go wrong, status = %{public}d", status);
508 return nullptr;
509 }
510 BatchInsertInfo *batchInsertInfo = reinterpret_cast<BatchInsertInfo *>(data);
511 batchInsertInfo->promiseRes.set_value(CALL_BACK_RESULT_ERR);
512 batchInsertInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
513 return nullptr;
514 }
515
GetQueryResult(napi_env env,napi_value input,std::vector<CloudParamsAdapterT> & out)516 napi_status GetQueryResult(napi_env env, napi_value input, std::vector<CloudParamsAdapterT> &out)
517 {
518 LOG_DEBUG("napi_value -> std::vector<CloudParamsAdapterT>");
519 out.clear();
520 bool isArray = false;
521 napi_is_array(env, input, &isArray);
522 ASSERT(isArray, "not an array", napi_invalid_arg);
523
524 uint32_t length = 0;
525 napi_status statusMsg = napi_get_array_length(env, input, &length);
526 ASSERT((statusMsg == napi_ok), "get_array go wrong!", napi_invalid_arg);
527 for (uint32_t i = 0; i < length; ++i) {
528 napi_value item = nullptr;
529 statusMsg = napi_get_element(env, input, i, &item);
530 ASSERT((item != nullptr) && (statusMsg == napi_ok), "no element", napi_invalid_arg);
531 CloudParamsAdapterT res;
532 napi_value cursor = nullptr;
533 napi_value id = nullptr;
534 napi_value data = nullptr;
535 statusMsg = napi_get_named_property(env, item, "cursor", &cursor);
536 ASSERT(statusMsg == napi_ok, "get cursor property go wrong", napi_invalid_arg);
537 statusMsg = napi_get_named_property(env, item, "id", &id);
538 ASSERT(statusMsg == napi_ok, "get id property go wrong", napi_invalid_arg);
539 statusMsg = napi_get_named_property(env, item, "data", &data);
540 ASSERT(statusMsg == napi_ok, "get data property go wrong", napi_invalid_arg);
541
542 statusMsg = NapiUtils::GetValue(env, cursor, res.cursor);
543 ASSERT(statusMsg == napi_ok, "get cursor go wrong", napi_invalid_arg);
544 statusMsg = NapiUtils::GetValue(env, id, res.id);
545 ASSERT(statusMsg == napi_ok, "get id go wrong", napi_invalid_arg);
546 statusMsg = NapiUtils::GetValue(env, data, res.record);
547 ASSERT(statusMsg == napi_ok, "get record go wrong", napi_invalid_arg);
548
549 out.push_back(res);
550 }
551 return statusMsg;
552 }
553
QueryResolvedCallback(napi_env env,napi_callback_info info)554 napi_value NapiCloudDb::QueryResolvedCallback(napi_env env, napi_callback_info info)
555 {
556 void *data = nullptr;
557 size_t argc = 1;
558 napi_value argv[1];
559 napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, &data);
560 if (status != napi_ok) {
561 LOG_ERROR("napi get callback info go wrong, status = %{public}d", status);
562 return nullptr;
563 }
564
565 QueryInfo *queryInfo = reinterpret_cast<QueryInfo *>(data);
566 std::vector<CloudParamsAdapterT> queryResult;
567 napi_status ret = GetQueryResult(env, argv[0], queryResult);
568 if (ret != napi_ok) {
569 LOG_ERROR("get callback result go wrong, ret=%{public}d", ret);
570 queryResult.clear();
571 queryInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
572 } else if (ret == napi_ok && queryResult.size() == 0) {
573 queryInfo->callBackErrCode = CALL_BACK_RESULT_QUERY_END;
574 } else {
575 queryInfo->callBackErrCode = CALL_BACK_RESULT_OK;
576 }
577 queryInfo->promiseRes.set_value(queryResult);
578 return nullptr;
579 }
580
QueryRejectedCallback(napi_env env,napi_callback_info info)581 napi_value NapiCloudDb::QueryRejectedCallback(napi_env env, napi_callback_info info)
582 {
583 void *data = nullptr;
584 napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, nullptr, &data);
585 if (status != napi_ok) {
586 LOG_ERROR("napi get callback info go wrong, status = %{public}d", status);
587 return nullptr;
588 }
589 QueryInfo *queryInfo = reinterpret_cast<QueryInfo *>(data);
590 queryInfo->promiseRes.set_value(std::vector<CloudParamsAdapterT>());
591 queryInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
592 return nullptr;
593 }
594
HandleAssetResolvedCallback(napi_env env,napi_callback_info info)595 napi_value NapiCloudDb::HandleAssetResolvedCallback(napi_env env, napi_callback_info info)
596 {
597 void *data = nullptr;
598 size_t argc = 1;
599 napi_value argv[1];
600 napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, &data);
601 if (status != napi_ok) {
602 LOG_ERROR("[ResolvedCallback] napi get callback info go wrong, status = %{public}d", status);
603 return nullptr;
604 }
605
606 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
607 assetInfo->callBackErrCode = CALL_BACK_RESULT_OK;
608 return nullptr;
609 }
610
HandleAssetRejectedCallback(napi_env env,napi_callback_info info)611 napi_value NapiCloudDb::HandleAssetRejectedCallback(napi_env env, napi_callback_info info)
612 {
613 void *data = nullptr;
614 napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, nullptr, &data);
615 if (status != napi_ok) {
616 LOG_ERROR("[RejectedCallback] napi get callback info go wrong, status = %{public}d", status);
617 return nullptr;
618 }
619 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
620 assetInfo->callBackErrCode = CALL_BACK_RESULT_ERR;
621 return nullptr;
622 }
623
HandleAssetAsyncResolvedCallback(napi_env env,napi_callback_info info)624 napi_value NapiCloudDb::HandleAssetAsyncResolvedCallback(napi_env env, napi_callback_info info)
625 {
626 void *data = nullptr;
627 size_t argc = 1;
628 napi_value argv[1];
629 napi_status status = napi_get_cb_info(env, info, &argc, argv, nullptr, &data);
630 if (status != napi_ok) {
631 LOG_ERROR("[ResolvedCallback] napi get callback info go wrong, status = %{public}d", status);
632 return nullptr;
633 }
634
635 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
636 delete assetInfo;
637 return nullptr;
638 }
639
HandleAssetAsyncRejectedCallback(napi_env env,napi_callback_info info)640 napi_value NapiCloudDb::HandleAssetAsyncRejectedCallback(napi_env env, napi_callback_info info)
641 {
642 void *data = nullptr;
643 napi_status status = napi_get_cb_info(env, info, nullptr, nullptr, nullptr, &data);
644 if (status != napi_ok) {
645 LOG_ERROR("[RejectedCallback] napi get callback info go wrong, status = %{public}d", status);
646 return nullptr;
647 }
648 AssetInfo *assetInfo = reinterpret_cast<AssetInfo *>(data);
649 delete assetInfo;
650 return nullptr;
651 }
652
ClearLastException(const napi_env & env)653 void NapiCloudDb::ClearLastException(const napi_env& env)
654 {
655 bool isExistException = false;
656 napi_is_exception_pending(env, &isExistException);
657 if (!isExistException) {
658 return;
659 }
660 napi_value exception = nullptr;
661 napi_status status = napi_get_and_clear_last_exception(env, &exception);
662 if (status != napi_ok) {
663 LOG_ERROR("[ClearLastException] clear last exception wrong, status: %{public}d", status);
664 }
665 }
666 } // namespace OHOS::CollaborationEdit
667