28 PyObject *base, PyObject *dict,
29 const char *modname, PyObject *mod);
33 static PyObject *
PLy_debug(PyObject *
self, PyObject *
args, PyObject *kw);
34 static PyObject *
PLy_log(PyObject *
self, PyObject *
args, PyObject *kw);
35 static PyObject *
PLy_info(PyObject *
self, PyObject *
args, PyObject *kw);
36 static PyObject *
PLy_notice(PyObject *
self, PyObject *
args, PyObject *kw);
37 static PyObject *
PLy_warning(PyObject *
self, PyObject *
args, PyObject *kw);
38 static PyObject *
PLy_error(PyObject *
self, PyObject *
args, PyObject *kw);
39 static PyObject *
PLy_fatal(PyObject *
self, PyObject *
args, PyObject *kw);
56 #include "spiexceptions.h" 105 {NULL, NULL, 0, NULL}
109 {NULL, NULL, 0, NULL}
112 #if PY_MAJOR_VERSION >= 3 113 static PyModuleDef PLy_module = {
114 PyModuleDef_HEAD_INIT,
120 static PyModuleDef PLy_exc_module = {
121 PyModuleDef_HEAD_INIT,
122 .m_name =
"spiexceptions",
136 m = PyModule_Create(&PLy_module);
153 #if PY_MAJOR_VERSION < 3 165 #if PY_MAJOR_VERSION >= 3 166 PyModule_Create(&PLy_module);
178 main_mod = PyImport_AddModule(
"__main__");
179 main_dict = PyModule_GetDict(main_mod);
180 plpy_mod = PyImport_AddModule(
"plpy");
181 if (plpy_mod == NULL)
183 PyDict_SetItemString(main_dict,
"plpy", plpy_mod);
184 if (PyErr_Occurred())
194 #if PY_MAJOR_VERSION < 3 197 excmod = PyModule_Create(&PLy_exc_module);
200 PLy_elog(
ERROR,
"could not create the spiexceptions module");
207 if (PyModule_AddObject(plpy,
"spiexceptions", excmod) < 0)
217 hash_ctl.
keysize =
sizeof(int);
219 PLy_spi_exceptions =
hash_create(
"PL/Python SPI exceptions", 256,
230 const char *modname, PyObject *mod)
234 exc = PyErr_NewException(name, base, dict);
243 PyModule_AddObject(mod, modname, exc);
262 for (i = 0; exception_map[
i].
name != NULL; i++)
268 PyObject *dict = PyDict_New();
273 sqlstate = PyString_FromString(
unpack_sql_state(exception_map[i].sqlstate));
274 if (sqlstate == NULL)
277 PyDict_SetItemString(dict,
"sqlstate", sqlstate);
283 entry =
hash_search(PLy_spi_exceptions, &exception_map[i].sqlstate,
295 static PyObject *
PLy_output(
volatile int level, PyObject *
self,
296 PyObject *
args, PyObject *kw);
347 if (!PyArg_ParseTuple(args,
"s:quote_literal", &str))
351 ret = PyString_FromString(quoted);
364 if (!PyArg_ParseTuple(args,
"z:quote_nullable", &str))
368 return PyString_FromString(
"NULL");
371 ret = PyString_FromString(quoted);
384 if (!PyArg_ParseTuple(args,
"s:quote_ident", &str))
388 ret = PyString_FromString(quoted);
399 PyObject *so = PyObject_Str(obj);
405 str =
pstrdup(PyString_AsString(so));
419 char *
volatile sqlstatestr = NULL;
420 char *
volatile message = NULL;
421 char *
volatile detail = NULL;
422 char *
volatile hint = NULL;
423 char *
volatile column_name = NULL;
424 char *
volatile constraint_name = NULL;
425 char *
volatile datatype_name = NULL;
426 char *
volatile table_name = NULL;
427 char *
volatile schema_name = NULL;
431 PyObject *
volatile so;
434 if (PyTuple_Size(args) == 1)
442 if (!PyArg_UnpackTuple(args,
"plpy.elog", 1, 1, &o))
444 so = PyObject_Str(o);
447 so = PyObject_Str(args);
449 if (so == NULL || ((message = PyString_AsString(so)) == NULL))
460 while (PyDict_Next(kw, &pos, &key, &value))
462 char *keyword = PyString_AsString(key);
464 if (strcmp(keyword,
"message") == 0)
467 if (PyTuple_Size(args) != 0)
469 PLy_exception_set(PyExc_TypeError,
"argument 'message' given by name and position");
477 else if (strcmp(keyword,
"detail") == 0)
479 else if (strcmp(keyword,
"hint") == 0)
481 else if (strcmp(keyword,
"sqlstate") == 0)
483 else if (strcmp(keyword,
"schema_name") == 0)
485 else if (strcmp(keyword,
"table_name") == 0)
487 else if (strcmp(keyword,
"column_name") == 0)
489 else if (strcmp(keyword,
"datatype_name") == 0)
491 else if (strcmp(keyword,
"constraint_name") == 0)
496 "'%s' is an invalid keyword argument for this function",
503 if (sqlstatestr != NULL)
505 if (strlen(sqlstatestr) != 5)
511 if (strspn(sqlstatestr,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)
533 if (schema_name != NULL)
535 if (table_name != NULL)
537 if (column_name != NULL)
539 if (datatype_name != NULL)
541 if (constraint_name != NULL)
545 ((sqlstate != 0) ?
errcode(sqlstate) : 0,
548 (hint != NULL) ?
errhint(
"%s", hint) : 0,
549 (column_name != NULL) ?
551 (constraint_name != NULL) ?
553 (datatype_name != NULL) ?
555 (table_name != NULL) ?
557 (schema_name != NULL) ?
static PyObject * PLy_quote_nullable(PyObject *self, PyObject *args)
MemoryContext scratch_ctx
static PyObject * PLy_rollback(PyObject *self, PyObject *args)
static PyObject * PLy_quote_literal(PyObject *self, PyObject *args)
static PyObject * PLy_warning(PyObject *self, PyObject *args, PyObject *kw)
void PLy_plan_init_type(void)
int errhint(const char *fmt,...)
char * quote_literal_cstr(const char *rawstr)
PyObject * PLy_cursor(PyObject *self, PyObject *args)
#define PG_DIAG_SCHEMA_NAME
const char * quote_identifier(const char *ident)
ErrorData * CopyErrorData(void)
#define PG_DIAG_COLUMN_NAME
#define MAKE_SQLSTATE(ch1, ch2, ch3, ch4, ch5)
char * pstrdup(const char *in)
#define PG_DIAG_TABLE_NAME
char * unpack_sql_state(int sql_state)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
static PyObject * PLy_notice(PyObject *self, PyObject *args, PyObject *kw)
int errcode(int sqlerrcode)
static PyObject * PLy_log(PyObject *self, PyObject *args, PyObject *kw)
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
PLyExecutionContext * PLy_current_execution_context(void)
void PLy_exception_set(PyObject *exc, const char *fmt,...)
static PyObject * PLy_info(PyObject *self, PyObject *args, PyObject *kw)
void FlushErrorState(void)
static void PLy_generate_spi_exceptions(PyObject *mod, PyObject *base)
int errdetail_internal(const char *fmt,...)
static void PLy_add_exceptions(PyObject *plpy)
void pfree(void *pointer)
void FreeErrorData(ErrorData *edata)
void PLy_cursor_init_type(void)
void PLy_subtransaction_init_type(void)
struct ExceptionMap ExceptionMap
void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
static PyObject * PLy_output(volatile int level, PyObject *self, PyObject *args, PyObject *kw)
MemoryContext CurrentMemoryContext
static PyObject * PLy_error(PyObject *self, PyObject *args, PyObject *kw)
static PyObject * PLy_fatal(PyObject *self, PyObject *args, PyObject *kw)
static const ExceptionMap exception_map[]
static PyObject * PLy_create_exception(char *name, PyObject *base, PyObject *dict, const char *modname, PyObject *mod)
static PyObject * PLy_commit(PyObject *self, PyObject *args)
#define PG_DIAG_DATATYPE_NAME
static PyMethodDef PLy_exc_methods[]
#define PG_DIAG_CONSTRAINT_NAME
bool pg_verifymbstr(const char *mbstr, int len, bool noError)
#define ereport(elevel,...)
int errmsg_internal(const char *fmt,...)
#define Assert(condition)
PyObject * PLy_spi_execute(PyObject *self, PyObject *args)
struct PLyExceptionEntry PLyExceptionEntry
HTAB * PLy_spi_exceptions
static PyObject * PLy_quote_ident(PyObject *self, PyObject *args)
void PLy_result_init_type(void)
void(* pg_funcptr_t)(void)
void SPI_start_transaction(void)
int err_generic_string(int field, const char *str)
PyObject * PLy_subtransaction_new(PyObject *self, PyObject *unused)
static PyObject * PLy_debug(PyObject *self, PyObject *args, PyObject *kw)
PyObject * PLy_exc_spi_error
static char * object_to_string(PyObject *obj)
PyObject * PLy_spi_prepare(PyObject *self, PyObject *args)
static PyMethodDef PLy_methods[]