Skip to content

Commit 0c2b6df

Browse files
geeksilva97richardlau
authored andcommitted
src,sqlite: refactor value conversion
PR-URL: #59659 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Zeyu "Alex" Yang <[email protected]>
1 parent 5f0090a commit 0c2b6df

File tree

2 files changed

+36
-39
lines changed

2 files changed

+36
-39
lines changed

src/node_sqlite.cc

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,14 @@ using v8::HandleScope;
3434
using v8::Int32;
3535
using v8::Integer;
3636
using v8::Isolate;
37+
using v8::JustVoid;
3738
using v8::Local;
3839
using v8::LocalVector;
40+
using v8::Maybe;
3941
using v8::MaybeLocal;
4042
using v8::Name;
4143
using v8::NewStringType;
44+
using v8::Nothing;
4245
using v8::Null;
4346
using v8::Number;
4447
using v8::Object;
@@ -2008,6 +2011,20 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20082011

20092012
void StatementSync::MemoryInfo(MemoryTracker* tracker) const {}
20102013

2014+
Maybe<void> ExtractRowValues(Isolate* isolate,
2015+
int num_cols,
2016+
StatementSync* stmt,
2017+
LocalVector<Value>* row_values) {
2018+
row_values->clear();
2019+
row_values->reserve(num_cols);
2020+
for (int i = 0; i < num_cols; ++i) {
2021+
Local<Value> val;
2022+
if (!stmt->ColumnToValue(i).ToLocal(&val)) return Nothing<void>();
2023+
row_values->emplace_back(val);
2024+
}
2025+
return JustVoid();
2026+
}
2027+
20112028
void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20122029
StatementSync* stmt;
20132030
ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());
@@ -2025,24 +2042,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20252042
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
20262043
int num_cols = sqlite3_column_count(stmt->statement_);
20272044
LocalVector<Value> rows(isolate);
2045+
LocalVector<Value> row_values(isolate);
2046+
LocalVector<Name> row_keys(isolate);
20282047

2029-
if (stmt->return_arrays_) {
2030-
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2031-
LocalVector<Value> array_values(isolate);
2032-
array_values.reserve(num_cols);
2033-
for (int i = 0; i < num_cols; ++i) {
2034-
Local<Value> val;
2035-
if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2036-
array_values.emplace_back(val);
2037-
}
2048+
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2049+
auto maybe_row_values =
2050+
ExtractRowValues(env->isolate(), num_cols, stmt, &row_values);
2051+
if (maybe_row_values.IsNothing()) return;
2052+
2053+
if (stmt->return_arrays_) {
20382054
Local<Array> row_array =
2039-
Array::New(isolate, array_values.data(), array_values.size());
2055+
Array::New(isolate, row_values.data(), row_values.size());
20402056
rows.emplace_back(row_array);
2041-
}
2042-
} else {
2043-
LocalVector<Name> row_keys(isolate);
2044-
2045-
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2057+
} else {
20462058
if (row_keys.size() == 0) {
20472059
row_keys.reserve(num_cols);
20482060
for (int i = 0; i < num_cols; ++i) {
@@ -2052,14 +2064,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20522064
}
20532065
}
20542066

2055-
LocalVector<Value> row_values(isolate);
2056-
row_values.reserve(num_cols);
2057-
for (int i = 0; i < num_cols; ++i) {
2058-
Local<Value> val;
2059-
if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2060-
row_values.emplace_back(val);
2061-
}
2062-
20632067
DCHECK_EQ(row_keys.size(), row_values.size());
20642068
Local<Object> row_obj = Object::New(
20652069
isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols);
@@ -2537,28 +2541,21 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25372541

25382542
int num_cols = sqlite3_column_count(iter->stmt_->statement_);
25392543
Local<Value> row_value;
2544+
LocalVector<Name> row_keys(isolate);
2545+
LocalVector<Value> row_values(isolate);
2546+
2547+
auto maybe_row_values =
2548+
ExtractRowValues(isolate, num_cols, iter->stmt_.get(), &row_values);
2549+
if (maybe_row_values.IsNothing()) return;
25402550

25412551
if (iter->stmt_->return_arrays_) {
2542-
LocalVector<Value> array_values(isolate);
2543-
array_values.reserve(num_cols);
2544-
for (int i = 0; i < num_cols; ++i) {
2545-
Local<Value> val;
2546-
if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
2547-
array_values.emplace_back(val);
2548-
}
2549-
row_value = Array::New(isolate, array_values.data(), array_values.size());
2552+
row_value = Array::New(isolate, row_values.data(), row_values.size());
25502553
} else {
2551-
LocalVector<Name> row_keys(isolate);
2552-
LocalVector<Value> row_values(isolate);
25532554
row_keys.reserve(num_cols);
2554-
row_values.reserve(num_cols);
25552555
for (int i = 0; i < num_cols; ++i) {
25562556
Local<Name> key;
25572557
if (!iter->stmt_->ColumnNameToName(i).ToLocal(&key)) return;
2558-
Local<Value> val;
2559-
if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
25602558
row_keys.emplace_back(key);
2561-
row_values.emplace_back(val);
25622559
}
25632560

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

src/node_sqlite.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ class StatementSync : public BaseObject {
173173
const v8::FunctionCallbackInfo<v8::Value>& args);
174174
static void SetReadBigInts(const v8::FunctionCallbackInfo<v8::Value>& args);
175175
static void SetReturnArrays(const v8::FunctionCallbackInfo<v8::Value>& args);
176+
v8::MaybeLocal<v8::Value> ColumnToValue(const int column);
177+
v8::MaybeLocal<v8::Name> ColumnNameToName(const int column);
176178
void Finalize();
177179
bool IsFinalized();
178180

@@ -190,8 +192,6 @@ class StatementSync : public BaseObject {
190192
std::optional<std::map<std::string, std::string>> bare_named_params_;
191193
bool BindParams(const v8::FunctionCallbackInfo<v8::Value>& args);
192194
bool BindValue(const v8::Local<v8::Value>& value, const int index);
193-
v8::MaybeLocal<v8::Value> ColumnToValue(const int column);
194-
v8::MaybeLocal<v8::Name> ColumnNameToName(const int column);
195195

196196
friend class StatementSyncIterator;
197197
};

0 commit comments

Comments
 (0)