21 char *
volatile *xmsg,
char *
volatile *tbmsg,
24 char **hint,
char **query,
int *position,
25 char **schema_name,
char **table_name,
char **column_name,
26 char **datatype_name,
char **constraint_name);
28 char **hint,
char **schema_name,
char **table_name,
char **column_name,
29 char **datatype_name,
char **constraint_name);
46 int save_errno = errno;
47 char *
volatile xmsg = NULL;
48 char *
volatile tbmsg = NULL;
59 PyErr_Fetch(&exc, &
val, &tb);
64 const char *primary = NULL;
70 char *schema_name = NULL;
71 char *table_name = NULL;
72 char *column_name = NULL;
73 char *datatype_name = NULL;
74 char *constraint_name = NULL;
78 PyErr_NormalizeException(&exc, &
val, &tb);
82 &detail, &hint, &query, &position,
83 &schema_name, &table_name, &column_name,
84 &datatype_name, &constraint_name);
87 &schema_name, &table_name, &column_name,
88 &datatype_name, &constraint_name);
94 &xmsg, &tbmsg, &tb_depth);
124 (
errcode(sqlerrcode ? sqlerrcode : ERRCODE_EXTERNAL_ROUTINE_EXCEPTION),
127 (tb_depth > 0 && tbmsg) ?
errcontext(
"%s", tbmsg) : 0,
128 (hint) ?
errhint(
"%s", hint) : 0,
140 constraint_name) : 0));
167 char *
volatile *xmsg,
char *
volatile *tbmsg,
int *tb_depth)
169 PyObject *
volatile e_type_o = NULL;
170 PyObject *
volatile e_module_o = NULL;
171 PyObject *
volatile vob = NULL;
191 char *e_type_s = NULL;
192 char *e_module_s = NULL;
196 e_type_o = PyObject_GetAttrString(
e,
"__name__");
197 e_module_o = PyObject_GetAttrString(
e,
"__module__");
203 if (v && ((vob = PyObject_Str(v)) != NULL))
209 if (!e_type_s || !e_module_s)
215 else if (strcmp(e_module_s,
"builtins") == 0
216 || strcmp(e_module_s,
"__main__") == 0
217 || strcmp(e_module_s,
"exceptions") == 0)
227 Py_XDECREF(e_type_o);
228 Py_XDECREF(e_module_o);
240 while (tb != NULL && tb != Py_None)
242 PyObject *
volatile frame = NULL;
243 PyObject *
volatile code = NULL;
244 PyObject *
volatile name = NULL;
245 PyObject *
volatile lineno = NULL;
250 lineno = PyObject_GetAttrString(tb,
"tb_lineno");
252 elog(
ERROR,
"could not get line number from Python traceback");
254 frame = PyObject_GetAttrString(tb,
"tb_frame");
256 elog(
ERROR,
"could not get frame from Python traceback");
258 code = PyObject_GetAttrString(frame,
"f_code");
260 elog(
ERROR,
"could not get code object from Python frame");
262 name = PyObject_GetAttrString(code,
"co_name");
264 elog(
ERROR,
"could not get function name from Python code object");
266 filename = PyObject_GetAttrString(code,
"co_filename");
268 elog(
ERROR,
"could not get file name from Python code object");
277 char *plain_filename;
291 plain_lineno = PyLong_AsLong(lineno);
294 appendStringInfo(&tbstr,
"\n PL/Python anonymous code block, line %ld, in %s",
295 plain_lineno - 1, fname);
298 proname, plain_lineno - 1, fname);
304 if (exec_ctx->
curr_proc && plain_filename != NULL &&
305 strcmp(plain_filename,
"<string>") == 0)
336 tb = PyObject_GetAttrString(tb,
"tb_next");
338 elog(
ERROR,
"could not traverse Python traceback");
366 sqlstate = PyObject_GetAttrString(exc,
"sqlstate");
367 if (sqlstate == NULL)
371 if (strlen(buffer) == 5 &&
372 strspn(buffer,
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 5)
375 buffer[3], buffer[4]);
390 char **hint,
char **query,
int *position,
391 char **schema_name,
char **table_name,
393 char **datatype_name,
char **constraint_name)
397 spidata = PyObject_GetAttrString(exc,
"spidata");
401 PyArg_ParseTuple(spidata,
"izzzizzzzz",
402 sqlerrcode, detail, hint, query, position,
403 schema_name, table_name, column_name,
404 datatype_name, constraint_name);
431 char **schema_name,
char **table_name,
char **column_name,
432 char **datatype_name,
char **constraint_name)
450 const char *s = NULL;
451 const char *
next = src;
458 while (current < lineno)
461 next = strchr(s + 1,
'\n');
467 if (current != lineno)
470 while (*s && isspace((
unsigned char) *s))
499 PyErr_SetString(exc,
buf);
505 const char *fmt_singular,
const char *fmt_plural,
517 PyErr_SetString(exc,
buf);
524 PyObject *
args = NULL;
525 PyObject *
error = NULL;
532 error = PyObject_CallObject(excclass,
args);
564 PyErr_SetObject(excclass,
error);
575 elog(
ERROR,
"could not convert error to Python exception");
584 val = PyObject_GetAttrString(obj, attrname);
585 if (
val != NULL &&
val != Py_None)
613 result = PyObject_SetAttrString(obj, attrname,
val);
#define dngettext(d, s, p, n)
int err_generic_string(int field, const char *str)
int internalerrquery(const char *query)
int internalerrposition(int cursorpos)
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
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,...)
char * pstrdup(const char *in)
void pfree(void *pointer)
char * pnstrdup(const char *in, Size len)
static void get_string_attr(PyObject *obj, char *attrname, char **str)
static bool set_string_attr(PyObject *obj, char *attrname, char *str)
static void PLy_get_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **schema_name, char **table_name, char **column_name, char **datatype_name, char **constraint_name)
void PLy_elog_impl(int elevel, const char *fmt,...)
PyObject * PLy_exc_spi_error
void PLy_exception_set_with_details(PyObject *excclass, ErrorData *edata)
static void PLy_get_spi_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **query, int *position, char **schema_name, char **table_name, char **column_name, char **datatype_name, char **constraint_name)
void PLy_exception_set(PyObject *exc, const char *fmt,...)
static char * get_source_line(const char *src, int lineno)
static void PLy_get_sqlerrcode(PyObject *exc, int *sqlerrcode)
void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, unsigned long n,...)
static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, char *volatile *xmsg, char *volatile *tbmsg, int *tb_depth)
PLyExecutionContext * PLy_current_execution_context(void)
char * PLy_procedure_name(PLyProcedure *proc)
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
int appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
void appendStringInfo(StringInfo str, const char *fmt,...)
void enlargeStringInfo(StringInfo str, int needed)
void appendStringInfoString(StringInfo str, const char *s)
void initStringInfo(StringInfo str)