Skip to content

Commit 89ab713

Browse files
committed
sqlite: add statement duration payload property
1 parent 2d36987 commit 89ab713

2 files changed

Lines changed: 43 additions & 6 deletions

File tree

src/node_sqlite.cc

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,15 +1008,15 @@ bool DatabaseSync::Open() {
10081008
diagnostics_channel::Channel* ch =
10091009
diagnostics_channel::Channel::Get(env(), "sqlite.db.query");
10101010
if (ch != nullptr && ch->HasSubscribers()) {
1011-
sqlite3_trace_v2(connection_, SQLITE_TRACE_STMT, TraceCallback, this);
1011+
sqlite3_trace_v2(connection_, SQLITE_TRACE_PROFILE, TraceCallback, this);
10121012
}
10131013

10141014
return true;
10151015
}
10161016

10171017
void DatabaseSync::EnableTracing() {
10181018
if (!IsOpen()) return;
1019-
sqlite3_trace_v2(connection_, SQLITE_TRACE_STMT, TraceCallback, this);
1019+
sqlite3_trace_v2(connection_, SQLITE_TRACE_PROFILE, TraceCallback, this);
10201020
}
10211021

10221022
void DatabaseSync::DisableTracing() {
@@ -2442,7 +2442,7 @@ int DatabaseSync::TraceCallback(unsigned int type,
24422442
void* user_data,
24432443
void* p,
24442444
void* x) {
2445-
if (type != SQLITE_TRACE_STMT) {
2445+
if (type != SQLITE_TRACE_PROFILE) {
24462446
return 0;
24472447
}
24482448

@@ -2476,6 +2476,10 @@ int DatabaseSync::TraceCallback(unsigned int type,
24762476
}
24772477
}
24782478

2479+
// x points to the estimated statement run time in nanoseconds. A double is
2480+
// sufficient since 2^53 ns (~104 days) exceeds any realistic query duration.
2481+
sqlite3_int64 duration_ns = *static_cast<sqlite3_int64*>(x);
2482+
24792483
Local<Object> payload = Object::New(isolate);
24802484
if (payload
24812485
->Set(context,
@@ -2486,6 +2490,11 @@ int DatabaseSync::TraceCallback(unsigned int type,
24862490
->Set(context,
24872491
FIXED_ONE_BYTE_STRING(isolate, "database"),
24882492
db->object())
2493+
.IsNothing() ||
2494+
payload
2495+
->Set(context,
2496+
FIXED_ONE_BYTE_STRING(isolate, "duration"),
2497+
Number::New(isolate, static_cast<double>(duration_ns)))
24892498
.IsNothing()) {
24902499
return 0;
24912500
}

test/parallel/test-sqlite-trace.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,7 @@ suite('sqlite.db.query diagnostics channel', () => {
147147
const calls = [];
148148
const db1 = new DatabaseSync(':memory:');
149149
const db2 = new DatabaseSync(':memory:');
150-
t.after(() => {
151-
db1.close(); db2.close();
152-
});
150+
t.after(() => { db1.close(); db2.close(); });
153151

154152
const handler = (msg) => calls.push(msg);
155153
dc.subscribe('sqlite.db.query', handler);
@@ -163,4 +161,34 @@ suite('sqlite.db.query diagnostics channel', () => {
163161
assert.strictEqual(calls[1].database, db2);
164162
assert.notStrictEqual(calls[0].database, calls[1].database);
165163
});
164+
165+
it('duration is a number', (t) => {
166+
const calls = [];
167+
const db = new DatabaseSync(':memory:');
168+
t.after(() => db.close());
169+
170+
const handler = (msg) => calls.push(msg);
171+
dc.subscribe('sqlite.db.query', handler);
172+
t.after(() => dc.unsubscribe('sqlite.db.query', handler));
173+
174+
db.exec('CREATE TABLE t (x INTEGER)');
175+
176+
assert.strictEqual(calls.length, 1);
177+
assert.strictEqual(typeof calls[0].duration, 'number');
178+
});
179+
180+
it('duration is non-negative', (t) => {
181+
const calls = [];
182+
const db = new DatabaseSync(':memory:');
183+
t.after(() => db.close());
184+
185+
const handler = (msg) => calls.push(msg);
186+
dc.subscribe('sqlite.db.query', handler);
187+
t.after(() => dc.unsubscribe('sqlite.db.query', handler));
188+
189+
db.exec('CREATE TABLE t (x INTEGER)');
190+
191+
assert.strictEqual(calls.length, 1);
192+
assert.ok(calls[0].duration >= 0);
193+
});
166194
});

0 commit comments

Comments
 (0)