1 /*
2  * Copyright (c) 2021 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 #define LOG_TAG "ValuesBucket"
16 #include "napi_values_bucket.h"
17 
18 #include "js_utils.h"
19 #include "logger.h"
20 #include "value_object.h"
21 
22 using namespace OHOS::Rdb;
23 using namespace OHOS::AppDataMgrJsKit;
24 using namespace OHOS::NativeRdb;
25 
NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_NewInstance(napi_env env,ValuesBucket & valuesBucket)26 __attribute__((visibility("default"))) napi_value NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_NewInstance(
27     napi_env env, ValuesBucket &valuesBucket)
28 {
29     napi_value ret = nullptr;
30     NAPI_CALL(env, napi_create_object(env, &ret));
31     for (auto &[key, value]: valuesBucket.values_) {
32         napi_value jsValue = JSUtils::Convert2JSValue(env, value.value);
33         NAPI_CALL(env, napi_set_named_property(env, ret, key.c_str(), jsValue));
34     }
35 
36     return ret;
37 }
38 
NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_GetNativeObject(napi_env env,napi_value & arg)39 __attribute__((visibility("default"))) ValuesBucket *NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_GetNativeObject(
40     napi_env env, napi_value &arg)
41 {
42     ValuesBucket *valuesBucket = new (std::nothrow) ValuesBucket;
43     if (valuesBucket == nullptr) {
44         LOG_ERROR("ValuesBucket new failed, valuesBucket is nullptr");
45         return nullptr;
46     }
47     napi_value keys = nullptr;
48     napi_get_property_names(env, arg, &keys);
49     uint32_t arrLen = 0;
50     napi_status status = napi_get_array_length(env, keys, &arrLen);
51     if (status != napi_ok) {
52         LOG_DEBUG("ValuesBucket errr");
53         return valuesBucket;
54     }
55     for (size_t i = 0; i < arrLen; ++i) {
56         napi_value key = nullptr;
57         napi_get_element(env, keys, i, &key);
58         std::string keyStr = JSUtils::Convert2String(env, key);
59         napi_value value = nullptr;
60         napi_get_property(env, arg, key, &value);
61         napi_valuetype valueType = napi_undefined;
62         napi_typeof(env, value, &valueType);
63         if (valueType == napi_string) {
64             std::string valueString = JSUtils::Convert2String(env, value);
65             valuesBucket->PutString(keyStr, valueString);
66         } else if (valueType == napi_number) {
67             double valueNumber;
68             napi_get_value_double(env, value, &valueNumber);
69             valuesBucket->PutDouble(keyStr, valueNumber);
70         } else if (valueType == napi_boolean) {
71             bool valueBool = false;
72             napi_get_value_bool(env, value, &valueBool);
73             valuesBucket->PutBool(keyStr, valueBool);
74         } else if (valueType == napi_null) {
75             valuesBucket->PutNull(keyStr);
76         } else if (valueType == napi_object) {
77             std::vector<uint8_t> val = {};
78             JSUtils::Convert2Value(env, value, val);
79             valuesBucket->PutBlob(keyStr, val);
80         } else {
81             LOG_WARN("valuesBucket error");
82         }
83     }
84     return valuesBucket;
85 }