• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 &paramsAdapter : *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, &param, &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, &param, &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