@@ -2836,18 +2836,24 @@ Maybe<void> ExtractRowValues(Environment* env,
28362836}
28372837
28382838MaybeLocal<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
29582955MaybeLocal<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 }
0 commit comments