src,sqlite: refactor value conversion · nodejs/node@90d0a1b
@@ -35,11 +35,14 @@ using v8::HandleScope;
3535using v8::Int32;
3636using v8::Integer;
3737using v8::Isolate;
38+using v8::JustVoid;
3839using v8::Local;
3940using v8::LocalVector;
41+using v8::Maybe;
4042using v8::MaybeLocal;
4143using v8::Name;
4244using v8::NewStringType;
45+using v8::Nothing;
4346using v8::Null;
4447using v8::Number;
4548using v8::Object;
@@ -2009,6 +2012,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
2009201220102013void StatementSync::MemoryInfo(MemoryTracker* tracker) const {}
201120142015+Maybe<void> ExtractRowValues(Isolate* isolate,
2016+int num_cols,
2017+ StatementSync* stmt,
2018+ LocalVector<Value>* row_values) {
2019+ row_values->clear();
2020+ row_values->reserve(num_cols);
2021+for (int i = 0; i < num_cols; ++i) {
2022+ Local<Value> val;
2023+if (!stmt->ColumnToValue(i).ToLocal(&val)) return Nothing<void>();
2024+ row_values->emplace_back(val);
2025+ }
2026+return JustVoid();
2027+}
2028+20122029void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20132030 StatementSync* stmt;
20142031ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());
@@ -2026,24 +2043,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20262043auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
20272044int num_cols = sqlite3_column_count(stmt->statement_);
20282045 LocalVector<Value> rows(isolate);
2046+ LocalVector<Value> row_values(isolate);
2047+ LocalVector<Name> row_keys(isolate);
202920482030-if (stmt->return_arrays_) {
2031-while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2032- LocalVector<Value> array_values(isolate);
2033- array_values.reserve(num_cols);
2034-for (int i = 0; i < num_cols; ++i) {
2035- Local<Value> val;
2036-if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2037- array_values.emplace_back(val);
2038- }
2049+while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2050+auto maybe_row_values =
2051+ExtractRowValues(env->isolate(), num_cols, stmt, &row_values);
2052+if (maybe_row_values.IsNothing()) return;
2053+2054+if (stmt->return_arrays_) {
20392055 Local<Array> row_array =
2040-Array::New(isolate, array_values.data(), array_values.size());
2056+Array::New(isolate, row_values.data(), row_values.size());
20412057 rows.emplace_back(row_array);
2042- }
2043- } else {
2044- LocalVector<Name> row_keys(isolate);
2045-2046-while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2058+ } else {
20472059if (row_keys.size() == 0) {
20482060 row_keys.reserve(num_cols);
20492061for (int i = 0; i < num_cols; ++i) {
@@ -2053,14 +2065,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20532065 }
20542066 }
205520672056- LocalVector<Value> row_values(isolate);
2057- row_values.reserve(num_cols);
2058-for (int i = 0; i < num_cols; ++i) {
2059- Local<Value> val;
2060-if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2061- row_values.emplace_back(val);
2062- }
2063-20642068DCHECK_EQ(row_keys.size(), row_values.size());
20652069 Local<Object> row_obj = Object::New(
20662070 isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols);
@@ -2538,28 +2542,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
2538254225392543int num_cols = sqlite3_column_count(iter->stmt_->statement_);
25402544 Local<Value> row_value;
2545+ LocalVector<Name> row_keys(isolate);
2546+ LocalVector<Value> row_values(isolate);
2547+2548+auto maybe_row_values =
2549+ExtractRowValues(isolate, num_cols, iter->stmt_.get(), &row_values);
2550+if (maybe_row_values.IsNothing()) return;
2541255125422552if (iter->stmt_->return_arrays_) {
2543- LocalVector<Value> array_values(isolate);
2544- array_values.reserve(num_cols);
2545-for (int i = 0; i < num_cols; ++i) {
2546- Local<Value> val;
2547-if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
2548- array_values.emplace_back(val);
2549- }
2550- row_value = Array::New(isolate, array_values.data(), array_values.size());
2553+ row_value = Array::New(isolate, row_values.data(), row_values.size());
25512554 } else {
2552- LocalVector<Name> row_keys(isolate);
2553- LocalVector<Value> row_values(isolate);
25542555 row_keys.reserve(num_cols);
2555- row_values.reserve(num_cols);
25562556for (int i = 0; i < num_cols; ++i) {
25572557 Local<Name> key;
25582558if (!iter->stmt_->ColumnNameToName(i).ToLocal(&key)) return;
2559- Local<Value> val;
2560-if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
25612559 row_keys.emplace_back(key);
2562- row_values.emplace_back(val);
25632560 }
2564256125652562DCHECK_EQ(row_keys.size(), row_values.size());