1 /*
2 * Copyright (c) 2022 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 "JsKVStoreResultSet"
16 #include "js_kv_store_resultset.h"
17
18 #include "js_util.h"
19 #include "kv_utils.h"
20 #include "log_print.h"
21 #include "napi_queue.h"
22 #include "uv_queue.h"
23
24 using namespace OHOS::DistributedKv;
25 using namespace OHOS::DataShare;
26 namespace OHOS::DistributedKVStore {
SetKvStoreResultSetPtr(std::shared_ptr<KvStoreResultSet> resultSet)27 void JsKVStoreResultSet::SetKvStoreResultSetPtr(std::shared_ptr<KvStoreResultSet> resultSet)
28 {
29 resultSet_ = resultSet;
30 }
31
GetKvStoreResultSetPtr()32 std::shared_ptr<KvStoreResultSet> JsKVStoreResultSet::GetKvStoreResultSetPtr()
33 {
34 return resultSet_;
35 }
36
Constructor(napi_env env)37 napi_value JsKVStoreResultSet::Constructor(napi_env env)
38 {
39 auto lambda = []() -> std::vector<napi_property_descriptor> {
40 std::vector<napi_property_descriptor> properties = {
41 DECLARE_NAPI_FUNCTION("getCount", JsKVStoreResultSet::GetCount),
42 DECLARE_NAPI_FUNCTION("getPosition", JsKVStoreResultSet::GetPosition),
43 DECLARE_NAPI_FUNCTION("moveToFirst", JsKVStoreResultSet::MoveToFirst),
44 DECLARE_NAPI_FUNCTION("moveToLast", JsKVStoreResultSet::MoveToLast),
45 DECLARE_NAPI_FUNCTION("moveToNext", JsKVStoreResultSet::MoveToNext),
46 DECLARE_NAPI_FUNCTION("moveToPrevious", JsKVStoreResultSet::MoveToPrevious),
47 DECLARE_NAPI_FUNCTION("move", JsKVStoreResultSet::Move),
48 DECLARE_NAPI_FUNCTION("moveToPosition", JsKVStoreResultSet::MoveToPosition),
49 DECLARE_NAPI_FUNCTION("isFirst", JsKVStoreResultSet::IsFirst),
50 DECLARE_NAPI_FUNCTION("isLast", JsKVStoreResultSet::IsLast),
51 DECLARE_NAPI_FUNCTION("isBeforeFirst", JsKVStoreResultSet::IsBeforeFirst),
52 DECLARE_NAPI_FUNCTION("isAfterLast", JsKVStoreResultSet::IsAfterLast),
53 DECLARE_NAPI_FUNCTION("getEntry", JsKVStoreResultSet::GetEntry),
54 };
55 return properties;
56 };
57 return JSUtil::DefineClass(env, "ohos.data.distributedKVStore", "KVStoreResultSet", lambda,
58 JsKVStoreResultSet::New);
59 }
60
New(napi_env env,napi_callback_info info)61 napi_value JsKVStoreResultSet::New(napi_env env, napi_callback_info info)
62 {
63 ZLOGD("constructor JsKVStoreResultSet!");
64 auto ctxt = std::make_shared<ContextBase>();
65 ctxt->GetCbInfoSync(env, info);
66 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
67
68 JsKVStoreResultSet* resultSet = new (std::nothrow) JsKVStoreResultSet();
69 NAPI_ASSERT(env, resultSet !=nullptr, "no memory for resultSet");
70
71 auto finalize = [](napi_env env, void* data, void* hint) {
72 ZLOGD("kvStoreResultSet finalize.");
73 auto* resultSet = reinterpret_cast<JsKVStoreResultSet*>(data);
74 ASSERT_VOID(resultSet != nullptr, "resultSet is null!");
75 delete resultSet;
76 };
77 ASSERT_CALL(env, napi_wrap(env, ctxt->self, resultSet, finalize, nullptr, nullptr), resultSet);
78 return ctxt->self;
79 }
80
GetCount(napi_env env,napi_callback_info info)81 napi_value JsKVStoreResultSet::GetCount(napi_env env, napi_callback_info info) /* number */
82 {
83 ZLOGD("KVStoreResultSet::GetCount()");
84 auto ctxt = std::make_shared<ContextBase>();
85 ctxt->GetCbInfoSync(env, info);
86 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
87 ZLOGD("KVStoreResultSet::GetCount(status=%{public}d)", ctxt->status);
88
89 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
90 int count = resultSet->GetCount();
91
92 napi_create_int32(env, count, &ctxt->output);
93 return ctxt->output;
94 }
95
GetPosition(napi_env env,napi_callback_info info)96 napi_value JsKVStoreResultSet::GetPosition(napi_env env, napi_callback_info info) /* number */
97 {
98 ZLOGD("KVStoreResultSet::GetPosition()");
99 auto ctxt = std::make_shared<ContextBase>();
100 ctxt->GetCbInfoSync(env, info);
101 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
102
103 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
104 int position = resultSet->GetPosition();
105
106 napi_create_int32(env, position, &ctxt->output);
107 return ctxt->output;
108 }
109
MoveToFirst(napi_env env,napi_callback_info info)110 napi_value JsKVStoreResultSet::MoveToFirst(napi_env env, napi_callback_info info) /* boolean */
111 {
112 ZLOGD("KVStoreResultSet::MoveToFirst()");
113 auto ctxt = std::make_shared<ContextBase>();
114 ctxt->GetCbInfoSync(env, info);
115 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
116
117 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
118 bool isMoved = resultSet->MoveToFirst();
119
120 napi_get_boolean(env, isMoved, &ctxt->output);
121 return ctxt->output;
122 }
123
MoveToLast(napi_env env,napi_callback_info info)124 napi_value JsKVStoreResultSet::MoveToLast(napi_env env, napi_callback_info info) /* boolean */
125 {
126 ZLOGD("KVStoreResultSet::MoveToLast()");
127 auto ctxt = std::make_shared<ContextBase>();
128 ctxt->GetCbInfoSync(env, info);
129 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
130
131 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
132 bool isMoved = resultSet->MoveToLast();
133
134 napi_get_boolean(env, isMoved, &ctxt->output);
135 return ctxt->output;
136 }
137
MoveToNext(napi_env env,napi_callback_info info)138 napi_value JsKVStoreResultSet::MoveToNext(napi_env env, napi_callback_info info) /* boolean */
139 {
140 ZLOGD("KVStoreResultSet::MoveToNext()");
141 auto ctxt = std::make_shared<ContextBase>();
142 ctxt->GetCbInfoSync(env, info);
143 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
144
145 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
146 bool isMoved = resultSet->MoveToNext();
147
148 napi_get_boolean(env, isMoved, &ctxt->output);
149 return ctxt->output;
150 }
151
MoveToPrevious(napi_env env,napi_callback_info info)152 napi_value JsKVStoreResultSet::MoveToPrevious(napi_env env, napi_callback_info info) /* boolean */
153 {
154 ZLOGD("KVStoreResultSet::MoveToPrevious()");
155 auto ctxt = std::make_shared<ContextBase>();
156 ctxt->GetCbInfoSync(env, info);
157 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
158
159 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
160 bool isMoved = resultSet->MoveToPrevious();
161
162 napi_get_boolean(env, isMoved, &ctxt->output);
163 return ctxt->output;
164 }
165
Move(napi_env env,napi_callback_info info)166 napi_value JsKVStoreResultSet::Move(napi_env env, napi_callback_info info) /* boolean */
167 {
168 ZLOGD("KVStoreResultSet::Move()");
169 int offset = 0;
170 auto ctxt = std::make_shared<ContextBase>();
171 auto input = [env, ctxt, &offset](size_t argc, napi_value* argv) {
172 // required 1 arguments :: <offset>
173 ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::INVALID_ARGUMENT, "The number of parameters is incorrect.");
174 ctxt->status = napi_get_value_int32(env, argv[0], reinterpret_cast<int32_t*>(&offset));
175 };
176 ctxt->GetCbInfoSync(env, info, input);
177 ASSERT_NULL(!ctxt->isThrowError, "Move exit");
178 ASSERT_ERR(env, ctxt->status == napi_ok, Status::INVALID_ARGUMENT, "The function MoveV9 parameter is incorrect.");
179
180 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
181 bool isMoved = resultSet->Move(offset);
182
183 napi_get_boolean(env, isMoved, &ctxt->output);
184 return ctxt->output;
185 }
186
MoveToPosition(napi_env env,napi_callback_info info)187 napi_value JsKVStoreResultSet::MoveToPosition(napi_env env, napi_callback_info info) /* boolean */
188 {
189 int position = 0;
190 auto ctxt = std::make_shared<ContextBase>();
191 auto input = [env, ctxt, &position](size_t argc, napi_value* argv) {
192 // required 1 arguments :: <position>
193 ASSERT_BUSINESS_ERR(ctxt, argc >= 1, Status::INVALID_ARGUMENT, "The number of parameters is incorrect.");
194 ctxt->status = napi_get_value_int32(env, argv[0], reinterpret_cast<int32_t*>(&position));
195 };
196 ctxt->GetCbInfoSync(env, info, input);
197 ASSERT_NULL(!ctxt->isThrowError, "MoveToPosition exit");
198 ASSERT_ERR(env, ctxt->status == napi_ok, Status::INVALID_ARGUMENT,
199 "The function MoveToPositionV9 parameter is incorrect.");
200 ZLOGD("KVStoreResultSet::MoveToPosition(%{public}d)", position);
201
202 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
203 bool isMoved = resultSet->MoveToPosition(position);
204
205 napi_get_boolean(env, isMoved, &ctxt->output);
206 return ctxt->output;
207 }
208
IsFirst(napi_env env,napi_callback_info info)209 napi_value JsKVStoreResultSet::IsFirst(napi_env env, napi_callback_info info) /* boolean */
210 {
211 ZLOGD("KVStoreResultSet::IsFirst()");
212 auto ctxt = std::make_shared<ContextBase>();
213 ctxt->GetCbInfoSync(env, info);
214 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
215
216 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
217 bool isFirst = resultSet->IsFirst();
218
219 napi_get_boolean(env, isFirst, &ctxt->output);
220 return ctxt->output;
221 }
222
IsLast(napi_env env,napi_callback_info info)223 napi_value JsKVStoreResultSet::IsLast(napi_env env, napi_callback_info info) /* boolean */
224 {
225 ZLOGD("KVStoreResultSet::IsLast()");
226 auto ctxt = std::make_shared<ContextBase>();
227 ctxt->GetCbInfoSync(env, info);
228 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
229
230 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
231 bool isLast = resultSet->IsLast();
232
233 napi_get_boolean(env, isLast, &ctxt->output);
234 return ctxt->output;
235 }
236
IsBeforeFirst(napi_env env,napi_callback_info info)237 napi_value JsKVStoreResultSet::IsBeforeFirst(napi_env env, napi_callback_info info) /* boolean */
238 {
239 ZLOGD("KVStoreResultSet::IsBeforeFirst()");
240 auto ctxt = std::make_shared<ContextBase>();
241 ctxt->GetCbInfoSync(env, info);
242 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
243
244 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
245 bool isBeforeFirst = resultSet->IsBeforeFirst();
246
247 napi_get_boolean(env, isBeforeFirst, &ctxt->output);
248 return ctxt->output;
249 }
250
IsAfterLast(napi_env env,napi_callback_info info)251 napi_value JsKVStoreResultSet::IsAfterLast(napi_env env, napi_callback_info info) /* boolean */
252 {
253 ZLOGD("KVStoreResultSet::IsAfterLast()");
254 auto ctxt = std::make_shared<ContextBase>();
255 ctxt->GetCbInfoSync(env, info);
256 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
257
258 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
259 bool isAfterLast = resultSet->IsAfterLast();
260
261 napi_get_boolean(env, isAfterLast, &ctxt->output);
262 return ctxt->output;
263 }
264
GetEntry(napi_env env,napi_callback_info info)265 napi_value JsKVStoreResultSet::GetEntry(napi_env env, napi_callback_info info) /* Entry */
266 {
267 ZLOGD("KVStoreResultSet::GetEntry()");
268 auto ctxt = std::make_shared<ContextBase>();
269 ctxt->GetCbInfoSync(env, info);
270 NAPI_ASSERT(env, ctxt->status == napi_ok, "invalid arguments!");
271
272 DistributedKv::Entry entry;
273 auto& resultSet = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->resultSet_;
274 bool isSchema = reinterpret_cast<JsKVStoreResultSet*>(ctxt->native)->isSchema_;
275 auto status = resultSet->GetEntry(entry);
276 if (status != Status::SUCCESS) {
277 return nullptr;
278 }
279
280 ctxt->status = JSUtil::SetValue(env, entry, ctxt->output, isSchema);
281 NAPI_ASSERT(env, ctxt->status == napi_ok, "GetEntry failed!");
282 return ctxt->output;
283 }
284
Create()285 std::shared_ptr<ResultSetBridge> JsKVStoreResultSet::Create()
286 {
287 return KvUtils::ToResultSetBridge(resultSet_);
288 }
289
SetSchema(bool isSchema)290 void JsKVStoreResultSet::SetSchema(bool isSchema)
291 {
292 isSchema_ = isSchema;
293 }
294 } // namespace OHOS::DistributedKVStore
295