summaryrefslogtreecommitdiffstats
path: root/src/pl/plpython/plpy_elog.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/pl/plpython/plpy_elog.h')
-rw-r--r--src/pl/plpython/plpy_elog.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h
new file mode 100644
index 0000000..e02ef4f
--- /dev/null
+++ b/src/pl/plpython/plpy_elog.h
@@ -0,0 +1,46 @@
+/*
+ * src/pl/plpython/plpy_elog.h
+ */
+
+#ifndef PLPY_ELOG_H
+#define PLPY_ELOG_H
+
+#include "plpython.h"
+
+/* global exception classes */
+extern PyObject *PLy_exc_error;
+extern PyObject *PLy_exc_fatal;
+extern PyObject *PLy_exc_spi_error;
+
+/*
+ * PLy_elog()
+ *
+ * See comments at elog() about the compiler hinting.
+ */
+#ifdef HAVE__BUILTIN_CONSTANT_P
+#define PLy_elog(elevel, ...) \
+ do { \
+ PLy_elog_impl(elevel, __VA_ARGS__); \
+ if (__builtin_constant_p(elevel) && (elevel) >= ERROR) \
+ pg_unreachable(); \
+ } while(0)
+#else /* !HAVE__BUILTIN_CONSTANT_P */
+#define PLy_elog(elevel, ...) \
+ do { \
+ const int elevel_ = (elevel); \
+ PLy_elog_impl(elevel_, __VA_ARGS__); \
+ if (elevel_ >= ERROR) \
+ pg_unreachable(); \
+ } while(0)
+#endif /* HAVE__BUILTIN_CONSTANT_P */
+
+extern void PLy_elog_impl(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);
+
+extern void PLy_exception_set(PyObject *exc, const char *fmt,...) pg_attribute_printf(2, 3);
+
+extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural,
+ unsigned long n,...) pg_attribute_printf(2, 5) pg_attribute_printf(3, 5);
+
+extern void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata);
+
+#endif /* PLPY_ELOG_H */