@@ -1063,6 +1063,12 @@ void DatabaseSync::UntrackStatement(StatementSync* statement) {
10631063 }
10641064}
10651065
1066+ int DatabaseSync::Step (sqlite3_stmt* statement) {
1067+ statement_execution_depth_++;
1068+ auto leave = OnScopeLeave ([&]() { statement_execution_depth_--; });
1069+ return sqlite3_step (statement);
1070+ }
1071+
10661072inline bool DatabaseSync::IsOpen () {
10671073 return connection_ != nullptr ;
10681074}
@@ -1456,6 +1462,10 @@ void DatabaseSync::Close(const FunctionCallbackInfo<Value>& args) {
14561462 THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
14571463 THROW_AND_RETURN_ON_BAD_STATE (
14581464 env, db->IsInCallback (), " database cannot be closed while in a callback" );
1465+ THROW_AND_RETURN_ON_BAD_STATE (
1466+ env,
1467+ db->statement_execution_depth_ != 0 ,
1468+ " cannot close database while a statement is executing" );
14591469 db->FinalizeStatements ();
14601470 db->DeleteSessions ();
14611471 int r = sqlite3_close_v2 (db->connection_ );
@@ -1851,6 +1861,10 @@ void DatabaseSync::Deserialize(const FunctionCallbackInfo<Value>& args) {
18511861 ASSIGN_OR_RETURN_UNWRAP (&db, args.This ());
18521862 Environment* env = Environment::GetCurrent (args);
18531863 THROW_AND_RETURN_ON_BAD_STATE (env, !db->IsOpen (), " database is not open" );
1864+ THROW_AND_RETURN_ON_BAD_STATE (
1865+ env,
1866+ db->statement_execution_depth_ != 0 ,
1867+ " cannot deserialize while a statement is executing" );
18541868
18551869 if (!args[0 ]->IsUint8Array ()) {
18561870 THROW_ERR_INVALID_ARG_TYPE (env->isolate (),
@@ -2925,7 +2939,7 @@ MaybeLocal<Value> StatementExecutionHelper::All(Environment* env,
29252939 LocalVector<Value> row_values (isolate);
29262940 LocalVector<Name> row_keys (isolate);
29272941
2928- while ((r = sqlite3_step (stmt)) == SQLITE_ROW ) {
2942+ while ((r = db-> Step (stmt)) == SQLITE_ROW ) {
29292943 if (num_cols == 0 ) {
29302944 num_cols = sqlite3_column_count (stmt);
29312945 }
@@ -2967,7 +2981,7 @@ MaybeLocal<Object> StatementExecutionHelper::Run(Environment* env,
29672981 bool use_big_ints) {
29682982 Isolate* isolate = env->isolate ();
29692983 EscapableHandleScope scope (isolate);
2970- sqlite3_step (stmt);
2984+ db-> Step (stmt);
29712985 int r = sqlite3_reset (stmt);
29722986 CHECK_ERROR_OR_THROW (isolate, db, r, SQLITE_OK , MaybeLocal<Object>());
29732987
@@ -3045,7 +3059,7 @@ MaybeLocal<Value> StatementExecutionHelper::Get(Environment* env,
30453059 EscapableHandleScope scope (isolate);
30463060 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt); });
30473061
3048- int r = sqlite3_step (stmt);
3062+ int r = db-> Step (stmt);
30493063 if (r == SQLITE_DONE ) return scope.Escape (Undefined (isolate));
30503064 if (r != SQLITE_ROW ) {
30513065 THROW_ERR_SQLITE_ERROR (isolate, db);
@@ -3772,7 +3786,7 @@ void StatementSyncIterator::Next(const FunctionCallbackInfo<Value>& args) {
37723786 iter->statement_reset_generation_ != iter->stmt_ ->reset_generation_ ,
37733787 " iterator was invalidated" );
37743788
3775- int r = sqlite3_step (iter->stmt_ ->statement_ );
3789+ int r = iter-> stmt_ -> db_ -> Step (iter->stmt_ ->statement_ );
37763790 if (r != SQLITE_ROW ) {
37773791 CHECK_ERROR_OR_THROW (
37783792 env->isolate (), iter->stmt_ ->db_ .get (), r, SQLITE_DONE , void ());
0 commit comments