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