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