@@ -424,6 +424,127 @@ pub fn interrupt_pending() -> bool {
424424 unsafe { crate :: InterruptPending != 0 }
425425}
426426
427+ /// Send some kind of message to Postgres similar to the ereport macro, while specifying
428+ /// a text domain, analogous to Postgres' `ereport_domain` C macro.
429+ ///
430+ /// The argument order is:
431+ /// - `log_level: [PgLogLevel]`
432+ /// - `error_code: [PgSqlErrorCode]`
433+ /// - `message: String`
434+ /// - (optional) `detail: String`
435+ ///
436+ /// ## Examples
437+ ///
438+ /// ```rust,no_run
439+ /// # use pgrx_pg_sys::ereport_domain;
440+ /// # use pgrx_pg_sys::elog::PgLogLevel;
441+ /// # use pgrx_pg_sys::errcodes::PgSqlErrorCode;
442+ /// ereport_domain!(PgLogLevel::ERROR, "my_extension", PgSqlErrorCode::ERRCODE_INTERNAL_ERROR, "oh noes!");
443+ /// ```
444+ ///
445+ /// ```rust,no_run
446+ /// # use pgrx_pg_sys::ereport_domain;
447+ /// # use pgrx_pg_sys::elog::PgLogLevel;
448+ /// # use pgrx_pg_sys::errcodes::PgSqlErrorCode;
449+ /// ereport_domain!(PgLogLevel::LOG, "my_extension", PgSqlErrorCode::ERRCODE_SUCCESSFUL_COMPLETION, "translated message");
450+ /// ```
451+ #[ macro_export]
452+ macro_rules! ereport_domain {
453+ ( ERROR , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
454+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
455+ . set_domain( $domain)
456+ $( . set_detail( $detail) ) ?
457+ . report( $crate:: elog:: PgLogLevel :: ERROR ) ;
458+ unreachable!( ) ;
459+ } ;
460+
461+ ( PANIC , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
462+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
463+ . set_domain( $domain)
464+ $( . set_detail( $detail) ) ?
465+ . report( $crate:: elog:: PgLogLevel :: PANIC ) ;
466+ unreachable!( ) ;
467+ } ;
468+
469+ ( FATAL , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
470+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
471+ . set_domain( $domain)
472+ $( . set_detail( $detail) ) ?
473+ . report( $crate:: elog:: PgLogLevel :: FATAL ) ;
474+ unreachable!( ) ;
475+ } ;
476+
477+ ( WARNING , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
478+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
479+ . set_domain( $domain)
480+ $( . set_detail( $detail) ) ?
481+ . report( $crate:: elog:: PgLogLevel :: WARNING )
482+ } ;
483+
484+ ( NOTICE , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
485+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
486+ . set_domain( $domain)
487+ $( . set_detail( $detail) ) ?
488+ . report( $crate:: elog:: PgLogLevel :: NOTICE )
489+ } ;
490+
491+ ( INFO , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
492+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
493+ . set_domain( $domain)
494+ $( . set_detail( $detail) ) ?
495+ . report( $crate:: elog:: PgLogLevel :: INFO )
496+ } ;
497+
498+ ( LOG , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
499+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
500+ . set_domain( $domain)
501+ $( . set_detail( $detail) ) ?
502+ . report( $crate:: elog:: PgLogLevel :: LOG )
503+ } ;
504+
505+ ( DEBUG5 , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
506+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
507+ . set_domain( $domain)
508+ $( . set_detail( $detail) ) ?
509+ . report( $crate:: elog:: PgLogLevel :: DEBUG5 )
510+ } ;
511+
512+ ( DEBUG4 , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
513+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
514+ . set_domain( $domain)
515+ $( . set_detail( $detail) ) ?
516+ . report( $crate:: elog:: PgLogLevel :: DEBUG4 )
517+ } ;
518+
519+ ( DEBUG3 , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
520+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
521+ . set_domain( $domain)
522+ $( . set_detail( $detail) ) ?
523+ . report( $crate:: elog:: PgLogLevel :: DEBUG3 )
524+ } ;
525+
526+ ( DEBUG2 , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
527+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
528+ . set_domain( $domain)
529+ $( . set_detail( $detail) ) ?
530+ . report( $crate:: elog:: PgLogLevel :: DEBUG2 )
531+ } ;
532+
533+ ( DEBUG1 , $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
534+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
535+ . set_domain( $domain)
536+ $( . set_detail( $detail) ) ?
537+ . report( $crate:: elog:: PgLogLevel :: DEBUG1 )
538+ } ;
539+
540+ ( $loglevel: expr, $domain: expr, $errcode: expr, $message: expr $( , $detail: expr) ? $( , ) ?) => {
541+ $crate:: panic:: ErrorReport :: new( $errcode, $message, $crate:: function_name!( ) )
542+ . set_domain( $domain)
543+ $( . set_detail( $detail) ) ?
544+ . report( $loglevel) ;
545+ } ;
546+ }
547+
427548/// If an interrupt is pending (perhaps a user-initiated "cancel query" message to this backend),
428549/// this will safely abort the current transaction
429550#[ macro_export]
0 commit comments