4 * src/pl/plpython/plpy_util.c
9 #include "mb/pg_wchar.h"
10 #include "plpy_elog.h"
11 #include "plpy_util.h"
15 * Convert a Python unicode object to a Python string/bytes object in
16 * PostgreSQL server encoding. Reference ownership is passed to the
20 PLyUnicode_Bytes(PyObject
*unicode
)
27 /* First encode the Python unicode object with UTF-8. */
28 bytes
= PyUnicode_AsUTF8String(unicode
);
30 PLy_elog(ERROR
, "could not convert Python Unicode object to bytes");
32 utf8string
= PyBytes_AsString(bytes
);
33 if (utf8string
== NULL
)
36 PLy_elog(ERROR
, "could not extract bytes from encoded string");
40 * Then convert to server encoding if necessary.
42 * PyUnicode_AsEncodedString could be used to encode the object directly
43 * in the server encoding, but Python doesn't support all the encodings
44 * that PostgreSQL does (EUC_TW and MULE_INTERNAL). UTF-8 is used as an
45 * intermediary in PLyUnicode_FromString as well.
47 if (GetDatabaseEncoding() != PG_UTF8
)
51 encoded
= pg_any_to_server(utf8string
,
65 /* finally, build a bytes object in the server encoding */
66 rv
= PyBytes_FromStringAndSize(encoded
, strlen(encoded
));
68 /* if pg_any_to_server allocated memory, free it now */
69 if (utf8string
!= encoded
)
77 * Convert a Python unicode object to a C string in PostgreSQL server
78 * encoding. No Python object reference is passed out of this
79 * function. The result is palloc'ed.
82 PLyUnicode_AsString(PyObject
*unicode
)
84 PyObject
*o
= PLyUnicode_Bytes(unicode
);
85 char *rv
= pstrdup(PyBytes_AsString(o
));
92 * Convert a C string in the PostgreSQL server encoding to a Python
93 * unicode object. Reference ownership is passed to the caller.
96 PLyUnicode_FromStringAndSize(const char *s
, Py_ssize_t size
)
101 utf8string
= pg_server_to_any(s
, size
, PG_UTF8
);
105 o
= PyUnicode_FromStringAndSize(s
, size
);
109 o
= PyUnicode_FromString(utf8string
);
117 PLyUnicode_FromString(const char *s
)
119 return PLyUnicode_FromStringAndSize(s
, strlen(s
));