25 PyObject *base, PyObject *dict,
26 const char *modname, PyObject *mod);
30static PyObject *
PLy_debug(PyObject *self, PyObject *
args, PyObject *kw);
31static PyObject *
PLy_log(PyObject *self, PyObject *
args, PyObject *kw);
32static PyObject *
PLy_info(PyObject *self, PyObject *
args, PyObject *kw);
33static PyObject *
PLy_notice(PyObject *self, PyObject *
args, PyObject *kw);
34static PyObject *
PLy_warning(PyObject *self, PyObject *
args, PyObject *kw);
35static PyObject *
PLy_error(PyObject *self, PyObject *
args, PyObject *kw);
36static PyObject *
PLy_fatal(PyObject *self, PyObject *
args, PyObject *kw);
51#include "spiexceptions.h"
100 {NULL, NULL, 0, NULL}
104 {NULL, NULL, 0, NULL}
108 PyModuleDef_HEAD_INIT,
115 PyModuleDef_HEAD_INIT,
116 .m_name =
"spiexceptions",
161 main_mod = PyImport_AddModule(
"__main__");
162 main_dict = PyModule_GetDict(main_mod);
163 plpy_mod = PyImport_AddModule(
"plpy");
164 if (plpy_mod == NULL)
166 PyDict_SetItemString(main_dict,
"plpy", plpy_mod);
167 if (PyErr_Occurred())
179 PLy_elog(
ERROR,
"could not create the spiexceptions module");
186 if (PyModule_AddObject(plpy,
"spiexceptions", excmod) < 0)
196 hash_ctl.
keysize =
sizeof(int);
209 const char *modname, PyObject *mod)
213 exc = PyErr_NewException(
name, base, dict);
222 PyModule_AddObject(mod, modname, exc);
247 PyObject *dict = PyDict_New();
253 if (sqlstate == NULL)
256 PyDict_SetItemString(dict,
"sqlstate", sqlstate);
274static PyObject *
PLy_output(
volatile int level, PyObject *self,
275 PyObject *
args, PyObject *kw);
326 if (!PyArg_ParseTuple(
args,
"s:quote_literal", &
str))
343 if (!PyArg_ParseTuple(
args,
"z:quote_nullable", &
str))
363 if (!PyArg_ParseTuple(
args,
"s:quote_ident", &
str))
378 PyObject *so = PyObject_Str(obj);
398 char *
volatile sqlstatestr = NULL;
399 char *
volatile message = NULL;
400 char *
volatile detail = NULL;
401 char *
volatile hint = NULL;
402 char *
volatile column_name = NULL;
403 char *
volatile constraint_name = NULL;
404 char *
volatile datatype_name = NULL;
405 char *
volatile table_name = NULL;
406 char *
volatile schema_name = NULL;
410 PyObject *
volatile so;
413 if (PyTuple_Size(
args) == 1)
421 if (!PyArg_UnpackTuple(
args,
"plpy.elog", 1, 1, &o))
423 so = PyObject_Str(o);
426 so = PyObject_Str(
args);
439 while (PyDict_Next(kw, &pos, &
key, &
value))
443 if (strcmp(keyword,
"message") == 0)
446 if (PyTuple_Size(
args) != 0)
448 PLy_exception_set(PyExc_TypeError,
"argument 'message' given by name and position");
456 else if (strcmp(keyword,
"detail") == 0)
458 else if (strcmp(keyword,
"hint") == 0)
460 else if (strcmp(keyword,
"sqlstate") == 0)
462 else if (strcmp(keyword,
"schema_name") == 0)
464 else if (strcmp(keyword,
"table_name") == 0)
466 else if (strcmp(keyword,
"column_name") == 0)
468 else if (strcmp(keyword,
"datatype_name") == 0)
470 else if (strcmp(keyword,
"constraint_name") == 0)
475 "'%s' is an invalid keyword argument for this function",
482 if (sqlstatestr != NULL)
484 if (strlen(sqlstatestr) != 5)
490 if (strspn(sqlstatestr,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)
512 if (schema_name != NULL)
514 if (table_name != NULL)
516 if (column_name != NULL)
518 if (datatype_name != NULL)
520 if (constraint_name != NULL)
524 ((sqlstate != 0) ?
errcode(sqlstate) : 0,
527 (hint != NULL) ?
errhint(
"%s", hint) : 0,
528 (column_name != NULL) ?
530 (constraint_name != NULL) ?
532 (datatype_name != NULL) ?
534 (table_name != NULL) ?
536 (schema_name != NULL) ?
void(* pg_funcptr_t)(void)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
int err_generic_string(int field, const char *str)
int errmsg_internal(const char *fmt,...)
void FreeErrorData(ErrorData *edata)
int errdetail_internal(const char *fmt,...)
ErrorData * CopyErrorData(void)
void FlushErrorState(void)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
char * unpack_sql_state(int sql_state)
#define MAKE_SQLSTATE(ch1, ch2, ch3, ch4, ch5)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext CurrentMemoryContext
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
PyObject * PLy_cursor(PyObject *self, PyObject *args)
void PLy_cursor_init_type(void)
PyObject * PLy_exc_spi_error
void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata)
void PLy_exception_set(PyObject *exc, const char *fmt,...)
void PLy_plan_init_type(void)
PyMODINIT_FUNC PyInit_plpy(void)
static PyObject * PLy_notice(PyObject *self, PyObject *args, PyObject *kw)
static PyMethodDef PLy_exc_methods[]
static PyObject * PLy_quote_ident(PyObject *self, PyObject *args)
static char * object_to_string(PyObject *obj)
static PyObject * PLy_debug(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_quote_nullable(PyObject *self, PyObject *args)
static void PLy_generate_spi_exceptions(PyObject *mod, PyObject *base)
static PyModuleDef PLy_module
static PyObject * PLy_error(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_log(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_warning(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_create_exception(char *name, PyObject *base, PyObject *dict, const char *modname, PyObject *mod)
static PyObject * PLy_quote_literal(PyObject *self, PyObject *args)
struct ExceptionMap ExceptionMap
static PyMethodDef PLy_methods[]
static PyModuleDef PLy_exc_module
static PyObject * PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_info(PyObject *self, PyObject *args, PyObject *kw)
HTAB * PLy_spi_exceptions
static PyObject * PLy_fatal(PyObject *self, PyObject *args, PyObject *kw)
static const ExceptionMap exception_map[]
static void PLy_add_exceptions(PyObject *plpy)
void PLy_result_init_type(void)
PyObject * PLy_spi_prepare(PyObject *self, PyObject *args)
PyObject * PLy_commit(PyObject *self, PyObject *args)
PyObject * PLy_rollback(PyObject *self, PyObject *args)
PyObject * PLy_spi_execute(PyObject *self, PyObject *args)
struct PLyExceptionEntry PLyExceptionEntry
PyObject * PLy_subtransaction_new(PyObject *self, PyObject *unused)
void PLy_subtransaction_init_type(void)
char * PLyUnicode_AsString(PyObject *unicode)
PyObject * PLyUnicode_FromString(const char *s)
#define PG_DIAG_SCHEMA_NAME
#define PG_DIAG_CONSTRAINT_NAME
#define PG_DIAG_DATATYPE_NAME
#define PG_DIAG_TABLE_NAME
#define PG_DIAG_COLUMN_NAME
char * quote_literal_cstr(const char *rawstr)
const char * quote_identifier(const char *ident)