Skip to content

Commit bcb2d75

Browse files
committed
add ExtractRowValues
1 parent 4f43691 commit bcb2d75

File tree

1 file changed

+44
-55
lines changed

1 file changed

+44
-55
lines changed

src/node_sqlite.cc

Lines changed: 44 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2062,6 +2062,24 @@ MaybeLocal<Name> StatementExecutionHelper::ColumnNameToName(Environment* env,
20622062

20632063
void StatementSync::MemoryInfo(MemoryTracker* tracker) const {}
20642064

2065+
Maybe<void> ExtractRowValues(Environment* env,
2066+
sqlite3_stmt* stmt,
2067+
int num_cols,
2068+
bool use_big_ints,
2069+
LocalVector<Value>* row_values) {
2070+
row_values->clear();
2071+
row_values->reserve(num_cols);
2072+
for (int i = 0; i < num_cols; ++i) {
2073+
Local<Value> val;
2074+
if (!StatementExecutionHelper::ColumnToValue(env, stmt, i, use_big_ints)
2075+
.ToLocal(&val)) {
2076+
return Nothing<void>();
2077+
}
2078+
row_values->emplace_back(val);
2079+
}
2080+
return JustVoid();
2081+
}
2082+
20652083
Local<Value> StatementExecutionHelper::All(Environment* env,
20662084
DatabaseSync* db,
20672085
sqlite3_stmt* stmt,
@@ -2074,24 +2092,17 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
20742092
LocalVector<Value> row_values(isolate);
20752093
LocalVector<Name> row_keys(isolate);
20762094

2077-
if (return_arrays) {
2078-
while ((r = sqlite3_step(stmt)) == SQLITE_ROW) {
2079-
LocalVector<Value> array_values(isolate);
2080-
array_values.reserve(num_cols);
2081-
for (int i = 0; i < num_cols; ++i) {
2082-
Local<Value> val;
2083-
if (!ColumnToValue(env, stmt, i, use_big_ints).ToLocal(&val))
2084-
return Undefined(isolate);
2085-
array_values.emplace_back(val);
2086-
}
2087-
Local<Array> row_array =
2088-
Array::New(isolate, array_values.data(), array_values.size());
2089-
rows.emplace_back(row_array);
2095+
while ((r = sqlite3_step(stmt)) == SQLITE_ROW) {
2096+
if (ExtractRowValues(env, stmt, num_cols, use_big_ints, &row_values)
2097+
.IsNothing()) {
2098+
return Undefined(isolate);
20902099
}
2091-
} else {
2092-
LocalVector<Name> row_keys(isolate);
20932100

2094-
while ((r = sqlite3_step(stmt)) == SQLITE_ROW) {
2101+
if (return_arrays) {
2102+
Local<Array> row_array =
2103+
Array::New(isolate, row_values.data(), row_values.size());
2104+
rows.emplace_back(row_array);
2105+
} else {
20952106
if (row_keys.size() == 0) {
20962107
row_keys.reserve(num_cols);
20972108
for (int i = 0; i < num_cols; ++i) {
@@ -2101,16 +2112,6 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
21012112
row_keys.emplace_back(key);
21022113
}
21032114
}
2104-
2105-
LocalVector<Value> row_values(isolate);
2106-
row_values.reserve(num_cols);
2107-
for (int i = 0; i < num_cols; ++i) {
2108-
Local<Value> val;
2109-
if (!ColumnToValue(env, stmt, i, use_big_ints).ToLocal(&val))
2110-
return Undefined(isolate);
2111-
row_values.emplace_back(val);
2112-
}
2113-
21142115
DCHECK_EQ(row_keys.size(), row_values.size());
21152116
Local<Object> row_obj = Object::New(
21162117
isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols);
@@ -2211,36 +2212,26 @@ Local<Value> StatementExecutionHelper::Get(Environment* env,
22112212
return Undefined(isolate);
22122213
}
22132214

2215+
LocalVector<Value> row_values(isolate);
2216+
if (ExtractRowValues(env, stmt, num_cols, use_big_ints, &row_values)
2217+
.IsNothing()) {
2218+
return Undefined(isolate);
2219+
}
2220+
22142221
if (return_arrays) {
2215-
LocalVector<Value> array_values(isolate);
2216-
array_values.reserve(num_cols);
2217-
for (int i = 0; i < num_cols; ++i) {
2218-
MaybeLocal<Value> val =
2219-
StatementExecutionHelper::ColumnToValue(env, stmt, i, use_big_ints);
2220-
if (val.IsEmpty()) return Undefined(isolate);
2221-
array_values.emplace_back(val.ToLocalChecked());
2222-
}
2223-
return Array::New(isolate, array_values.data(), array_values.size());
2222+
return Array::New(isolate, row_values.data(), row_values.size());
22242223
} else {
22252224
LocalVector<Name> keys(isolate);
22262225
keys.reserve(num_cols);
2227-
LocalVector<Value> values(isolate);
2228-
values.reserve(num_cols);
2229-
22302226
for (int i = 0; i < num_cols; ++i) {
2231-
MaybeLocal<Name> key =
2232-
StatementExecutionHelper::ColumnNameToName(env, stmt, i);
2227+
MaybeLocal<Name> key = ColumnNameToName(env, stmt, i);
22332228
if (key.IsEmpty()) return Undefined(isolate);
2234-
MaybeLocal<Value> val =
2235-
StatementExecutionHelper::ColumnToValue(env, stmt, i, use_big_ints);
2236-
if (val.IsEmpty()) return Undefined(isolate);
22372229
keys.emplace_back(key.ToLocalChecked());
2238-
values.emplace_back(val.ToLocalChecked());
22392230
}
22402231

2241-
DCHECK_EQ(keys.size(), values.size());
2232+
DCHECK_EQ(keys.size(), row_values.size());
22422233
return Object::New(
2243-
isolate, Null(isolate), keys.data(), values.data(), num_cols);
2234+
isolate, Null(isolate), keys.data(), row_values.data(), num_cols);
22442235
}
22452236
}
22462237

@@ -2945,15 +2936,13 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
29452936
LocalVector<Name> row_keys(isolate);
29462937
LocalVector<Value> row_values(isolate);
29472938

2948-
row_values.reserve(num_cols);
2949-
for (int i = 0; i < num_cols; ++i) {
2950-
Local<Value> val;
2951-
if (!StatementExecutionHelper::ColumnToValue(
2952-
env, iter->stmt_->statement_, i, iter->stmt_->use_big_ints_)
2953-
.ToLocal(&val)) {
2954-
return;
2955-
}
2956-
row_values.emplace_back(val);
2939+
if (ExtractRowValues(env,
2940+
iter->stmt_->statement_,
2941+
num_cols,
2942+
iter->stmt_->use_big_ints_,
2943+
&row_values)
2944+
.IsNothing()) {
2945+
return;
29572946
}
29582947

29592948
if (iter->stmt_->return_arrays_) {

0 commit comments

Comments
 (0)