@@ -25,6 +25,10 @@ using v8::FunctionTemplate;
25
25
using v8::Integer;
26
26
using v8::Isolate;
27
27
using v8::Local;
28
+ using v8::LocalVector;
29
+ using v8::MaybeLocal;
30
+ using v8::Name;
31
+ using v8::Null;
28
32
using v8::Number;
29
33
using v8::Object;
30
34
using v8::String;
@@ -405,7 +409,7 @@ bool StatementSync::BindValue(const Local<Value>& value, const int index) {
405
409
return true ;
406
410
}
407
411
408
- Local <Value> StatementSync::ColumnToValue (const int column) {
412
+ MaybeLocal <Value> StatementSync::ColumnToValue (const int column) {
409
413
switch (sqlite3_column_type (statement_, column)) {
410
414
case SQLITE_INTEGER: {
411
415
sqlite3_int64 value = sqlite3_column_int64 (statement_, column);
@@ -419,7 +423,7 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
419
423
" represented as a JavaScript number: %" PRId64,
420
424
column,
421
425
value);
422
- return Local <Value>();
426
+ return MaybeLocal <Value>();
423
427
}
424
428
}
425
429
case SQLITE_FLOAT:
@@ -428,14 +432,10 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
428
432
case SQLITE_TEXT: {
429
433
const char * value = reinterpret_cast <const char *>(
430
434
sqlite3_column_text (statement_, column));
431
- Local<Value> val;
432
- if (!String::NewFromUtf8 (env ()->isolate (), value).ToLocal (&val)) {
433
- return Local<Value>();
434
- }
435
- return val;
435
+ return String::NewFromUtf8 (env ()->isolate (), value).As <Value>();
436
436
}
437
437
case SQLITE_NULL:
438
- return v8:: Null (env ()->isolate ());
438
+ return Null (env ()->isolate ());
439
439
case SQLITE_BLOB: {
440
440
size_t size =
441
441
static_cast <size_t >(sqlite3_column_bytes (statement_, column));
@@ -451,19 +451,15 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
451
451
}
452
452
}
453
453
454
- Local<Value > StatementSync::ColumnNameToValue (const int column) {
454
+ MaybeLocal<Name > StatementSync::ColumnNameToName (const int column) {
455
455
const char * col_name = sqlite3_column_name (statement_, column);
456
456
if (col_name == nullptr ) {
457
457
node::THROW_ERR_INVALID_STATE (
458
458
env (), " Cannot get name of column %d" , column);
459
- return Local<Value >();
459
+ return MaybeLocal<Name >();
460
460
}
461
461
462
- Local<String> key;
463
- if (!String::NewFromUtf8 (env ()->isolate (), col_name).ToLocal (&key)) {
464
- return Local<Value>();
465
- }
466
- return key;
462
+ return String::NewFromUtf8 (env ()->isolate (), col_name).As <Name>();
467
463
}
468
464
469
465
void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
@@ -474,38 +470,40 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
474
470
Environment* env = Environment::GetCurrent (args);
475
471
THROW_AND_RETURN_ON_BAD_STATE (
476
472
env, stmt->IsFinalized (), " statement has been finalized" );
473
+ Isolate* isolate = env->isolate ();
477
474
int r = sqlite3_reset (stmt->statement_ );
478
- CHECK_ERROR_OR_THROW (
479
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_OK, void ());
475
+ CHECK_ERROR_OR_THROW (isolate, stmt->db_ ->Connection (), r, SQLITE_OK, void ());
480
476
481
477
if (!stmt->BindParams (args)) {
482
478
return ;
483
479
}
484
480
485
481
auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
486
482
int num_cols = sqlite3_column_count (stmt->statement_ );
487
- std::vector<Local< Value>> rows;
483
+ LocalVector< Value> rows (isolate) ;
488
484
while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
489
- Local<Object> row = Object::New (env->isolate ());
485
+ LocalVector<Name> row_keys (isolate);
486
+ row_keys.reserve (num_cols);
487
+ LocalVector<Value> row_values (isolate);
488
+ row_values.reserve (num_cols);
490
489
491
490
for (int i = 0 ; i < num_cols; ++i) {
492
- Local<Value> key = stmt->ColumnNameToValue (i);
493
- if (key.IsEmpty ()) return ;
494
- Local<Value> val = stmt->ColumnToValue (i);
495
- if (val.IsEmpty ()) return ;
496
-
497
- if (row->Set (env->context (), key, val).IsNothing ()) {
498
- return ;
499
- }
491
+ Local<Name> key;
492
+ if (!stmt->ColumnNameToName (i).ToLocal (&key)) return ;
493
+ Local<Value> val;
494
+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
495
+ row_keys.emplace_back (key);
496
+ row_values.emplace_back (val);
500
497
}
501
498
499
+ Local<Object> row = Object::New (
500
+ isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
502
501
rows.emplace_back (row);
503
502
}
504
503
505
504
CHECK_ERROR_OR_THROW (
506
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_DONE, void ());
507
- args.GetReturnValue ().Set (
508
- Array::New (env->isolate (), rows.data (), rows.size ()));
505
+ isolate, stmt->db_ ->Connection (), r, SQLITE_DONE, void ());
506
+ args.GetReturnValue ().Set (Array::New (isolate, rows.data (), rows.size ()));
509
507
}
510
508
511
509
void StatementSync::Get (const FunctionCallbackInfo<Value>& args) {
@@ -514,9 +512,9 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
514
512
Environment* env = Environment::GetCurrent (args);
515
513
THROW_AND_RETURN_ON_BAD_STATE (
516
514
env, stmt->IsFinalized (), " statement has been finalized" );
515
+ Isolate* isolate = env->isolate ();
517
516
int r = sqlite3_reset (stmt->statement_ );
518
- CHECK_ERROR_OR_THROW (
519
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_OK, void ());
517
+ CHECK_ERROR_OR_THROW (isolate, stmt->db_ ->Connection (), r, SQLITE_OK, void ());
520
518
521
519
if (!stmt->BindParams (args)) {
522
520
return ;
@@ -526,7 +524,7 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
526
524
r = sqlite3_step (stmt->statement_ );
527
525
if (r == SQLITE_DONE) return ;
528
526
if (r != SQLITE_ROW) {
529
- THROW_ERR_SQLITE_ERROR (env-> isolate () , stmt->db_ ->Connection ());
527
+ THROW_ERR_SQLITE_ERROR (isolate, stmt->db_ ->Connection ());
530
528
return ;
531
529
}
532
530
@@ -535,19 +533,23 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
535
533
return ;
536
534
}
537
535
538
- Local<Object> result = Object::New (env->isolate ());
536
+ LocalVector<Name> keys (isolate);
537
+ keys.reserve (num_cols);
538
+ LocalVector<Value> values (isolate);
539
+ values.reserve (num_cols);
539
540
540
541
for (int i = 0 ; i < num_cols; ++i) {
541
- Local<Value> key = stmt->ColumnNameToValue (i);
542
- if (key.IsEmpty ()) return ;
543
- Local<Value> val = stmt->ColumnToValue (i);
544
- if (val.IsEmpty ()) return ;
545
-
546
- if (result->Set (env->context (), key, val).IsNothing ()) {
547
- return ;
548
- }
542
+ Local<Name> key;
543
+ if (!stmt->ColumnNameToName (i).ToLocal (&key)) return ;
544
+ Local<Value> val;
545
+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
546
+ keys.emplace_back (key);
547
+ values.emplace_back (val);
549
548
}
550
549
550
+ Local<Object> result =
551
+ Object::New (isolate, Null (isolate), keys.data (), values.data (), num_cols);
552
+
551
553
args.GetReturnValue ().Set (result);
552
554
}
553
555
@@ -676,7 +678,7 @@ Local<FunctionTemplate> StatementSync::GetConstructorTemplate(
676
678
if (tmpl.IsEmpty ()) {
677
679
Isolate* isolate = env->isolate ();
678
680
tmpl = NewFunctionTemplate (isolate, IllegalConstructor);
679
- tmpl->SetClassName (FIXED_ONE_BYTE_STRING (env-> isolate () , " StatementSync" ));
681
+ tmpl->SetClassName (FIXED_ONE_BYTE_STRING (isolate, " StatementSync" ));
680
682
tmpl->InstanceTemplate ()->SetInternalFieldCount (
681
683
StatementSync::kInternalFieldCount );
682
684
SetProtoMethod (isolate, tmpl, " all" , StatementSync::All);
0 commit comments