2011-12-18 20:14:16 +01:00
|
|
|
/*-------------------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* plpython.h - Python as a procedural language for PostgreSQL
|
|
|
|
*
|
2019-01-02 18:44:25 +01:00
|
|
|
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
2011-12-18 20:14:16 +01:00
|
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
|
|
*
|
|
|
|
* src/pl/plpython/plpython.h
|
|
|
|
*
|
|
|
|
*-------------------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
#ifndef PLPYTHON_H
|
|
|
|
#define PLPYTHON_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Include order should be: postgres.h, other postgres headers, plpython.h,
|
2019-05-31 17:45:33 +02:00
|
|
|
* other plpython headers. (In practice, other plpython headers will also
|
|
|
|
* include this file, so that they can compile standalone.)
|
2011-12-18 20:14:16 +01:00
|
|
|
*/
|
|
|
|
#ifndef POSTGRES_H
|
|
|
|
#error postgres.h must be included before plpython.h
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Undefine some things that get (re)defined in the Python headers. They aren't
|
|
|
|
* used by the PL/Python code, and all PostgreSQL headers should be included
|
|
|
|
* earlier, so this should be pretty safe.
|
|
|
|
*/
|
|
|
|
#undef _POSIX_C_SOURCE
|
|
|
|
#undef _XOPEN_SOURCE
|
|
|
|
#undef HAVE_TZNAME
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Sometimes python carefully scribbles on our *printf macros.
|
|
|
|
* So we undefine them here and redefine them after it's done its dirty deed.
|
|
|
|
*/
|
|
|
|
#undef vsnprintf
|
2018-10-09 01:15:55 +02:00
|
|
|
#undef snprintf
|
|
|
|
#undef vsprintf
|
|
|
|
#undef sprintf
|
|
|
|
#undef vfprintf
|
|
|
|
#undef fprintf
|
|
|
|
#undef vprintf
|
|
|
|
#undef printf
|
2011-12-18 20:14:16 +01:00
|
|
|
|
|
|
|
#if defined(_MSC_VER) && defined(_DEBUG)
|
|
|
|
/* Python uses #pragma to bring in a non-default libpython on VC++ if
|
|
|
|
* _DEBUG is defined */
|
|
|
|
#undef _DEBUG
|
|
|
|
/* Also hide away errcode, since we load Python.h before postgres.h */
|
|
|
|
#define errcode __msvc_errcode
|
|
|
|
#include <Python.h>
|
|
|
|
#undef errcode
|
|
|
|
#define _DEBUG
|
|
|
|
#elif defined (_MSC_VER)
|
|
|
|
#define errcode __msvc_errcode
|
|
|
|
#include <Python.h>
|
|
|
|
#undef errcode
|
|
|
|
#else
|
|
|
|
#include <Python.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Py_ssize_t compat for Python <= 2.4
|
|
|
|
*/
|
|
|
|
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
|
|
|
|
typedef int Py_ssize_t;
|
|
|
|
|
|
|
|
#define PY_SSIZE_T_MAX INT_MAX
|
|
|
|
#define PY_SSIZE_T_MIN INT_MIN
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Python 2/3 strings/unicode/bytes handling. Python 2 has strings
|
|
|
|
* and unicode, Python 3 has strings, which are unicode on the C
|
|
|
|
* level, and bytes. The porting convention, which is similarly used
|
|
|
|
* in Python 2.6, is that "Unicode" is always unicode, and "Bytes" are
|
|
|
|
* bytes in Python 3 and strings in Python 2. Since we keep
|
|
|
|
* supporting Python 2 and its usual strings, we provide a
|
|
|
|
* compatibility layer for Python 3 that when asked to convert a C
|
|
|
|
* string to a Python string it converts the C string from the
|
|
|
|
* PostgreSQL server encoding to a Python Unicode object.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#if PY_VERSION_HEX < 0x02060000
|
|
|
|
/* This is exactly the compatibility layer that Python 2.6 uses. */
|
|
|
|
#define PyBytes_AsString PyString_AsString
|
|
|
|
#define PyBytes_FromStringAndSize PyString_FromStringAndSize
|
|
|
|
#define PyBytes_Size PyString_Size
|
|
|
|
#define PyObject_Bytes PyObject_Str
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
|
|
#define PyString_Check(x) 0
|
|
|
|
#define PyString_AsString(x) PLyUnicode_AsString(x)
|
|
|
|
#define PyString_FromString(x) PLyUnicode_FromString(x)
|
2015-04-26 16:33:14 +02:00
|
|
|
#define PyString_FromStringAndSize(x, size) PLyUnicode_FromStringAndSize(x, size)
|
2011-12-18 20:14:16 +01:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Python 3 only has long.
|
|
|
|
*/
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
|
|
#define PyInt_FromLong(x) PyLong_FromLong(x)
|
|
|
|
#define PyInt_AsLong(x) PyLong_AsLong(x)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PyVarObject_HEAD_INIT was added in Python 2.6. Its use is
|
|
|
|
* necessary to handle both Python 2 and 3. This replacement
|
|
|
|
* definition is for Python <=2.5
|
|
|
|
*/
|
|
|
|
#ifndef PyVarObject_HEAD_INIT
|
|
|
|
#define PyVarObject_HEAD_INIT(type, size) \
|
|
|
|
PyObject_HEAD_INIT(type) size,
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Python 3 removed the Py_TPFLAGS_HAVE_ITER flag */
|
|
|
|
#if PY_MAJOR_VERSION >= 3
|
|
|
|
#define Py_TPFLAGS_HAVE_ITER 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* define our text domain for translations */
|
|
|
|
#undef TEXTDOMAIN
|
|
|
|
#define TEXTDOMAIN PG_TEXTDOMAIN("plpython")
|
|
|
|
|
|
|
|
#include <compile.h>
|
|
|
|
#include <eval.h>
|
|
|
|
|
2018-10-09 01:15:55 +02:00
|
|
|
/* put back our *printf macros ... this must match src/include/port.h */
|
|
|
|
#ifdef vsnprintf
|
|
|
|
#undef vsnprintf
|
|
|
|
#endif
|
2011-12-18 20:14:16 +01:00
|
|
|
#ifdef snprintf
|
|
|
|
#undef snprintf
|
|
|
|
#endif
|
2018-10-09 01:15:55 +02:00
|
|
|
#ifdef vsprintf
|
|
|
|
#undef vsprintf
|
2011-12-18 20:14:16 +01:00
|
|
|
#endif
|
2018-10-09 01:15:55 +02:00
|
|
|
#ifdef sprintf
|
|
|
|
#undef sprintf
|
|
|
|
#endif
|
|
|
|
#ifdef vfprintf
|
|
|
|
#undef vfprintf
|
|
|
|
#endif
|
|
|
|
#ifdef fprintf
|
|
|
|
#undef fprintf
|
|
|
|
#endif
|
|
|
|
#ifdef vprintf
|
|
|
|
#undef vprintf
|
|
|
|
#endif
|
|
|
|
#ifdef printf
|
|
|
|
#undef printf
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define vsnprintf pg_vsnprintf
|
|
|
|
#define snprintf pg_snprintf
|
|
|
|
#define vsprintf pg_vsprintf
|
|
|
|
#define sprintf pg_sprintf
|
|
|
|
#define vfprintf pg_vfprintf
|
|
|
|
#define fprintf pg_fprintf
|
|
|
|
#define vprintf pg_vprintf
|
|
|
|
#define printf(...) pg_printf(__VA_ARGS__)
|
2011-12-18 20:14:16 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Used throughout, and also by the Python 2/3 porting layer, so it's easier to
|
|
|
|
* just include it everywhere.
|
|
|
|
*/
|
|
|
|
#include "plpy_util.h"
|
|
|
|
|
Phase 2 of pgindent updates.
Change pg_bsd_indent to follow upstream rules for placement of comments
to the right of code, and remove pgindent hack that caused comments
following #endif to not obey the general rule.
Commit e3860ffa4dd0dad0dd9eea4be9cc1412373a8c89 wasn't actually using
the published version of pg_bsd_indent, but a hacked-up version that
tried to minimize the amount of movement of comments to the right of
code. The situation of interest is where such a comment has to be
moved to the right of its default placement at column 33 because there's
code there. BSD indent has always moved right in units of tab stops
in such cases --- but in the previous incarnation, indent was working
in 8-space tab stops, while now it knows we use 4-space tabs. So the
net result is that in about half the cases, such comments are placed
one tab stop left of before. This is better all around: it leaves
more room on the line for comment text, and it means that in such
cases the comment uniformly starts at the next 4-space tab stop after
the code, rather than sometimes one and sometimes two tabs after.
Also, ensure that comments following #endif are indented the same
as comments following other preprocessor commands such as #else.
That inconsistency turns out to have been self-inflicted damage
from a poorly-thought-through post-indent "fixup" in pgindent.
This patch is much less interesting than the first round of indent
changes, but also bulkier, so I thought it best to separate the effects.
Discussion: https://postgr.es/m/E1dAmxK-0006EE-1r@gemulon.postgresql.org
Discussion: https://postgr.es/m/30527.1495162840@sss.pgh.pa.us
2017-06-21 21:18:54 +02:00
|
|
|
#endif /* PLPYTHON_H */
|