1 /*
2  * Copyright (c) 2023 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 "NapiRdbJsUtils"
16 #include "napi_rdb_js_utils.h"
17 
18 #include "logger.h"
19 #include "result_set.h"
20 
21 namespace OHOS::AppDataMgrJsKit {
22 namespace JSUtils {
23 using namespace OHOS::Rdb;
24 using namespace NativeRdb;
25 
26 template<>
Convert2Value(napi_env env,napi_value jsValue,Asset & output)27 int32_t Convert2Value(napi_env env, napi_value jsValue, Asset &output)
28 {
29     napi_valuetype type = napi_undefined;
30     napi_status status = napi_typeof(env, jsValue, &type);
31     if (status != napi_ok || type != napi_object) {
32         LOG_DEBUG("napi_typeof failed status = %{public}d type = %{public}d", status, type);
33         return napi_invalid_arg;
34     }
35 
36     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "version", output.version), napi_invalid_arg);
37     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "name", output.name), napi_invalid_arg);
38     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "uri", output.uri), napi_invalid_arg);
39     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "createTime", output.createTime), napi_invalid_arg);
40     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "modifyTime", output.modifyTime), napi_invalid_arg);
41     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "size", output.size), napi_invalid_arg);
42     NAPI_CALL_BASE(env, GetNamedProperty(env, jsValue, "hash", output.hash), napi_invalid_arg);
43     return napi_ok;
44 }
45 
46 template<>
Convert2JSValue(napi_env env,const Asset & value)47 napi_value Convert2JSValue(napi_env env, const Asset &value)
48 {
49     napi_value object = nullptr;
50     NAPI_CALL_BASE(env, napi_create_object(env, &object), object);
51     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "version", value.version), object);
52     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "name", value.name), object);
53     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "uri", value.uri), object);
54     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "createTime", value.createTime), object);
55     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "modifyTime", value.modifyTime), object);
56     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "size", value.size), object);
57     NAPI_CALL_BASE(env, SetNamedProperty(env, object, "hash", value.hash), object);
58     return object;
59 }
60 
61 template<>
Convert2JSValue(napi_env env,const RowEntity & rowEntity)62 napi_value Convert2JSValue(napi_env env, const RowEntity &rowEntity)
63 {
64     napi_value ret = nullptr;
65     NAPI_CALL(env, napi_create_object(env, &ret));
66     auto &values = rowEntity.Get();
67     for (auto const &[key, object] : values) {
68         napi_value value = JSUtils::Convert2JSValue(env, object.value);
69         NAPI_CALL(env, napi_set_named_property(env, ret, key.c_str(), value));
70     }
71     return ret;
72 }
73 
74 template<>
Convert2Value(napi_env env,napi_value jsValue,ValueObject & valueObject)75 int32_t Convert2Value(napi_env env, napi_value jsValue, ValueObject &valueObject)
76 {
77     auto status = Convert2Value(env, jsValue, valueObject.value);
78     if (status != napi_ok) {
79         return napi_invalid_arg;
80     }
81     return napi_ok;
82 }
83 
84 template<>
Convert2JSValue(napi_env env,const BigInt & value)85 napi_value Convert2JSValue(napi_env env, const BigInt& value)
86 {
87     napi_value val = nullptr;
88     napi_status status = napi_create_bigint_words(env, value.Sign(), value.Size(), value.TrueForm(), &val);
89     if (status != napi_ok) {
90         return nullptr;
91     }
92     return val;
93 }
94 
95 template<>
Convert2Value(napi_env env,napi_value jsValue,BigInt & value)96 int32_t Convert2Value(napi_env env, napi_value jsValue, BigInt& value)
97 {
98     napi_valuetype type = napi_undefined;
99     napi_status status = napi_typeof(env, jsValue, &type);
100     if (status != napi_ok || type != napi_bigint) {
101         return napi_invalid_arg;
102     }
103     int sign = 0;
104     size_t count = 0;
105     status = napi_get_value_bigint_words(env, jsValue, nullptr, &count, nullptr);
106     if (status != napi_ok) {
107         return napi_bigint_expected;
108     }
109     std::vector<uint64_t> words(count, 0);
110     status = napi_get_value_bigint_words(env, jsValue, &sign, &count, words.data());
111     if (status != napi_ok) {
112         return napi_bigint_expected;
113     }
114     value = BigInteger(sign, std::move(words));
115     return napi_ok;
116 }
117 }; // namespace JSUtils
118 } // namespace OHOS::AppDataMgrJsKit