Skip to content

Commit f5c9e12

Browse files
committed
timing
1 parent 957e589 commit f5c9e12

File tree

5 files changed

+53
-13
lines changed

5 files changed

+53
-13
lines changed

docs/api.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ Toggle raw mode.
171171

172172
This function enables or disables raw mode. Prepared statements return objects by default, but if raw mode is enabled, the functions return arrays instead.
173173

174+
### timed([toggle]) ⇒ this
175+
176+
Toggle query duration timing.
177+
174178
### columns() ⇒ array of objects
175179

176180
Returns the columns in the result set returned by this prepared statement.

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ export declare class Statement {
5555
iterateSync(params?: unknown | undefined | null): RowsIterator
5656
pluck(pluck?: boolean | undefined | null): this
5757
raw(raw?: boolean | undefined | null): this
58+
timed(timed?: boolean | undefined | null): this
5859
columns(): unknown[]
5960
safeIntegers(toggle?: boolean | undefined | null): this
6061
interrupt(): void

promise.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,16 @@ class Statement {
240240
return this;
241241
}
242242

243+
/**
244+
* Toggle query timing.
245+
*
246+
* @param timing Enable or disable query timing. If you don't pass the parameter, query timing is enabled.
247+
*/
248+
timing(timingMode) {
249+
this.stmt.timing(timingMode);
250+
return this;
251+
}
252+
243253
get reader() {
244254
throw new Error("not implemented");
245255
}

src/lib.rs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ pub struct Statement {
516516
safe_ints: AtomicBool,
517517
raw: AtomicBool,
518518
pluck: AtomicBool,
519+
timed: AtomicBool,
519520
}
520521

521522
#[napi]
@@ -539,6 +540,7 @@ impl Statement {
539540
safe_ints: AtomicBool::new(safe_ints),
540541
raw: AtomicBool::new(raw),
541542
pluck: AtomicBool::new(pluck),
543+
timed: AtomicBool::new(false),
542544
}
543545
}
544546

@@ -576,14 +578,19 @@ impl Statement {
576578
let safe_ints = self.safe_ints.load(Ordering::SeqCst);
577579
let raw = self.raw.load(Ordering::SeqCst);
578580
let pluck = self.pluck.load(Ordering::SeqCst);
581+
let timed = self.timed.load(Ordering::SeqCst);
579582

580-
let start = std::time::Instant::now();
583+
let start = if timed {
584+
Some(std::time::Instant::now())
585+
} else {
586+
None
587+
};
581588
rt.block_on(async move {
582589
let mut stmt = self.stmt.lock().await;
583590
let params = map_params(&stmt, params)?;
584591
let mut rows = stmt.query(params).await.map_err(Error::from)?;
585592
let row = rows.next().await.map_err(Error::from)?;
586-
let duration = start.elapsed().as_secs_f64();
593+
let duration: Option<f64> = start.map(|start| start.elapsed().as_secs_f64());
587594
let result = Self::get_internal(
588595
&env,
589596
&row,
@@ -605,7 +612,7 @@ impl Statement {
605612
safe_ints: bool,
606613
raw: bool,
607614
pluck: bool,
608-
duration: f64,
615+
duration: Option<f64>,
609616
) -> Result<napi::JsUnknown> {
610617
match row {
611618
Some(row) => {
@@ -616,10 +623,12 @@ impl Statement {
616623
let mut js_object =
617624
map_row_object(&env, &column_names, &row, safe_ints, pluck)?
618625
.coerce_to_object()?;
619-
let mut metadata = env.create_object()?;
620-
let js_duration = env.create_double(duration)?;
621-
metadata.set_named_property("duration", js_duration)?;
622-
js_object.set_named_property("_metadata", metadata)?;
626+
if let Some(duration) = duration {
627+
let mut metadata = env.create_object()?;
628+
let js_duration = env.create_double(duration)?;
629+
metadata.set_named_property("duration", js_duration)?;
630+
js_object.set_named_property("_metadata", metadata)?;
631+
}
623632
Ok(js_object.into_unknown())
624633
}
625634
}
@@ -691,12 +700,6 @@ impl Statement {
691700
))
692701
}
693702

694-
#[napi]
695-
pub fn pluck(&self, pluck: Option<bool>) -> Result<&Self> {
696-
self.pluck.store(pluck.unwrap_or(true), Ordering::SeqCst);
697-
Ok(self)
698-
}
699-
700703
#[napi]
701704
pub fn raw(&self, raw: Option<bool>) -> Result<&Self> {
702705
let rt = runtime()?;
@@ -713,6 +716,18 @@ impl Statement {
713716
Ok(self)
714717
}
715718

719+
#[napi]
720+
pub fn pluck(&self, pluck: Option<bool>) -> Result<&Self> {
721+
self.pluck.store(pluck.unwrap_or(true), Ordering::SeqCst);
722+
Ok(self)
723+
}
724+
725+
#[napi]
726+
pub fn timing(&self, timed: Option<bool>) -> Result<&Self> {
727+
self.timed.store(timed.unwrap_or(true), Ordering::SeqCst);
728+
Ok(self)
729+
}
730+
716731
#[napi]
717732
pub fn columns(&self, env: Env) -> Result<Array> {
718733
let rt = runtime()?;

wrapper.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,16 @@ class Statement {
244244
return this;
245245
}
246246

247+
/**
248+
* Toggle query timing.
249+
*
250+
* @param timing Enable or disable query timing. If you don't pass the parameter, query timing is enabled.
251+
*/
252+
timing(timingMode) {
253+
this.stmt.timing(timingMode);
254+
return this;
255+
}
256+
247257
get reader() {
248258
throw new Error("not implemented");
249259
}

0 commit comments

Comments
 (0)