@@ -27,6 +27,10 @@ using v8::Integer;
27
27
using v8::Isolate;
28
28
using v8::Local;
29
29
using v8::NewStringType;
30
+ using v8::LocalVector;
31
+ using v8::MaybeLocal;
32
+ using v8::Name;
33
+ using v8::Null;
30
34
using v8::Number;
31
35
using v8::Object;
32
36
using v8::String;
@@ -587,7 +591,7 @@ bool StatementSync::BindValue(const Local<Value>& value, const int index) {
587
591
return true ;
588
592
}
589
593
590
- Local <Value> StatementSync::ColumnToValue (const int column) {
594
+ MaybeLocal <Value> StatementSync::ColumnToValue (const int column) {
591
595
switch (sqlite3_column_type (statement_, column)) {
592
596
case SQLITE_INTEGER: {
593
597
sqlite3_int64 value = sqlite3_column_int64 (statement_, column);
@@ -601,7 +605,7 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
601
605
" represented as a JavaScript number: %" PRId64,
602
606
column,
603
607
value);
604
- return Local <Value>();
608
+ return MaybeLocal <Value>();
605
609
}
606
610
}
607
611
case SQLITE_FLOAT:
@@ -610,14 +614,10 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
610
614
case SQLITE_TEXT: {
611
615
const char * value = reinterpret_cast <const char *>(
612
616
sqlite3_column_text (statement_, column));
613
- Local<Value> val;
614
- if (!String::NewFromUtf8 (env ()->isolate (), value).ToLocal (&val)) {
615
- return Local<Value>();
616
- }
617
- return val;
617
+ return String::NewFromUtf8 (env ()->isolate (), value).As <Value>();
618
618
}
619
619
case SQLITE_NULL:
620
- return v8:: Null (env ()->isolate ());
620
+ return Null (env ()->isolate ());
621
621
case SQLITE_BLOB: {
622
622
size_t size =
623
623
static_cast <size_t >(sqlite3_column_bytes (statement_, column));
@@ -633,19 +633,15 @@ Local<Value> StatementSync::ColumnToValue(const int column) {
633
633
}
634
634
}
635
635
636
- Local<Value > StatementSync::ColumnNameToValue (const int column) {
636
+ MaybeLocal<Name > StatementSync::ColumnNameToName (const int column) {
637
637
const char * col_name = sqlite3_column_name (statement_, column);
638
638
if (col_name == nullptr ) {
639
639
node::THROW_ERR_INVALID_STATE (
640
640
env (), " Cannot get name of column %d" , column);
641
- return Local<Value >();
641
+ return MaybeLocal<Name >();
642
642
}
643
643
644
- Local<String> key;
645
- if (!String::NewFromUtf8 (env ()->isolate (), col_name).ToLocal (&key)) {
646
- return Local<Value>();
647
- }
648
- return key;
644
+ return String::NewFromUtf8 (env ()->isolate (), col_name).As <Name>();
649
645
}
650
646
651
647
void StatementSync::MemoryInfo (MemoryTracker* tracker) const {}
@@ -656,38 +652,40 @@ void StatementSync::All(const FunctionCallbackInfo<Value>& args) {
656
652
Environment* env = Environment::GetCurrent (args);
657
653
THROW_AND_RETURN_ON_BAD_STATE (
658
654
env, stmt->IsFinalized (), " statement has been finalized" );
655
+ Isolate* isolate = env->isolate ();
659
656
int r = sqlite3_reset (stmt->statement_ );
660
- CHECK_ERROR_OR_THROW (
661
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_OK, void ());
657
+ CHECK_ERROR_OR_THROW (isolate, stmt->db_ ->Connection (), r, SQLITE_OK, void ());
662
658
663
659
if (!stmt->BindParams (args)) {
664
660
return ;
665
661
}
666
662
667
663
auto reset = OnScopeLeave ([&]() { sqlite3_reset (stmt->statement_ ); });
668
664
int num_cols = sqlite3_column_count (stmt->statement_ );
669
- std::vector<Local< Value>> rows;
665
+ LocalVector< Value> rows (isolate) ;
670
666
while ((r = sqlite3_step (stmt->statement_ )) == SQLITE_ROW) {
671
- Local<Object> row = Object::New (env->isolate ());
667
+ LocalVector<Name> row_keys (isolate);
668
+ row_keys.reserve (num_cols);
669
+ LocalVector<Value> row_values (isolate);
670
+ row_values.reserve (num_cols);
672
671
673
672
for (int i = 0 ; i < num_cols; ++i) {
674
- Local<Value> key = stmt->ColumnNameToValue (i);
675
- if (key.IsEmpty ()) return ;
676
- Local<Value> val = stmt->ColumnToValue (i);
677
- if (val.IsEmpty ()) return ;
678
-
679
- if (row->Set (env->context (), key, val).IsNothing ()) {
680
- return ;
681
- }
673
+ Local<Name> key;
674
+ if (!stmt->ColumnNameToName (i).ToLocal (&key)) return ;
675
+ Local<Value> val;
676
+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
677
+ row_keys.emplace_back (key);
678
+ row_values.emplace_back (val);
682
679
}
683
680
681
+ Local<Object> row = Object::New (
682
+ isolate, Null (isolate), row_keys.data (), row_values.data (), num_cols);
684
683
rows.emplace_back (row);
685
684
}
686
685
687
686
CHECK_ERROR_OR_THROW (
688
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_DONE, void ());
689
- args.GetReturnValue ().Set (
690
- Array::New (env->isolate (), rows.data (), rows.size ()));
687
+ isolate, stmt->db_ ->Connection (), r, SQLITE_DONE, void ());
688
+ args.GetReturnValue ().Set (Array::New (isolate, rows.data (), rows.size ()));
691
689
}
692
690
693
691
void StatementSync::Get (const FunctionCallbackInfo<Value>& args) {
@@ -696,9 +694,9 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
696
694
Environment* env = Environment::GetCurrent (args);
697
695
THROW_AND_RETURN_ON_BAD_STATE (
698
696
env, stmt->IsFinalized (), " statement has been finalized" );
697
+ Isolate* isolate = env->isolate ();
699
698
int r = sqlite3_reset (stmt->statement_ );
700
- CHECK_ERROR_OR_THROW (
701
- env->isolate (), stmt->db_ ->Connection (), r, SQLITE_OK, void ());
699
+ CHECK_ERROR_OR_THROW (isolate, stmt->db_ ->Connection (), r, SQLITE_OK, void ());
702
700
703
701
if (!stmt->BindParams (args)) {
704
702
return ;
@@ -708,7 +706,7 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
708
706
r = sqlite3_step (stmt->statement_ );
709
707
if (r == SQLITE_DONE) return ;
710
708
if (r != SQLITE_ROW) {
711
- THROW_ERR_SQLITE_ERROR (env-> isolate () , stmt->db_ ->Connection ());
709
+ THROW_ERR_SQLITE_ERROR (isolate, stmt->db_ ->Connection ());
712
710
return ;
713
711
}
714
712
@@ -717,19 +715,23 @@ void StatementSync::Get(const FunctionCallbackInfo<Value>& args) {
717
715
return ;
718
716
}
719
717
720
- Local<Object> result = Object::New (env->isolate ());
718
+ LocalVector<Name> keys (isolate);
719
+ keys.reserve (num_cols);
720
+ LocalVector<Value> values (isolate);
721
+ values.reserve (num_cols);
721
722
722
723
for (int i = 0 ; i < num_cols; ++i) {
723
- Local<Value> key = stmt->ColumnNameToValue (i);
724
- if (key.IsEmpty ()) return ;
725
- Local<Value> val = stmt->ColumnToValue (i);
726
- if (val.IsEmpty ()) return ;
727
-
728
- if (result->Set (env->context (), key, val).IsNothing ()) {
729
- return ;
730
- }
724
+ Local<Name> key;
725
+ if (!stmt->ColumnNameToName (i).ToLocal (&key)) return ;
726
+ Local<Value> val;
727
+ if (!stmt->ColumnToValue (i).ToLocal (&val)) return ;
728
+ keys.emplace_back (key);
729
+ values.emplace_back (val);
731
730
}
732
731
732
+ Local<Object> result =
733
+ Object::New (isolate, Null (isolate), keys.data (), values.data (), num_cols);
734
+
733
735
args.GetReturnValue ().Set (result);
734
736
}
735
737
@@ -858,7 +860,7 @@ Local<FunctionTemplate> StatementSync::GetConstructorTemplate(
858
860
if (tmpl.IsEmpty ()) {
859
861
Isolate* isolate = env->isolate ();
860
862
tmpl = NewFunctionTemplate (isolate, IllegalConstructor);
861
- tmpl->SetClassName (FIXED_ONE_BYTE_STRING (env-> isolate () , " StatementSync" ));
863
+ tmpl->SetClassName (FIXED_ONE_BYTE_STRING (isolate, " StatementSync" ));
862
864
tmpl->InstanceTemplate ()->SetInternalFieldCount (
863
865
StatementSync::kInternalFieldCount );
864
866
SetProtoMethod (isolate, tmpl, " all" , StatementSync::All);
0 commit comments