@@ -1024,9 +1024,8 @@ bool DatabaseSync::Open() {
10241024 env ()->isolate (), this , load_extension_ret, SQLITE_OK, false );
10251025 }
10261026
1027- diagnostics_channel::Channel* ch =
1028- diagnostics_channel::Channel::Get (env (), " sqlite.db.query" );
1029- if (ch != nullptr && ch->HasSubscribers ()) {
1027+ trace_channel_ = diagnostics_channel::Channel::Get (env (), " sqlite.db.query" );
1028+ if (trace_channel_ != nullptr && trace_channel_->HasSubscribers ()) {
10301029 sqlite3_trace_v2 (connection_, SQLITE_TRACE_PROFILE, TraceCallback, this );
10311030 }
10321031
@@ -1035,6 +1034,10 @@ bool DatabaseSync::Open() {
10351034
10361035void DatabaseSync::EnableTracing () {
10371036 if (!IsOpen ()) return ;
1037+ if (trace_channel_ == nullptr ) {
1038+ trace_channel_ =
1039+ diagnostics_channel::Channel::Get (env (), " sqlite.db.query" );
1040+ }
10381041 sqlite3_trace_v2 (connection_, SQLITE_TRACE_PROFILE, TraceCallback, this );
10391042}
10401043
@@ -2598,15 +2601,13 @@ int DatabaseSync::TraceCallback(unsigned int type,
25982601 DatabaseSync* db = static_cast <DatabaseSync*>(user_data);
25992602 Environment* env = db->env ();
26002603
2601- diagnostics_channel::Channel* ch =
2602- diagnostics_channel::Channel::Get (env, " sqlite.db.query" );
2604+ diagnostics_channel::Channel* ch = db->trace_channel_ ;
26032605 if (ch == nullptr || !ch->HasSubscribers ()) {
26042606 return 0 ;
26052607 }
26062608
26072609 Isolate* isolate = env->isolate ();
26082610 HandleScope handle_scope (isolate);
2609- Local<Context> context = env->context ();
26102611
26112612 char * expanded = sqlite3_expanded_sql (static_cast <sqlite3_stmt*>(p));
26122613 Local<Value> sql_string;
@@ -2629,24 +2630,19 @@ int DatabaseSync::TraceCallback(unsigned int type,
26292630 // sufficient since 2^53 ns (~104 days) exceeds any realistic query duration.
26302631 sqlite3_int64 duration_ns = *static_cast <sqlite3_int64*>(x);
26312632
2632- Local<Object> payload = Object::New (isolate);
2633- if (payload
2634- ->Set (context,
2635- FIXED_ONE_BYTE_STRING (isolate, " sql" ),
2636- sql_string)
2637- .IsNothing () ||
2638- payload
2639- ->Set (context,
2640- FIXED_ONE_BYTE_STRING (isolate, " database" ),
2641- db->object ())
2642- .IsNothing () ||
2643- payload
2644- ->Set (context,
2645- FIXED_ONE_BYTE_STRING (isolate, " duration" ),
2646- Number::New (isolate, static_cast <double >(duration_ns)))
2647- .IsNothing ()) {
2648- return 0 ;
2649- }
2633+ Local<Name> keys[3 ] = {
2634+ env->sql_string ().As <Name>(),
2635+ env->database_string ().As <Name>(),
2636+ env->duration_string ().As <Name>(),
2637+ };
2638+
2639+ Local<Value> values[3 ] = {
2640+ sql_string,
2641+ db->object (),
2642+ Number::New (isolate, static_cast <double >(duration_ns)),
2643+ };
2644+
2645+ Local<Object> payload = Object::New (isolate, Null (isolate), keys, values, 3 );
26502646
26512647 ch->Publish (env, payload);
26522648
0 commit comments