Skip to content

Commit 45b12c8

Browse files
committed
src,sqlite: refactor value conversion
1 parent 34f9b7e commit 45b12c8

File tree

2 files changed

+34
-39
lines changed

2 files changed

+34
-39
lines changed

src/node_sqlite.cc

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,19 @@ MaybeLocal<Name> StatementSync::ColumnNameToName(const int column) {
20172017

20182018
void StatementSync::MemoryInfo(MemoryTracker* tracker) const {}
20192019

2020+
std::optional<LocalVector<Value>> ExtractRowValues(Isolate* isolate,
2021+
int num_cols,
2022+
StatementSync* stmt) {
2023+
LocalVector<Value> row_values(isolate);
2024+
row_values.reserve(num_cols);
2025+
for (int i = 0; i < num_cols; ++i) {
2026+
Local<Value> val;
2027+
if (!stmt->ColumnToValue(i).ToLocal(&val)) return std::nullopt;
2028+
row_values.emplace_back(val);
2029+
}
2030+
return row_values;
2031+
}
2032+
20202033
void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20212034
StatementSync* stmt;
20222035
ASSIGN_OR_RETURN_UNWRAP(&stmt, args.This());
@@ -2034,24 +2047,19 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20342047
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
20352048
int num_cols = sqlite3_column_count(stmt->statement_);
20362049
LocalVector<Value> rows(isolate);
2050+
LocalVector<Value> row_values(isolate);
2051+
LocalVector<Name> row_keys(isolate);
20372052

2038-
if (stmt->return_arrays_) {
2039-
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2040-
LocalVector<Value> array_values(isolate);
2041-
array_values.reserve(num_cols);
2042-
for (int i = 0; i < num_cols; ++i) {
2043-
Local<Value> val;
2044-
if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2045-
array_values.emplace_back(val);
2046-
}
2053+
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2054+
auto maybe_row_values = ExtractRowValues(env->isolate(), num_cols, stmt);
2055+
if (!maybe_row_values.has_value()) return;
2056+
2057+
row_values = std::move(maybe_row_values.value());
2058+
if (stmt->return_arrays_) {
20472059
Local<Array> row_array =
2048-
Array::New(isolate, array_values.data(), array_values.size());
2060+
Array::New(isolate, row_values.data(), row_values.size());
20492061
rows.emplace_back(row_array);
2050-
}
2051-
} else {
2052-
LocalVector<Name> row_keys(isolate);
2053-
2054-
while ((r = sqlite3_step(stmt->statement_)) == SQLITE_ROW) {
2062+
} else {
20552063
if (row_keys.size() == 0) {
20562064
row_keys.reserve(num_cols);
20572065
for (int i = 0; i < num_cols; ++i) {
@@ -2061,14 +2069,6 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
20612069
}
20622070
}
20632071

2064-
LocalVector<Value> row_values(isolate);
2065-
row_values.reserve(num_cols);
2066-
for (int i = 0; i < num_cols; ++i) {
2067-
Local<Value> val;
2068-
if (!stmt->ColumnToValue(i).ToLocal(&val)) return;
2069-
row_values.emplace_back(val);
2070-
}
2071-
20722072
DCHECK_EQ(row_keys.size(), row_values.size());
20732073
Local<Object> row_obj = Object::New(
20742074
isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols);
@@ -2546,28 +2546,23 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
25462546

25472547
int num_cols = sqlite3_column_count(iter->stmt_->statement_);
25482548
Local<Value> row_value;
2549+
LocalVector<Name> row_keys(isolate);
2550+
LocalVector<Value> row_values(isolate);
2551+
2552+
auto maybe_row_values =
2553+
ExtractRowValues(isolate, num_cols, iter->stmt_.get());
2554+
if (!maybe_row_values.has_value()) return;
2555+
2556+
row_values = std::move(maybe_row_values.value());
25492557

25502558
if (iter->stmt_->return_arrays_) {
2551-
LocalVector<Value> array_values(isolate);
2552-
array_values.reserve(num_cols);
2553-
for (int i = 0; i < num_cols; ++i) {
2554-
Local<Value> val;
2555-
if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
2556-
array_values.emplace_back(val);
2557-
}
2558-
row_value = Array::New(isolate, array_values.data(), array_values.size());
2559+
row_value = Array::New(isolate, row_values.data(), row_values.size());
25592560
} else {
2560-
LocalVector<Name> row_keys(isolate);
2561-
LocalVector<Value> row_values(isolate);
25622561
row_keys.reserve(num_cols);
2563-
row_values.reserve(num_cols);
25642562
for (int i = 0; i < num_cols; ++i) {
25652563
Local<Name> key;
25662564
if (!iter->stmt_->ColumnNameToName(i).ToLocal(&key)) return;
2567-
Local<Value> val;
2568-
if (!iter->stmt_->ColumnToValue(i).ToLocal(&val)) return;
25692565
row_keys.emplace_back(key);
2570-
row_values.emplace_back(val);
25712566
}
25722567

25732568
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
@@ -174,6 +174,8 @@ class StatementSync : public BaseObject {
174174
const v8::FunctionCallbackInfo<v8::Value>& args);
175175
static void SetReadBigInts(const v8::FunctionCallbackInfo<v8::Value>& args);
176176
static void SetReturnArrays(const v8::FunctionCallbackInfo<v8::Value>& args);
177+
v8::MaybeLocal<v8::Value> ColumnToValue(const int column);
178+
v8::MaybeLocal<v8::Name> ColumnNameToName(const int column);
177179
void Finalize();
178180
bool IsFinalized();
179181

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

197197
friend class StatementSyncIterator;
198198
};

0 commit comments

Comments
 (0)