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