• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }