Skip to content

Commit 92d55d8

Browse files
committed
sqlite: cache column names in StatementSync::All() and Get()
1 parent 5f02bdb commit 92d55d8

2 files changed

Lines changed: 25 additions & 47 deletions

File tree

src/node_sqlite.cc

Lines changed: 23 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,18 +2836,24 @@ Maybe<void> ExtractRowValues(Environment* env,
28362836
}
28372837

28382838
MaybeLocal<Value> StatementExecutionHelper::All(Environment* env,
2839-
DatabaseSync* db,
2840-
sqlite3_stmt* stmt,
2839+
StatementSync* sync_stmt,
28412840
bool return_arrays,
28422841
bool use_big_ints) {
28432842
Isolate* isolate = env->isolate();
28442843
EscapableHandleScope scope(isolate);
28452844
int r;
2845+
sqlite3_stmt* stmt = sync_stmt->statement_;
28462846
int num_cols = sqlite3_column_count(stmt);
28472847
LocalVector<Value> rows(isolate);
28482848
LocalVector<Value> row_values(isolate);
28492849
LocalVector<Name> row_keys(isolate);
28502850

2851+
if (!return_arrays && num_cols > 0) {
2852+
if (!sync_stmt->GetCachedColumnNames(&row_keys)) {
2853+
return MaybeLocal<Value>();
2854+
}
2855+
}
2856+
28512857
while ((r = sqlite3_step(stmt)) == SQLITE_ROW) {
28522858
if (ExtractRowValues(env, stmt, num_cols, use_big_ints, &row_values)
28532859
.IsNothing()) {
@@ -2859,24 +2865,15 @@ MaybeLocal<Value> StatementExecutionHelper::All(Environment* env,
28592865
Array::New(isolate, row_values.data(), row_values.size());
28602866
rows.emplace_back(row_array);
28612867
} else {
2862-
if (row_keys.size() == 0) {
2863-
row_keys.reserve(num_cols);
2864-
for (int i = 0; i < num_cols; ++i) {
2865-
Local<Name> key;
2866-
if (!ColumnNameToName(env, stmt, i).ToLocal(&key)) {
2867-
return MaybeLocal<Value>();
2868-
}
2869-
row_keys.emplace_back(key);
2870-
}
2871-
}
28722868
DCHECK_EQ(row_keys.size(), row_values.size());
28732869
Local<Object> row_obj = Object::New(
28742870
isolate, Null(isolate), row_keys.data(), row_values.data(), num_cols);
28752871
rows.emplace_back(row_obj);
28762872
}
28772873
}
28782874

2879-
CHECK_ERROR_OR_THROW(isolate, db, r, SQLITE_DONE, MaybeLocal<Value>());
2875+
CHECK_ERROR_OR_THROW(
2876+
isolate, sync_stmt->db_.get(), r, SQLITE_DONE, MaybeLocal<Value>());
28802877
return scope.Escape(Array::New(isolate, rows.data(), rows.size()));
28812878
}
28822879

@@ -2956,18 +2953,18 @@ BaseObjectPtr<StatementSyncIterator> StatementExecutionHelper::Iterate(
29562953
}
29572954

29582955
MaybeLocal<Value> StatementExecutionHelper::Get(Environment* env,
2959-
DatabaseSync* db,
2960-
sqlite3_stmt* stmt,
2956+
StatementSync* sync_stmt,
29612957
bool return_arrays,
29622958
bool use_big_ints) {
29632959
Isolate* isolate = env->isolate();
29642960
EscapableHandleScope scope(isolate);
2961+
sqlite3_stmt* stmt = sync_stmt->statement_;
29652962
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt); });
29662963

29672964
int r = sqlite3_step(stmt);
29682965
if (r == SQLITE_DONE) return scope.Escape(Undefined(isolate));
29692966
if (r != SQLITE_ROW) {
2970-
THROW_ERR_SQLITE_ERROR(isolate, db);
2967+
THROW_ERR_SQLITE_ERROR(isolate, sync_stmt->db_.get());
29712968
return MaybeLocal<Value>();
29722969
}
29732970

@@ -2987,13 +2984,8 @@ MaybeLocal<Value> StatementExecutionHelper::Get(Environment* env,
29872984
Array::New(isolate, row_values.data(), row_values.size()));
29882985
} else {
29892986
LocalVector<Name> keys(isolate);
2990-
keys.reserve(num_cols);
2991-
for (int i = 0; i < num_cols; ++i) {
2992-
Local<Name> key;
2993-
if (!ColumnNameToName(env, stmt, i).ToLocal(&key)) {
2994-
return MaybeLocal<Value>();
2995-
}
2996-
keys.emplace_back(key);
2987+
if (!sync_stmt->GetCachedColumnNames(&keys)) {
2988+
return MaybeLocal<Value>();
29972989
}
29982990

29992991
DCHECK_EQ(keys.size(), row_values.size());
@@ -3019,11 +3011,8 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
30193011
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
30203012

30213013
Local<Value> result;
3022-
if (StatementExecutionHelper::All(env,
3023-
stmt->db_.get(),
3024-
stmt->statement_,
3025-
stmt->return_arrays_,
3026-
stmt->use_big_ints_)
3014+
if (StatementExecutionHelper::All(
3015+
env, stmt, stmt->return_arrays_, stmt->use_big_ints_)
30273016
.ToLocal(&result)) {
30283017
args.GetReturnValue().Set(result);
30293018
}
@@ -3066,11 +3055,8 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
30663055
}
30673056

30683057
Local<Value> result;
3069-
if (StatementExecutionHelper::Get(env,
3070-
stmt->db_.get(),
3071-
stmt->statement_,
3072-
stmt->return_arrays_,
3073-
stmt->use_big_ints_)
3058+
if (StatementExecutionHelper::Get(
3059+
env, stmt, stmt->return_arrays_, stmt->use_big_ints_)
30743060
.ToLocal(&result)) {
30753061
args.GetReturnValue().Set(result);
30763062
}
@@ -3425,11 +3411,8 @@ void SQLTagStore::Get(const FunctionCallbackInfo<Value>& args) {
34253411
}
34263412

34273413
Local<Value> result;
3428-
if (StatementExecutionHelper::Get(env,
3429-
stmt->db_.get(),
3430-
stmt->statement_,
3431-
stmt->return_arrays_,
3432-
stmt->use_big_ints_)
3414+
if (StatementExecutionHelper::Get(
3415+
env, stmt.get(), stmt->return_arrays_, stmt->use_big_ints_)
34333416
.ToLocal(&result)) {
34343417
args.GetReturnValue().Set(result);
34353418
}
@@ -3465,11 +3448,8 @@ void SQLTagStore::All(const FunctionCallbackInfo<Value>& args) {
34653448

34663449
auto reset = OnScopeLeave([&]() { sqlite3_reset(stmt->statement_); });
34673450
Local<Value> result;
3468-
if (StatementExecutionHelper::All(env,
3469-
stmt->db_.get(),
3470-
stmt->statement_,
3471-
stmt->return_arrays_,
3472-
stmt->use_big_ints_)
3451+
if (StatementExecutionHelper::All(
3452+
env, stmt.get(), stmt->return_arrays_, stmt->use_big_ints_)
34733453
.ToLocal(&result)) {
34743454
args.GetReturnValue().Set(result);
34753455
}

src/node_sqlite.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ class BackupJob;
137137
class StatementExecutionHelper {
138138
public:
139139
static v8::MaybeLocal<v8::Value> All(Environment* env,
140-
DatabaseSync* db,
141-
sqlite3_stmt* stmt,
140+
StatementSync* stmt,
142141
bool return_arrays,
143142
bool use_big_ints);
144143
static v8::MaybeLocal<v8::Object> Run(Environment* env,
@@ -155,8 +154,7 @@ class StatementExecutionHelper {
155154
sqlite3_stmt* stmt,
156155
const int column);
157156
static v8::MaybeLocal<v8::Value> Get(Environment* env,
158-
DatabaseSync* db,
159-
sqlite3_stmt* stmt,
157+
StatementSync* stmt,
160158
bool return_arrays,
161159
bool use_big_ints);
162160
};

0 commit comments

Comments
 (0)