@@ -26,6 +26,7 @@ using v8::ConstructorBehavior;
2626using v8::Context;
2727using v8::DictionaryTemplate;
2828using v8::DontDelete;
29+ using v8::EscapableHandleScope;
2930using v8::Exception;
3031using v8::Function;
3132using v8::FunctionCallback;
@@ -2209,12 +2210,13 @@ Maybe<void> ExtractRowValues(Environment* env,
22092210 return JustVoid ();
22102211}
22112212
2212- Local <Value> StatementExecutionHelper::All (Environment* env,
2213- DatabaseSync* db,
2214- sqlite3_stmt* stmt,
2215- bool return_arrays,
2216- bool use_big_ints) {
2213+ MaybeLocal <Value> StatementExecutionHelper::All (Environment* env,
2214+ DatabaseSync* db,
2215+ sqlite3_stmt* stmt,
2216+ bool return_arrays,
2217+ bool use_big_ints) {
22172218 Isolate* isolate = env->isolate ();
2219+ EscapableHandleScope scope (isolate);
22182220 int r;
22192221 int num_cols = sqlite3_column_count (stmt);
22202222 LocalVector<Value> rows (isolate);
@@ -2224,7 +2226,7 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
22242226 while ((r = sqlite3_step (stmt)) == SQLITE_ROW) {
22252227 if (ExtractRowValues (env, stmt, num_cols, use_big_ints, &row_values)
22262228 .IsNothing ()) {
2227- return Undefined (isolate );
2229+ return MaybeLocal<Value>( );
22282230 }
22292231
22302232 if (return_arrays) {
@@ -2236,8 +2238,9 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
22362238 row_keys.reserve (num_cols);
22372239 for (int i = 0 ; i < num_cols; ++i) {
22382240 Local<Name> key;
2239- if (!ColumnNameToName (env, stmt, i).ToLocal (&key))
2240- return Undefined (isolate);
2241+ if (!ColumnNameToName (env, stmt, i).ToLocal (&key)) {
2242+ return MaybeLocal<Value>();
2243+ }
22412244 row_keys.emplace_back (key);
22422245 }
22432246 }
@@ -2248,18 +2251,19 @@ Local<Value> StatementExecutionHelper::All(Environment* env,
22482251 }
22492252 }
22502253
2251- CHECK_ERROR_OR_THROW (isolate, db, r, SQLITE_DONE, Undefined (isolate ));
2252- return Array::New (isolate, rows.data (), rows.size ());
2254+ CHECK_ERROR_OR_THROW (isolate, db, r, SQLITE_DONE, MaybeLocal<Value>( ));
2255+ return scope. Escape ( Array::New (isolate, rows.data (), rows.size () ));
22532256}
22542257
2255- Local <Object> StatementExecutionHelper::Run (Environment* env,
2256- DatabaseSync* db,
2257- sqlite3_stmt* stmt,
2258- bool use_big_ints) {
2258+ MaybeLocal <Object> StatementExecutionHelper::Run (Environment* env,
2259+ DatabaseSync* db,
2260+ sqlite3_stmt* stmt,
2261+ bool use_big_ints) {
22592262 Isolate* isolate = env->isolate ();
2263+ EscapableHandleScope scope (isolate);
22602264 sqlite3_step (stmt);
22612265 int r = sqlite3_reset (stmt);
2262- CHECK_ERROR_OR_THROW (isolate, db, r, SQLITE_OK, Object::New (isolate ));
2266+ CHECK_ERROR_OR_THROW (isolate, db, r, SQLITE_OK, MaybeLocal< Object>( ));
22632267 Local<Object> result = Object::New (isolate);
22642268 sqlite3_int64 last_insert_rowid = sqlite3_last_insert_rowid (db->Connection ());
22652269 sqlite3_int64 changes = sqlite3_changes64 (db->Connection ());
@@ -2281,10 +2285,10 @@ Local<Object> StatementExecutionHelper::Run(Environment* env,
22812285 .IsNothing () ||
22822286 result->Set (env->context (), env->changes_string (), changes_val)
22832287 .IsNothing ()) {
2284- return Object::New (isolate );
2288+ return MaybeLocal< Object>( );
22852289 }
22862290
2287- return result;
2291+ return scope. Escape ( result) ;
22882292}
22892293
22902294BaseObjectPtr<StatementSyncIterator> StatementExecutionHelper::Iterate (
@@ -2321,19 +2325,20 @@ BaseObjectPtr<StatementSyncIterator> StatementExecutionHelper::Iterate(
23212325 return iter;
23222326}
23232327
2324- Local <Value> StatementExecutionHelper::Get (Environment* env,
2325- DatabaseSync* db,
2326- sqlite3_stmt* stmt,
2327- bool return_arrays,
2328- bool use_big_ints) {
2328+ MaybeLocal <Value> StatementExecutionHelper::Get (Environment* env,
2329+ DatabaseSync* db,
2330+ sqlite3_stmt* stmt,
2331+ bool return_arrays,
2332+ bool use_big_ints) {
23292333 Isolate* isolate = env->isolate ();
2334+ EscapableHandleScope scope (isolate);
23302335 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt); });
23312336
23322337 int r = sqlite3_step (stmt);
2333- if (r == SQLITE_DONE) return Undefined (isolate);
2338+ if (r == SQLITE_DONE) return scope. Escape ( Undefined (isolate) );
23342339 if (r != SQLITE_ROW) {
23352340 THROW_ERR_SQLITE_ERROR (isolate, db);
2336- return Undefined (isolate );
2341+ return MaybeLocal<Value>( );
23372342 }
23382343
23392344 int num_cols = sqlite3_column_count (stmt);
@@ -2344,25 +2349,26 @@ Local<Value> StatementExecutionHelper::Get(Environment* env,
23442349 LocalVector<Value> row_values (isolate);
23452350 if (ExtractRowValues (env, stmt, num_cols, use_big_ints, &row_values)
23462351 .IsNothing ()) {
2347- return Undefined (isolate );
2352+ return MaybeLocal<Value>( );
23482353 }
23492354
23502355 if (return_arrays) {
2351- return Array::New (isolate, row_values.data (), row_values.size ());
2356+ return scope.Escape (
2357+ Array::New (isolate, row_values.data (), row_values.size ()));
23522358 } else {
23532359 LocalVector<Name> keys (isolate);
23542360 keys.reserve (num_cols);
23552361 for (int i = 0 ; i < num_cols; ++i) {
23562362 Local<Name> key;
23572363 if (!ColumnNameToName (env, stmt, i).ToLocal (&key)) {
2358- return Undefined (isolate );
2364+ return MaybeLocal<Value>( );
23592365 }
23602366 keys.emplace_back (key);
23612367 }
23622368
23632369 DCHECK_EQ (keys.size (), row_values.size ());
2364- return Object::New (
2365- isolate, Null (isolate), keys.data (), row_values.data (), num_cols);
2370+ return scope. Escape ( Object::New (
2371+ isolate, Null (isolate), keys.data (), row_values.data (), num_cols)) ;
23662372 }
23672373}
23682374
@@ -2381,11 +2387,16 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
23812387 }
23822388
23832389 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
2384- args.GetReturnValue ().Set (StatementExecutionHelper::All (env,
2385- stmt->db_ .get (),
2386- stmt->statement_ ,
2387- stmt->return_arrays_ ,
2388- stmt->use_big_ints_ ));
2390+
2391+ Local<Value> result;
2392+ if (StatementExecutionHelper::All (env,
2393+ stmt->db_ .get (),
2394+ stmt->statement_ ,
2395+ stmt->return_arrays_ ,
2396+ stmt->use_big_ints_ )
2397+ .ToLocal (&result)) {
2398+ args.GetReturnValue ().Set (result);
2399+ }
23892400}
23902401
23912402void StatementSync::Iterate (const FunctionCallbackInfo<Value>& args) {
@@ -2424,11 +2435,15 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
24242435 return ;
24252436 }
24262437
2427- args.GetReturnValue ().Set (StatementExecutionHelper::Get (env,
2428- stmt->db_ .get (),
2429- stmt->statement_ ,
2430- stmt->return_arrays_ ,
2431- stmt->use_big_ints_ ));
2438+ Local<Value> result;
2439+ if (StatementExecutionHelper::Get (env,
2440+ stmt->db_ .get (),
2441+ stmt->statement_ ,
2442+ stmt->return_arrays_ ,
2443+ stmt->use_big_ints_ )
2444+ .ToLocal (&result)) {
2445+ args.GetReturnValue ().Set (result);
2446+ }
24322447}
24332448
24342449void StatementSync::Run (const FunctionCallbackInfo<Value>& args) {
@@ -2444,8 +2459,12 @@ void StatementSync::Run(const FunctionCallbackInfo<Value>& args) {
24442459 return ;
24452460 }
24462461
2447- args.GetReturnValue ().Set (StatementExecutionHelper::Run (
2448- env, stmt->db_ .get (), stmt->statement_ , stmt->use_big_ints_ ));
2462+ Local<Object> result;
2463+ if (StatementExecutionHelper::Run (
2464+ env, stmt->db_ .get (), stmt->statement_ , stmt->use_big_ints_ )
2465+ .ToLocal (&result)) {
2466+ args.GetReturnValue ().Set (result);
2467+ }
24492468}
24502469
24512470void StatementSync::Columns (const FunctionCallbackInfo<Value>& args) {
@@ -2691,8 +2710,12 @@ void SQLTagStore::Run(const FunctionCallbackInfo<Value>& info) {
26912710 }
26922711 }
26932712
2694- info.GetReturnValue ().Set (StatementExecutionHelper::Run (
2695- env, stmt->db_ .get (), stmt->statement_ , stmt->use_big_ints_ ));
2713+ Local<Object> result;
2714+ if (StatementExecutionHelper::Run (
2715+ env, stmt->db_ .get (), stmt->statement_ , stmt->use_big_ints_ )
2716+ .ToLocal (&result)) {
2717+ info.GetReturnValue ().Set (result);
2718+ }
26962719}
26972720
26982721void SQLTagStore::Iterate (const FunctionCallbackInfo<Value>& args) {
@@ -2758,11 +2781,15 @@ void SQLTagStore::Get(const FunctionCallbackInfo<Value>& args) {
27582781 }
27592782 }
27602783
2761- args.GetReturnValue ().Set (StatementExecutionHelper::Get (env,
2762- stmt->db_ .get (),
2763- stmt->statement_ ,
2764- stmt->return_arrays_ ,
2765- stmt->use_big_ints_ ));
2784+ Local<Value> result;
2785+ if (StatementExecutionHelper::Get (env,
2786+ stmt->db_ .get (),
2787+ stmt->statement_ ,
2788+ stmt->return_arrays_ ,
2789+ stmt->use_big_ints_ )
2790+ .ToLocal (&result)) {
2791+ args.GetReturnValue ().Set (result);
2792+ }
27662793}
27672794
27682795void SQLTagStore::All (const FunctionCallbackInfo<Value>& args) {
@@ -2794,11 +2821,15 @@ void SQLTagStore::All(const FunctionCallbackInfo<Value>& args) {
27942821 }
27952822
27962823 auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
2797- args.GetReturnValue ().Set (StatementExecutionHelper::All (env,
2798- stmt->db_ .get (),
2799- stmt->statement_ ,
2800- stmt->return_arrays_ ,
2801- stmt->use_big_ints_ ));
2824+ Local<Value> result;
2825+ if (StatementExecutionHelper::All (env,
2826+ stmt->db_ .get (),
2827+ stmt->statement_ ,
2828+ stmt->return_arrays_ ,
2829+ stmt->use_big_ints_ )
2830+ .ToLocal (&result)) {
2831+ args.GetReturnValue ().Set (result);
2832+ }
28022833}
28032834
28042835void SQLTagStore::Size (const FunctionCallbackInfo<Value>& info) {
@@ -2854,7 +2885,7 @@ BaseObjectPtr<StatementSync> SQLTagStore::PrepareStatement(
28542885 return BaseObjectPtr<StatementSync>();
28552886 }
28562887 Utf8Value part (isolate, str_val);
2857- sql += * part;
2888+ sql += part. ToStringView () ;
28582889 if (i < n_params) {
28592890 sql += " ?" ;
28602891 }
@@ -2872,7 +2903,7 @@ BaseObjectPtr<StatementSync> SQLTagStore::PrepareStatement(
28722903 if (stmt == nullptr ) {
28732904 sqlite3_stmt* s = nullptr ;
28742905 int r = sqlite3_prepare_v2 (
2875- session->database_ ->connection_ , sql.c_str (), - 1 , &s, 0 );
2906+ session->database_ ->connection_ , sql.data (), sql. size () , &s, 0 );
28762907
28772908 if (r != SQLITE_OK) {
28782909 THROW_ERR_SQLITE_ERROR (isolate, " Failed to prepare statement" );
0 commit comments