1#[macro_export]
25macro_rules! measure_time {
26 (@unit [$unit:literal, $as_unit:ident]; $tag:expr, $expr:expr) => {
28 {
29 let start = ::std::time::Instant::now();
30 let value = $expr;
31 $crate::re::tracing::debug!(
32 ::core::concat!("{} in {} ", $unit),
33 $tag,
34 start.elapsed().$as_unit(),
35 );
36 value
37 }
38 };
39 (@auto $tag:expr, $expr:expr) => {
41 {
42 let start = ::std::time::Instant::now();
43 let value = $expr;
44 $crate::re::tracing::debug!(
45 "{} in {}",
46 $tag,
47 $crate::_macro_support::AutoUnitDuration::from(start),
48 );
49 value
50 }
51 };
52 ($tag:expr, $expr:expr) => { $crate::measure_time!(@auto $tag, $expr) };
54 (MILLI, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["ms", as_millis]; $tag, $expr) };
56 (MICRO, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["µs", as_micros]; $tag, $expr) };
57 (NANO, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["ns", as_nanos]; $tag, $expr) };
58 (SEC, $tag:expr, $expr:expr) => { $crate::measure_time!(@unit ["s", as_secs]; $tag, $expr) };
59}
60
61#[macro_export]
156macro_rules! postgres_query {
157 ($($body:tt)+) => {
159 $crate::postgres_query_internal! {$($body)+}
160 };
161}
162
163#[doc(hidden)]
164#[macro_export]
165macro_rules! postgres_query_internal {
166 (
168 @query_impl
169 ($query_fn:ident, $execute_fn:ident -> $from_row:ty),
170 $sql:expr,
171 $(#[$fn_meta:meta])*
172 $fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
173 ) => {
174 $(#[$fn_meta])*
175 $fn_vis async fn $fn_name<'c, E>(&self, executor: E) -> ::sqlx::Result<$from_row>
176 where
177 E: ::sqlx::Executor<'c, Database = ::sqlx::Postgres>,
178 {
179 use ::std::sync::OnceLock;
180 use $crate::sql::SqlTrimBoxed;
181
182 static __BOXED_QUERY__: OnceLock<Box<str>> = OnceLock::new();
184
185 ::sqlx::$query_fn(
186 &**__BOXED_QUERY__.get_or_init(|| {
187 $sql.sql_trim_boxed()
188 })
189 )
190 $(.bind(&self.$field))*
191 .$execute_fn(executor)
192 .await
193 }
194 };
195 (
197 @query
198 ($query_fn:ident, $execute_fn:ident -> $from_row:ty),
199 $sql:expr,
200 $(#[$fn_meta:meta])*
201 $fn_vis:vis async fn $fn_name:ident {$($field:ident),* $(,)?}
202 ) => {
203 $crate::postgres_query_internal! {
204 @query_impl
205 ($query_fn, $execute_fn -> $from_row),
206 $sql,
207 $(#[$fn_meta])*
208 $fn_vis async fn $fn_name ($($field),*)
209 }
210 };
211 (
213 @query
214 ($query_fn:ident, $execute_fn:ident -> $from_row:ty),
215 $sql:expr,
216 $(#[$fn_meta:meta])*
217 $fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
218 ) => {
219 $crate::postgres_query_internal! {
220 @query_impl
221 ($query_fn, $execute_fn -> $from_row),
222 $sql,
223 $(#[$fn_meta])*
224 $fn_vis async fn $fn_name ($($field),*)
225 }
226 };
227 (
229 fetch_one($sql:expr) -> $from_row:ty,
230 $($fn_spec:tt)*
231 ) => {
232 $crate::postgres_query_internal! {
233 @query
234 (query_as, fetch_one -> $from_row),
235 $sql,
236 $($fn_spec)*
237 }
238 };
239 (
241 fetch_one_scalar($sql:expr) -> $from_row:ty,
242 $($fn_spec:tt)*
243 ) => {
244 $crate::postgres_query_internal! {
245 @query
246 (query_scalar, fetch_one -> $from_row),
247 $sql,
248 $($fn_spec)*
249 }
250 };
251 (
253 fetch_optional($sql:expr) -> $from_row:ty,
254 $($fn_spec:tt)*
255 ) => {
256 $crate::postgres_query_internal! {
257 @query
258 (query_as, fetch_optional -> ::std::option::Option<$from_row>),
259 $sql,
260 $($fn_spec)*
261 }
262 };
263 (
265 fetch_optional_scalar($sql:expr) -> $from_row:ty,
266 $($fn_spec:tt)*
267 ) => {
268 $crate::postgres_query_internal! {
269 @query
270 (query_scalar, fetch_optional -> ::std::option::Option<$from_row>),
271 $sql,
272 $($fn_spec)*
273 }
274 };
275 (
277 fetch_all($sql:expr) -> $from_row:ty,
278 $($fn_spec:tt)*
279 ) => {
280 $crate::postgres_query_internal! {
281 @query
282 (query_as, fetch_all -> ::std::vec::Vec<$from_row>),
283 $sql,
284 $($fn_spec)*
285 }
286 };
287 (
289 execute($sql:expr),
290 $($fn_spec:tt)*
291 ) => {
292 $crate::postgres_query_internal! {
293 @query
294 (query, execute -> ::sqlx::postgres::PgQueryResult),
295 $sql,
296 $($fn_spec)*
297 }
298 };
299}
300
301#[macro_export]
302macro_rules! sqlite_query {
303 ($($body:tt)+) => {
305 $crate::sqlite_query_internal! {$($body)+}
306 };
307}
308
309#[doc(hidden)]
310#[macro_export]
311macro_rules! sqlite_query_internal {
312 (
314 @query_impl
315 ($query_fn:ident, $execute_fn:ident -> $entity:ty),
316 $sql:expr,
317 $(#[$fn_meta:meta])*
318 $fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
319 ) => {
320 $(#[$fn_meta])*
321 $fn_vis async fn $fn_name<'c, E>(&self, executor: E) -> ::sqlx::Result<$entity>
322 where
323 E: ::sqlx::Executor<'c, Database = ::sqlx::Sqlite>,
324 {
325 use ::std::sync::OnceLock;
326 use $crate::sql::SqlTrimBoxed;
327
328 static __BOXED_QUERY__: OnceLock<Box<str>> = OnceLock::new();
330 ::sqlx::$query_fn(&**__BOXED_QUERY__.get_or_init(|| {
331 $sql.sql_trim_boxed()
332 })
333 )
334 $(.bind(&self.$field))*
335 .$execute_fn(executor)
336 .await
337 }
338 };
339 (
341 @query
342 ($query_fn:ident, $execute_fn:ident -> $entity:ty),
343 $sql:expr,
344 $(#[$fn_meta:meta])*
345 $fn_vis:vis async fn $fn_name:ident {$($field:ident),* $(,)?}
346 ) => {
347 $crate::sqlite_query_internal! {
348 @query_impl
349 ($query_fn, $execute_fn -> $entity),
350 $sql,
351 $(#[$fn_meta])*
352 $fn_vis async fn $fn_name ($($field),*)
353 }
354 };
355 (
357 @query
358 ($query_fn:ident, $execute_fn:ident -> $entity:ty),
359 $sql:expr,
360 $(#[$fn_meta:meta])*
361 $fn_vis:vis async fn $fn_name:ident ($($field:tt),* $(,)?)
362 ) => {
363 $crate::sqlite_query_internal! {
364 @query_impl
365 ($query_fn, $execute_fn -> $entity),
366 $sql,
367 $(#[$fn_meta])*
368 $fn_vis async fn $fn_name ($($field),*)
369 }
370 };
371 (
373 get($sql:expr) -> $entity:ty,
374 $($fn_spec:tt)*
375 ) => {
376 $crate::sqlite_query_internal! {
377 @query
378 (query_as, fetch_one -> $entity),
379 $sql,
380 $($fn_spec)*
381 }
382 };
383 (
385 get_scalar($sql:expr) -> $entity:ty,
386 $($fn_spec:tt)*
387 ) => {
388 $crate::sqlite_query_internal! {
389 @query
390 (query_scalar, fetch_one -> $entity),
391 $sql,
392 $($fn_spec)*
393 }
394 };
395 (
397 find($sql:expr) -> $entity:ty,
398 $($fn_spec:tt)*
399 ) => {
400 $crate::sqlite_query_internal! {
401 @query
402 (query_as, fetch_optional -> ::std::option::Option<$entity>),
403 $sql,
404 $($fn_spec)*
405 }
406 };
407 (
409 find_scalar($sql:expr) -> $entity:ty,
410 $($fn_spec:tt)*
411 ) => {
412 $crate::sqlite_query_internal! {
413 @query
414 (query_scalar, fetch_optional -> ::std::option::Option<$entity>),
415 $sql,
416 $($fn_spec)*
417 }
418 };
419 (
421 list($sql:expr) -> $entity:ty,
422 $($fn_spec:tt)*
423 ) => {
424 $crate::sqlite_query_internal! {
425 @query
426 (query_as, fetch_all -> ::std::vec::Vec<$entity>),
427 $sql,
428 $($fn_spec)*
429 }
430 };
431 (
433 execute($sql:expr),
434 $($fn_spec:tt)*
435 ) => {
436 $crate::sqlite_query_internal! {
437 @query
438 (query, execute -> ::sqlx::sqlite::SqliteQueryResult),
439 $sql,
440 $($fn_spec)*
441 }
442 };
443}
444
445#[macro_export]
447macro_rules! with_builder {
448 ($builder:ty => $ty:ty) => {
449 impl $ty {
450 pub fn builder() -> $builder {
451 <$builder as ::core::default::Default>::default()
452 }
453 }
454 };
455}
456
457#[macro_export]
461macro_rules! generate_read_jemalloc_raw_data {
462 ($vis:vis fn $name:ident) => {
463 $vis fn $name() -> ::core::option::Option<$crate::jemalloc::info::JemallocRawData> {
464 use ::std::prelude::*;
465 use ::std::sync::OnceLock;
466
467 use ::tikv_jemalloc_ctl::{
468 arenas, background_thread, background_thread_mib, epoch, epoch_mib, max_background_threads,
469 max_background_threads_mib, stats,
470 };
471
472 use $crate::jemalloc::info::{JemallocRawData, BackgroundThread};
473
474 struct Mib {
475 epoch: epoch_mib,
476 max_background_threads: max_background_threads_mib,
477 background_thread: background_thread_mib,
478 narenas: arenas::narenas_mib,
479 active: stats::active_mib,
480 allocated: stats::allocated_mib,
481 mapped: stats::mapped_mib,
482 metadata: stats::metadata_mib,
483 resident: stats::resident_mib,
484 retained: stats::retained_mib,
485 }
486
487 fn read_background_thread(mib: &Mib) -> Option<BackgroundThread> {
488 Some(BackgroundThread {
489 max: mib.max_background_threads.read().ok()?,
490 enabled: mib.background_thread.read().ok()?,
491 })
492 }
493
494 fn get_mib() -> Option<&'static Mib> {
495 static MIB: OnceLock<Option<Mib>> = OnceLock::new();
496 fn init() -> Option<Mib> {
497 let val = Mib {
498 epoch: epoch::mib().ok()?,
499 max_background_threads: max_background_threads::mib().ok()?,
500 background_thread: background_thread::mib().ok()?,
501 narenas: arenas::narenas::mib().ok()?,
502 active: stats::active::mib().ok()?,
503 allocated: stats::allocated::mib().ok()?,
504 mapped: stats::mapped::mib().ok()?,
505 metadata: stats::metadata::mib().ok()?,
506 resident: stats::resident::mib().ok()?,
507 retained: stats::retained::mib().ok()?,
508 };
509 Some(val)
510 }
511 MIB.get_or_init(init).as_ref()
512 }
513
514 let mib = get_mib()?;
515 mib.epoch.advance().ok()?;
518
519 let value = JemallocRawData {
520 background_thread: read_background_thread(&mib),
522 number_of_arenas: arenas::narenas::read().ok()?,
523 active_bytes: stats::active::read().ok()?,
525 allocated_bytes: stats::allocated::read().ok()?,
526 mapped_bytes: stats::mapped::read().ok()?,
527 metadata_bytes: stats::metadata::read().ok()?,
528 resident_bytes: stats::resident::read().ok()?,
529 retained_bytes: stats::retained::read().ok()?,
530 };
531 Some(value)
532 }
533 };
534}