src,sqlite: refactor value conversion · nodejs/node@90d0a1b

@@ -35,11 +35,14 @@ using v8::HandleScope;

3535

using v8::Int32;

3636

using v8::Integer;

3737

using v8::Isolate;

38+

using v8::JustVoid;

3839

using v8::Local;

3940

using v8::LocalVector;

41+

using v8::Maybe;

4042

using v8::MaybeLocal;

4143

using v8::Name;

4244

using v8::NewStringType;

45+

using v8::Nothing;

4346

using v8::Null;

4447

using v8::Number;

4548

using v8::Object;

@@ -2009,6 +2012,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {

2009201220102013

void 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+20122029

void StatementSync::All(const FunctionCallbackInfo<Value>& args) {

20132030

StatementSync* stmt;

20142031

ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());

@@ -2026,24 +2043,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {

20262043

auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });

20272044

int 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 {

20472059

if (row_keys.size() == 0) {

20482060

row_keys.reserve(num_cols);

20492061

for (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-20642068

DCHECK_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) {

2538254225392543

int 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;

2541255125422552

if (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);

25562556

for (int i = 0; i < num_cols; ++i) {

25572557

Local<Name> key;

25582558

if (!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

}

2564256125652562

DCHECK_EQ(row_keys.size(), row_values.size());