1 /* 2 * src/pl/plpython/plpy_elog.h 3 */ 4 5 #ifndef PLPY_ELOG_H 6 #define PLPY_ELOG_H 7 8 #include "plpython.h" 9 10 /* global exception classes */ 11 extern PyObject *PLy_exc_error; 12 extern PyObject *PLy_exc_fatal; 13 extern PyObject *PLy_exc_spi_error; 14 15 /* 16 * PLy_elog() 17 * 18 * See comments at elog() about the compiler hinting. 19 */ 20 #ifdef HAVE__BUILTIN_CONSTANT_P 21 #define PLy_elog(elevel, ...) \ 22 do { \ 23 PLy_elog_impl(elevel, __VA_ARGS__); \ 24 if (__builtin_constant_p(elevel) && (elevel) >= ERROR) \ 25 pg_unreachable(); \ 26 } while(0) 27 #else /* !HAVE__BUILTIN_CONSTANT_P */ 28 #define PLy_elog(elevel, ...) \ 29 do { \ 30 const int elevel_ = (elevel); \ 31 PLy_elog_impl(elevel_, __VA_ARGS__); \ 32 if (elevel_ >= ERROR) \ 33 pg_unreachable(); \ 34 } while(0) 35 #endif /* HAVE__BUILTIN_CONSTANT_P */ 36 37 extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3); 38 39 extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3); 40 41 extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, 42 unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5); 43 44 extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata); 45 46 #endif /* PLPY_ELOG_H */ 47