• 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 "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 }