1 /*
2 * Copyright (C) 2025-2025 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 "result_set_napi.h"
17
18 #include "medialibrary_client_errno.h"
19 #include "medialibrary_napi_log.h"
20 #include "big_integer.h"
21 #include "asset_value.h"
22
23 using OHOS::HiviewDFX::HiLog;
24 using OHOS::HiviewDFX::HiLogLabel;
25
26 namespace OHOS {
27 namespace Media {
28 using namespace std;
29 using namespace OHOS::NativeRdb;
30 using Asset = AssetValue;
31 using BigInt = BigInteger;
32 using Assets = std::vector<Asset>;
33 using FloatVector = std::vector<float>;
34 thread_local napi_ref ResultSetNapi::sResultSetConstructor_ = nullptr;
35
36 template <>
Convert2JSValue(napi_env env,const int32_t & value)37 napi_value Convert2JSValue(napi_env env, const int32_t &value)
38 {
39 napi_value jsValue = nullptr;
40 if (napi_create_int32(env, value, &jsValue) != napi_ok) {
41 NAPI_ERR_LOG("Napi_create_int32 failed");
42 return jsValue;
43 }
44 return jsValue;
45 }
46
47 template <>
Convert2JSValue(napi_env env,const uint32_t & value)48 napi_value Convert2JSValue(napi_env env, const uint32_t &value)
49 {
50 napi_value jsValue = nullptr;
51 if (napi_create_uint32(env, value, &jsValue) != napi_ok) {
52 NAPI_ERR_LOG("Napi_create_uint32 failed");
53 return jsValue;
54 }
55 return jsValue;
56 }
57
58 template <>
Convert2JSValue(napi_env env,const int64_t & value)59 napi_value Convert2JSValue(napi_env env, const int64_t &value)
60 {
61 napi_value jsValue = nullptr;
62 if (napi_create_int64(env, value, &jsValue) != napi_ok) {
63 NAPI_ERR_LOG("Napi_create_int64 failed");
64 return jsValue;
65 }
66 return jsValue;
67 }
68
69 template <>
Convert2JSValue(napi_env env,const std::string & value)70 napi_value Convert2JSValue(napi_env env, const std::string &value)
71 {
72 napi_value jsValue = nullptr;
73 if (napi_create_string_utf8(env, value.c_str(), value.size(), &jsValue) != napi_ok) {
74 NAPI_ERR_LOG("Napi_create_string failed");
75 return jsValue;
76 }
77 return jsValue;
78 }
79
80 template <>
Convert2JSValue(napi_env env,const Asset & value)81 napi_value Convert2JSValue(napi_env env, const Asset &value)
82 {
83 auto outputStatus = value.status & ~0xF0000000;
84 std::vector<napi_property_descriptor> descriptors = {
85 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("name"), Convert2JSValue((env), (value.name)))),
86 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("uri"), Convert2JSValue((env), (value.uri)))),
87 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("createTime"),
88 Convert2JSValue((env), (value.createTime)))),
89 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("modifyTime"),
90 Convert2JSValue((env), (value.modifyTime)))),
91 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("size"), Convert2JSValue((env), (value.size)))),
92 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("path"), Convert2JSValue((env), (value.path)))),
93 napi_property_descriptor(DECLARE_NAPI_DEFAULT_PROPERTY(("status"), Convert2JSValue((env), (outputStatus)))),
94 };
95 napi_value object = nullptr;
96 if (napi_create_object_with_properties(env, &object, descriptors.size(), descriptors.data()) != napi_ok) {
97 NAPI_ERR_LOG("Napi_create_Asset failed");
98 return object;
99 }
100 return object;
101 }
102
103 template <>
Convert2JSValue(napi_env env,const double & value)104 napi_value Convert2JSValue(napi_env env, const double &value)
105 {
106 napi_value jsValue = nullptr;
107 if (napi_create_double(env, value, &jsValue) != napi_ok) {
108 NAPI_ERR_LOG("Napi_create_double failed");
109 return jsValue;
110 }
111 return jsValue;
112 }
113
114 template <>
Convert2JSValue(napi_env env,const bool & value)115 napi_value Convert2JSValue(napi_env env, const bool &value)
116 {
117 napi_value jsValue = nullptr;
118 if (napi_get_boolean(env, value, &jsValue) != napi_ok) {
119 NAPI_ERR_LOG("Napi_create_boolean failed");
120 return jsValue;
121 }
122 return jsValue;
123 }
124
125 template <>
Convert2JSValue(napi_env env,const float & value)126 napi_value Convert2JSValue(napi_env env, const float &value)
127 {
128 napi_value jsValue = nullptr;
129 if (napi_create_double(env, value, &jsValue) != napi_ok) {
130 NAPI_ERR_LOG("Napi_create_float failed");
131 return jsValue;
132 }
133 return jsValue;
134 }
135
136 template <>
Convert2JSValue(napi_env env,const std::vector<uint8_t> & value)137 napi_value Convert2JSValue(napi_env env, const std::vector<uint8_t> &value)
138 {
139 size_t size = value.size();
140 void *data = nullptr;
141 napi_value buffer = nullptr;
142 if (napi_create_arraybuffer(env, size, &data, &buffer) != napi_ok) {
143 NAPI_ERR_LOG("Napi_create_buffer failed");
144 return buffer;
145 }
146 if (size != 0 && data) {
147 std::copy(value.begin(), value.end(), static_cast<uint8_t *>(data));
148 } else {
149 NAPI_ERR_LOG("Data is empty");
150 }
151 napi_value napiValue = nullptr;
152 if (napi_create_typedarray(env, napi_uint8_array, size, buffer, 0, &napiValue) != napi_ok) {
153 NAPI_ERR_LOG("Napi_create_buffer failed");
154 return buffer;
155 }
156 return napiValue;
157 }
158
159 template <>
Convert2JSValue(napi_env env,const BigInt & value)160 napi_value Convert2JSValue(napi_env env, const BigInt &value)
161 {
162 napi_value jsValue = nullptr;
163 if (napi_create_bigint_words(env, value.Sign(), value.Size(), value.TrueForm(), &jsValue) != napi_ok) {
164 NAPI_ERR_LOG("Napi_create_BigInt failed");
165 return jsValue;
166 }
167 return jsValue;
168 }
169
170 template <>
Convert2JSValue(napi_env env,const std::vector<float> & value)171 napi_value Convert2JSValue(napi_env env, const std::vector<float> &value)
172 {
173 napi_value jsValue = nullptr;
174 float *native = nullptr;
175 napi_value buffer = nullptr;
176 napi_status status = napi_create_arraybuffer(env, value.size() * sizeof(float), (void **)&native, &buffer);
177 if (status != napi_ok || native == nullptr) {
178 NAPI_ERR_LOG("Napi_create_FLOAT_VECTOR failed");
179 return jsValue;
180 }
181
182 for (size_t i = 0; i < value.size(); i++) {
183 *(native + i) = value[i];
184 }
185 status = napi_create_typedarray(env, napi_float32_array, value.size(), buffer, 0, &jsValue);
186 if (status != napi_ok) {
187 NAPI_ERR_LOG("Napi_create_FLOAT_VECTOR failed");
188 return jsValue;
189 }
190 return jsValue;
191 }
192
193 template <>
Convert2JSValue(napi_env env,const ValueObject & value)194 napi_value Convert2JSValue(napi_env env, const ValueObject &value)
195 {
196 return Convert2JSValue(env, value.value);
197 }
198
199 template <>
Convert2JSValue(napi_env env,const RowEntity & rowEntity)200 napi_value Convert2JSValue(napi_env env, const RowEntity &rowEntity)
201 {
202 napi_value ret = nullptr;
203 if (napi_create_object(env, &ret) != napi_ok) {
204 NAPI_ERR_LOG("Napi_create_object failed");
205 return ret;
206 }
207 auto &values = rowEntity.Get();
208 for (auto const &[key, object] : values) {
209 napi_value value = Convert2JSValue(env, object.value);
210 napi_set_named_property(env, ret, key.c_str(), value);
211 }
212 return ret;
213 }
214
GetInt32AndResultSet(napi_env env,napi_callback_info info,int32_t & ret)215 static std::shared_ptr<ResultSet> GetInt32AndResultSet(napi_env env, napi_callback_info info, int32_t &ret)
216 {
217 napi_status status;
218 napi_value thisVar = nullptr;
219 size_t argc = 1;
220 napi_value args[1];
221 CHECK_COND_WITH_ERR_MESSAGE(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr) == napi_ok,
222 UFM_SYSCAP_BASE, "NAPI napi_get_cb_info failed");
223 CHECK_COND_WITH_ERR_MESSAGE(env, napi_get_value_int32(env, args[0], &ret) == napi_ok, UFM_SYSCAP_BASE,
224 "NAPI napi_get_value_int32 failed");
225 ResultSetNapi *obj = nullptr;
226 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
227 CHECK_COND_WITH_ERR_MESSAGE(env, status == napi_ok && obj != nullptr, UFM_SYSCAP_BASE, "napi env error");
228 std::shared_ptr<ResultSet> rs = obj->resultSetPtr;
229 CHECK_COND_WITH_ERR_MESSAGE(env, rs != nullptr, UFM_SYSCAP_BASE, "ResultSet is null");
230 return rs;
231 }
232
GetResultSetNapi(napi_env env,napi_callback_info info)233 static ResultSetNapi *GetResultSetNapi(napi_env env, napi_callback_info info)
234 {
235 napi_status status;
236 napi_value thisVar = nullptr;
237 GET_JS_OBJ_WITH_ZERO_ARGS(env, info, status, thisVar);
238 CHECK_COND_WITH_ERR_MESSAGE(env, status == napi_ok, UFM_SYSCAP_BASE, "GET_JS_OBJ_WITH_ZERO_ARGS failed");
239 ResultSetNapi *obj = nullptr;
240 status = napi_unwrap(env, thisVar, reinterpret_cast<void **>(&obj));
241 CHECK_COND_WITH_ERR_MESSAGE(env, status == napi_ok && obj != nullptr, UFM_SYSCAP_BASE, "napi_unwrap failed");
242 return obj;
243 }
244
GetResultSet(napi_env env,napi_callback_info info)245 static std::shared_ptr<ResultSet> GetResultSet(napi_env env, napi_callback_info info)
246 {
247 ResultSetNapi *obj = GetResultSetNapi(env, info);
248 CHECK_COND_WITH_ERR_MESSAGE(env, obj != nullptr, UFM_SYSCAP_BASE, "ResultSetNapi is nullptr");
249 std::shared_ptr<ResultSet> rs = obj->resultSetPtr;
250 CHECK_COND_WITH_ERR_MESSAGE(env, rs != nullptr, UFM_SYSCAP_BASE, "ResultSet is nullptr");
251 return rs;
252 }
253
ResultSetNapi(std::shared_ptr<ResultSet> ptr)254 ResultSetNapi::ResultSetNapi(std::shared_ptr<ResultSet> ptr) : resultSetPtr(std::move(ptr)), env_(nullptr) {}
255
256 ResultSetNapi::~ResultSetNapi() = default;
257
ResultSetNapiDestructor(napi_env env,void * nativeObject,void * finalize_hint)258 void ResultSetNapi::ResultSetNapiDestructor(napi_env env, void *nativeObject, void *finalize_hint)
259 {
260 ResultSetNapi *resultSet = reinterpret_cast<ResultSetNapi *>(nativeObject);
261 if (resultSet != nullptr) {
262 delete resultSet;
263 } else {
264 NAPI_ERR_LOG("ResultSet is nullptr, invalid nativeObject in Finalizer");
265 }
266 }
267
Init(napi_env env,napi_value exports)268 napi_value ResultSetNapi::Init(napi_env env, napi_value exports)
269 {
270 NapiClassInfo info = {.name = RESULT_SET_NAPI_CLASS_NAME,
271 .ref = &sResultSetConstructor_,
272 .constructor = ResultSetNapiConstructor,
273 .props = {
274 // 属性
275 DECLARE_NAPI_GETTER("columnCount", JSGetColumnCount),
276 DECLARE_NAPI_GETTER("rowCount", JSGetRowCount),
277 DECLARE_NAPI_GETTER("rowIndex", JSGetRowIndex),
278 DECLARE_NAPI_GETTER("isAtLastRow", JSIsAtLastRow),
279 // 方法
280 DECLARE_NAPI_FUNCTION("goToRow", JSGoToRow),
281 DECLARE_NAPI_FUNCTION("goToFirstRow", JSGoToFirstRow),
282 DECLARE_NAPI_FUNCTION("goToNextRow", JSGoToNextRow),
283 DECLARE_NAPI_FUNCTION("getBlob", JSGetBlob),
284 DECLARE_NAPI_FUNCTION("getString", JSGetString),
285 DECLARE_NAPI_FUNCTION("getLong", JSGetLong),
286 DECLARE_NAPI_FUNCTION("getDouble", JSGetDouble),
287 DECLARE_NAPI_FUNCTION("getBool", JSGetBool),
288 DECLARE_NAPI_FUNCTION("getValue", JSGetValue),
289 DECLARE_NAPI_FUNCTION("getRow", JSGetRow),
290 DECLARE_NAPI_FUNCTION("close", JSClose),
291 }};
292 MediaLibraryNapiUtils::NapiDefineClass(env, exports, info);
293 return exports;
294 }
295
ResultSetNapiConstructor(napi_env env,napi_callback_info info)296 napi_value ResultSetNapi::ResultSetNapiConstructor(napi_env env, napi_callback_info info)
297 {
298 napi_value thisArg;
299 CHECK_COND_WITH_ERR_MESSAGE(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, nullptr) == napi_ok,
300 UFM_SYSCAP_BASE, "Napi env error");
301 return thisArg;
302 }
303
CreateResultSetNapi(napi_env env,std::shared_ptr<ResultSet> & resultSet,JSAsyncContextOutput & asyncContext)304 napi_value ResultSetNapi::CreateResultSetNapi(napi_env env, std::shared_ptr<ResultSet> &resultSet,
305 JSAsyncContextOutput &asyncContext)
306 {
307 if (resultSet == nullptr) {
308 MediaLibraryNapiUtils::CreateNapiErrorObject(env, asyncContext.error, UFM_SYSCAP_BASE, "ResultSet is null");
309 return nullptr;
310 }
311 napi_value constructor;
312 napi_status status = napi_get_reference_value(env, sResultSetConstructor_, &constructor);
313 if (status != napi_ok) {
314 MediaLibraryNapiUtils::CreateNapiErrorObject(env, asyncContext.error, UFM_SYSCAP_BASE,
315 "Napi env error: Napi_get_reference_value");
316 return nullptr;
317 }
318 napi_value instance;
319 status = napi_new_instance(env, constructor, 0, nullptr, &instance);
320 if (status != napi_ok) {
321 MediaLibraryNapiUtils::CreateNapiErrorObject(env, asyncContext.error, UFM_SYSCAP_BASE,
322 "Napi env error: Napi_new_instance");
323 return nullptr;
324 }
325 ResultSetNapi *obj = new ResultSetNapi(resultSet);
326 if (obj == nullptr) {
327 MediaLibraryNapiUtils::CreateNapiErrorObject(env, asyncContext.error, UFM_SYSCAP_BASE,
328 "ResultSetnapi create failed");
329 return nullptr;
330 }
331 obj->env_ = env;
332 status = napi_wrap(env, instance, obj, ResultSetNapi::ResultSetNapiDestructor, nullptr, nullptr);
333 if (status != napi_ok) {
334 delete obj;
335 MediaLibraryNapiUtils::CreateNapiErrorObject(env, asyncContext.error, UFM_SYSCAP_BASE, "Napi env error");
336 return nullptr;
337 }
338 return instance;
339 }
340
JSGetColumnCount(napi_env env,napi_callback_info info)341 napi_value ResultSetNapi::JSGetColumnCount(napi_env env, napi_callback_info info)
342 {
343 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
344 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
345 int32_t count = 0;
346 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GetColumnCount(count) == E_OK, JS_E_INNER_FAIL, "Database error");
347 return Convert2JSValue(env, count);
348 }
349
JSGetRowCount(napi_env env,napi_callback_info info)350 napi_value ResultSetNapi::JSGetRowCount(napi_env env, napi_callback_info info)
351 {
352 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
353 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
354 int32_t count = 0;
355 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GetRowCount(count) == E_OK, JS_E_INNER_FAIL, "Database error");
356 return Convert2JSValue(env, count);
357 }
358
JSGetRowIndex(napi_env env,napi_callback_info info)359 napi_value ResultSetNapi::JSGetRowIndex(napi_env env, napi_callback_info info)
360 {
361 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
362 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
363 int32_t index = 0;
364 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GetRowIndex(index) == E_OK, JS_E_INNER_FAIL, "Database error");
365 return Convert2JSValue(env, index);
366 }
367
JSIsAtLastRow(napi_env env,napi_callback_info info)368 napi_value ResultSetNapi::JSIsAtLastRow(napi_env env, napi_callback_info info)
369 {
370 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
371 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
372 bool isAtLast = false;
373 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->IsAtLastRow(isAtLast) == E_OK, JS_E_INNER_FAIL, "Database error");
374 return Convert2JSValue(env, isAtLast);
375 }
376
377 // 方法实现
JSGoToRow(napi_env env,napi_callback_info info)378 napi_value ResultSetNapi::JSGoToRow(napi_env env, napi_callback_info info)
379 {
380 int32_t position;
381 int32_t rowCount;
382 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, position);
383 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
384 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GetRowCount(rowCount) == E_OK, JS_E_INNER_FAIL, "Database error");
385 int err = resultset->GoToRow(position);
386 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_ROW_OUT_RANGE, JS_E_PARAM_INVALID, "Index out of range");
387 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
388 return Convert2JSValue(env, true);
389 }
390
JSGoToFirstRow(napi_env env,napi_callback_info info)391 napi_value ResultSetNapi::JSGoToFirstRow(napi_env env, napi_callback_info info)
392 {
393 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
394 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
395 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GoToFirstRow() == E_OK, JS_E_INNER_FAIL, "Database error");
396 return Convert2JSValue(env, true);
397 }
398
JSGoToNextRow(napi_env env,napi_callback_info info)399 napi_value ResultSetNapi::JSGoToNextRow(napi_env env, napi_callback_info info)
400 {
401 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
402 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
403 int err = resultset->GoToNextRow();
404 if (err == E_ROW_OUT_RANGE) {
405 return Convert2JSValue(env, false);
406 }
407 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
408 return Convert2JSValue(env, true);
409 }
410
JSGetBlob(napi_env env,napi_callback_info info)411 napi_value ResultSetNapi::JSGetBlob(napi_env env, napi_callback_info info)
412 {
413 int32_t columnIndex;
414 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
415 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
416 std::vector<uint8_t> result;
417 int err = resultset->GetBlob(columnIndex, result);
418 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
419 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
420 return Convert2JSValue(env, result);
421 }
422
JSGetString(napi_env env,napi_callback_info info)423 napi_value ResultSetNapi::JSGetString(napi_env env, napi_callback_info info)
424 {
425 int32_t columnIndex;
426 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
427 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
428 std::string result;
429 int err = resultset->GetString(columnIndex, result);
430 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
431 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
432 return Convert2JSValue(env, result);
433 }
434
JSGetLong(napi_env env,napi_callback_info info)435 napi_value ResultSetNapi::JSGetLong(napi_env env, napi_callback_info info)
436 {
437 int32_t columnIndex;
438 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
439 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
440 int64_t result;
441 int err = resultset->GetLong(columnIndex, result);
442 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
443 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
444 return Convert2JSValue(env, result);
445 }
446
JSGetDouble(napi_env env,napi_callback_info info)447 napi_value ResultSetNapi::JSGetDouble(napi_env env, napi_callback_info info)
448 {
449 int32_t columnIndex;
450 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
451 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
452 double result;
453 int err = resultset->GetDouble(columnIndex, result);
454 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
455 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
456 return Convert2JSValue(env, result);
457 }
458
JSGetBool(napi_env env,napi_callback_info info)459 napi_value ResultSetNapi::JSGetBool(napi_env env, napi_callback_info info)
460 {
461 int32_t columnIndex;
462 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
463 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
464 ValueObject result;
465 int err = resultset->Get(columnIndex, result);
466 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
467 bool boolResult;
468 err = result.GetBool(boolResult);
469 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
470 return Convert2JSValue(env, boolResult);
471 }
472
JSGetValue(napi_env env,napi_callback_info info)473 napi_value ResultSetNapi::JSGetValue(napi_env env, napi_callback_info info)
474 {
475 int32_t columnIndex;
476 std::shared_ptr<ResultSet> resultset = GetInt32AndResultSet(env, info, columnIndex);
477 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
478 ValueObject result;
479 int err = resultset->Get(columnIndex, result);
480 CHECK_COND_WITH_ERR_MESSAGE(env, err != E_COLUMN_OUT_RANGE, JS_E_PARAM_INVALID, "Column index of out range");
481 CHECK_COND_WITH_ERR_MESSAGE(env, err == E_OK, JS_E_INNER_FAIL, "Database error");
482 return Convert2JSValue(env, result);
483 }
484
JSGetRow(napi_env env,napi_callback_info info)485 napi_value ResultSetNapi::JSGetRow(napi_env env, napi_callback_info info)
486 {
487 std::shared_ptr<ResultSet> resultset = GetResultSet(env, info);
488 CHECK_COND_WITH_ERR_MESSAGE(env, resultset != nullptr, JS_E_INNER_FAIL, "Resultset is nullptr");
489 RowEntity rowEntity;
490 CHECK_COND_WITH_ERR_MESSAGE(env, resultset->GetRow(rowEntity) == E_OK, JS_E_INNER_FAIL, "Database error");
491 return Convert2JSValue(env, rowEntity);
492 }
493
JSClose(napi_env env,napi_callback_info info)494 napi_value ResultSetNapi::JSClose(napi_env env, napi_callback_info info)
495 {
496 ResultSetNapi *obj = GetResultSetNapi(env, info);
497 if (obj->resultSetPtr != nullptr) {
498 obj->resultSetPtr = move(nullptr);
499 }
500 return nullptr;
501 }
502 } // namespace Media
503 } // namespace OHOS