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