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
16 #include "napi_values_bucket.h"
17
18 #include "js_logger.h"
19 #include "js_utils.h"
20 #include "value_object.h"
21
22 using namespace OHOS::AppDataMgrJsKit;
23 using namespace OHOS::NativeRdb;
24
NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_NewInstance(napi_env env,ValuesBucket & valuesBucket)25 __attribute__((visibility("default"))) napi_value NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_NewInstance(
26 napi_env env, ValuesBucket &valuesBucket)
27 {
28 napi_value ret;
29 NAPI_CALL(env, napi_create_object(env, &ret));
30 std::map<std::string, ValueObject> valuesMap;
31 valuesBucket.GetAll(valuesMap);
32 std::map<std::string, ValueObject>::iterator it;
33 for (it = valuesMap.begin(); it != valuesMap.end(); ++it) {
34 std::string key = it->first;
35 auto valueObject = it->second;
36 napi_value value = nullptr;
37 switch (valueObject.GetType()) {
38 case ValueObjectType::TYPE_NULL: {
39 value = nullptr;
40 } break;
41 case ValueObjectType::TYPE_INT: {
42 int64_t intVal = 0;
43 valueObject.GetLong(intVal);
44 value = JSUtils::Convert2JSValue(env, intVal);
45 } break;
46 case ValueObjectType::TYPE_DOUBLE: {
47 double doubleVal = 0L;
48 valueObject.GetDouble(doubleVal);
49 value = JSUtils::Convert2JSValue(env, doubleVal);
50 } break;
51 case ValueObjectType::TYPE_BLOB: {
52 std::vector<uint8_t> blobVal;
53 valueObject.GetBlob(blobVal);
54 value = JSUtils::Convert2JSValue(env, blobVal);
55 } break;
56 case ValueObjectType::TYPE_BOOL: {
57 bool boolVal = false;
58 valueObject.GetBool(boolVal);
59 value = JSUtils::Convert2JSValue(env, boolVal);
60 } break;
61 default: {
62 std::string strVal = "";
63 valueObject.GetString(strVal);
64 value = JSUtils::Convert2JSValue(env, strVal);
65 } break;
66 }
67 NAPI_CALL(env, napi_set_named_property(env, ret, key.c_str(), value));
68 }
69
70 return ret;
71 }
72
NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_GetNativeObject(napi_env env,napi_value & arg)73 __attribute__((visibility("default"))) ValuesBucket *NAPI_OHOS_Data_RdbJsKit_ValuesBucketProxy_GetNativeObject(
74 napi_env env, napi_value &arg)
75 {
76 ValuesBucket *valuesBucket = new (std::nothrow) ValuesBucket;
77 if (valuesBucket == nullptr) {
78 LOG_ERROR("ValuesBucket new failed, valuesBucket is nullptr");
79 return nullptr;
80 }
81 napi_value keys = 0;
82 napi_get_property_names(env, arg, &keys);
83 uint32_t arrLen = 0;
84 napi_status status = napi_get_array_length(env, keys, &arrLen);
85 if (status != napi_ok) {
86 LOG_DEBUG("ValuesBucket errr");
87 return valuesBucket;
88 }
89 LOG_DEBUG("ValuesBucket num:%{public}u ", arrLen);
90 for (size_t i = 0; i < arrLen; ++i) {
91 napi_value key;
92 napi_get_element(env, keys, i, &key);
93 std::string keyStr = JSUtils::Convert2String(env, key);
94 napi_value value;
95 napi_get_property(env, arg, key, &value);
96 napi_valuetype valueType = napi_undefined;
97 napi_typeof(env, value, &valueType);
98 if (valueType == napi_string) {
99 std::string valueString = JSUtils::Convert2String(env, value);
100 valuesBucket->PutString(keyStr, valueString);
101 LOG_DEBUG("ValueObject type napi_string");
102 } else if (valueType == napi_number) {
103 double valueNumber;
104 napi_get_value_double(env, value, &valueNumber);
105 valuesBucket->PutDouble(keyStr, valueNumber);
106 LOG_DEBUG("ValueObject type napi_number");
107 } else if (valueType == napi_boolean) {
108 bool valueBool = false;
109 napi_get_value_bool(env, value, &valueBool);
110 valuesBucket->PutBool(keyStr, valueBool);
111 LOG_DEBUG("ValueObject type napi_boolean");
112 } else if (valueType == napi_null) {
113 valuesBucket->PutNull(keyStr);
114 LOG_DEBUG("ValueObject type napi_null");
115 } else if (valueType == napi_object) {
116 valuesBucket->PutBlob(keyStr, JSUtils::Convert2U8Vector(env, value));
117 LOG_DEBUG("ValueObject type napi_object");
118 } else {
119 LOG_WARN("valuesBucket error");
120 }
121 }
122 return valuesBucket;
123 }