#[macro_export]
macro_rules! measure_time {
(@unit [$unit:literal, $as_unit:ident]; $tag:expr, $expr:expr) => {
{
let start = ::std::time::Instant::now();
let value = $expr;
$crate::re::tracing::debug!(
::core::concat!("{} in {} ", $unit),
$tag,
start.elapsed().$as_unit(),
);
value
}
};
(@auto $tag:expr, $expr:expr) => {
{
let start = ::std::time::Instant::now();
let value = $expr;
$crate::re::tracing::debug!(
"{} in {}",
$tag,
$crate::_macro_support::AutoUnitDuration::from(start),
);
value
}
};
($tag:expr, $expr:expr) => { $crate::measure_time!(@auto $tag, $expr) };
(MILLI, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["ms", as_millis]; $tag, $expr) };
(MICRO, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["µs", as_micros]; $tag, $expr) };
(NANO, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["ns", as_nanos]; $tag, $expr) };
(SEC, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["s", as_secs]; $tag, $expr) };
}
#[macro_export]
macro_rules! postgres_query {
($($body:tt)+) => {
$crate::postgres_query_internal! {$($body)+}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! postgres_query_internal {
(
@query_impl
($query_fn:ident, $execute_fn:ident -> $from_row:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
) => {
$(#[$fn_meta])*
$fn_vis async fn $fn_name<'c, E>(&self, executor: E) -> ::sqlx::Result<$from_row>
where
E: ::sqlx::Executor<'c, Database = ::sqlx::Postgres>,
{
use ::std::sync::OnceLock;
use $crate::sql::SqlTrimBoxed;
static __BOXED_QUERY__: OnceLock<Box<str>> = OnceLock::new();
::sqlx::$query_fn(
&**__BOXED_QUERY__.get_or_init(|| {
$sql.sql_trim_boxed()
})
)
$(.bind(&self.$field))*
.$execute_fn(executor)
.await
}
};
(
@query
($query_fn:ident, $execute_fn:ident -> $from_row:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident {$($field:ident),* $(,)?}
) => {
$crate::postgres_query_internal! {
@query_impl
($query_fn, $execute_fn -> $from_row),
$sql,
$(#[$fn_meta])*
$fn_vis async fn $fn_name ($($field),*)
}
};
(
@query
($query_fn:ident, $execute_fn:ident -> $from_row:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
) => {
$crate::postgres_query_internal! {
@query_impl
($query_fn, $execute_fn -> $from_row),
$sql,
$(#[$fn_meta])*
$fn_vis async fn $fn_name ($($field),*)
}
};
(
fetch_one($sql:expr) -> $from_row:ty,
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query_as, fetch_one -> $from_row),
$sql,
$($fn_spec)*
}
};
(
fetch_one_scalar($sql:expr) -> $from_row:ty,
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query_scalar, fetch_one -> $from_row),
$sql,
$($fn_spec)*
}
};
(
fetch_optional($sql:expr) -> $from_row:ty,
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query_as, fetch_optional -> ::std::option::Option<$from_row>),
$sql,
$($fn_spec)*
}
};
(
fetch_optional_scalar($sql:expr) -> $from_row:ty,
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query_scalar, fetch_optional -> ::std::option::Option<$from_row>),
$sql,
$($fn_spec)*
}
};
(
fetch_all($sql:expr) -> $from_row:ty,
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query_as, fetch_all -> ::std::vec::Vec<$from_row>),
$sql,
$($fn_spec)*
}
};
(
execute($sql:expr),
$($fn_spec:tt)*
) => {
$crate::postgres_query_internal! {
@query
(query, execute -> ::sqlx::postgres::PgQueryResult),
$sql,
$($fn_spec)*
}
};
}
#[macro_export]
macro_rules! sqlite_query {
($($body:tt)+) => {
$crate::sqlite_query_internal! {$($body)+}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! sqlite_query_internal {
(
@query_impl
($query_fn:ident, $execute_fn:ident -> $entity:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
) => {
$(#[$fn_meta])*
$fn_vis async fn $fn_name<'c, E>(&self, executor: E) -> ::sqlx::Result<$entity>
where
E: ::sqlx::Executor<'c, Database = ::sqlx::Sqlite>,
{
use ::std::sync::OnceLock;
use $crate::sql::SqlTrimBoxed;
static __BOXED_QUERY__: OnceLock<Box<str>> = OnceLock::new();
::sqlx::$query_fn(&**__BOXED_QUERY__.get_or_init(|| {
$sql.sql_trim_boxed()
})
)
$(.bind(&self.$field))*
.$execute_fn(executor)
.await
}
};
(
@query
($query_fn:ident, $execute_fn:ident -> $entity:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident {$($field:ident),* $(,)?}
) => {
$crate::sqlite_query_internal! {
@query_impl
($query_fn, $execute_fn -> $entity),
$sql,
$(#[$fn_meta])*
$fn_vis async fn $fn_name ($($field),*)
}
};
(
@query
($query_fn:ident, $execute_fn:ident -> $entity:ty),
$sql:expr,
$(#[$fn_meta:meta])*
$fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
) => {
$crate::sqlite_query_internal! {
@query_impl
($query_fn, $execute_fn -> $entity),
$sql,
$(#[$fn_meta])*
$fn_vis async fn $fn_name ($($field),*)
}
};
(
get($sql:expr) -> $entity:ty,
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query_as, fetch_one -> $entity),
$sql,
$($fn_spec)*
}
};
(
get_scalar($sql:expr) -> $entity:ty,
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query_scalar, fetch_one -> $entity),
$sql,
$($fn_spec)*
}
};
(
find($sql:expr) -> $entity:ty,
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query_as, fetch_optional -> ::std::option::Option<$entity>),
$sql,
$($fn_spec)*
}
};
(
find_scalar($sql:expr) -> $entity:ty,
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query_scalar, fetch_optional -> ::std::option::Option<$entity>),
$sql,
$($fn_spec)*
}
};
(
list($sql:expr) -> $entity:ty,
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query_as, fetch_all -> ::std::vec::Vec<$entity>),
$sql,
$($fn_spec)*
}
};
(
execute($sql:expr),
$($fn_spec:tt)*
) => {
$crate::sqlite_query_internal! {
@query
(query, execute -> ::sqlx::sqlite::SqliteQueryResult),
$sql,
$($fn_spec)*
}
};
}
#[macro_export]
macro_rules! with_builder {
($builder:ty => $ty:ty) => {
impl $ty {
pub fn builder() -> $builder {
<$builder as ::core::default::Default>::default()
}
}
};
}
#[macro_export]
macro_rules! generate_read_jemalloc_raw_data {
($vis:vis fn $name:ident) => {
$vis fn $name() -> ::core::option::Option<$crate::jemalloc::info::JemallocRawData> {
use ::std::prelude::*;
use ::std::sync::OnceLock;
use ::tikv_jemalloc_ctl::{
arenas, background_thread, background_thread_mib, epoch, epoch_mib, max_background_threads,
max_background_threads_mib, stats,
};
use $crate::jemalloc::info::{JemallocRawData, BackgroundThread};
struct Mib {
epoch: epoch_mib,
max_background_threads: max_background_threads_mib,
background_thread: background_thread_mib,
narenas: arenas::narenas_mib,
active: stats::active_mib,
allocated: stats::allocated_mib,
mapped: stats::mapped_mib,
metadata: stats::metadata_mib,
resident: stats::resident_mib,
retained: stats::retained_mib,
}
fn read_background_thread(mib: &Mib) -> Option<BackgroundThread> {
Some(BackgroundThread {
max: mib.max_background_threads.read().ok()?,
enabled: mib.background_thread.read().ok()?,
})
}
fn get_mib() -> Option<&'static Mib> {
static MIB: OnceLock<Option<Mib>> = OnceLock::new();
fn init() -> Option<Mib> {
let val = Mib {
epoch: epoch::mib().ok()?,
max_background_threads: max_background_threads::mib().ok()?,
background_thread: background_thread::mib().ok()?,
narenas: arenas::narenas::mib().ok()?,
active: stats::active::mib().ok()?,
allocated: stats::allocated::mib().ok()?,
mapped: stats::mapped::mib().ok()?,
metadata: stats::metadata::mib().ok()?,
resident: stats::resident::mib().ok()?,
retained: stats::retained::mib().ok()?,
};
Some(val)
}
MIB.get_or_init(init).as_ref()
}
let mib = get_mib()?;
mib.epoch.advance().ok()?;
let value = JemallocRawData {
background_thread: read_background_thread(&mib),
number_of_arenas: arenas::narenas::read().ok()?,
active_bytes: stats::active::read().ok()?,
allocated_bytes: stats::allocated::read().ok()?,
mapped_bytes: stats::mapped::read().ok()?,
metadata_bytes: stats::metadata::read().ok()?,
resident_bytes: stats::resident::read().ok()?,
retained_bytes: stats::retained::read().ok()?,
};
Some(value)
}
};
}