Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007 #include "postgres.h"
00008
00009 #include "mb/pg_wchar.h"
00010 #include "utils/memutils.h"
00011 #include "utils/palloc.h"
00012
00013 #include "plpython.h"
00014
00015 #include "plpy_util.h"
00016
00017 #include "plpy_elog.h"
00018
00019
00020 void *
00021 PLy_malloc(size_t bytes)
00022 {
00023
00024 return MemoryContextAlloc(TopMemoryContext, bytes);
00025 }
00026
00027 void *
00028 PLy_malloc0(size_t bytes)
00029 {
00030 void *ptr = PLy_malloc(bytes);
00031
00032 MemSet(ptr, 0, bytes);
00033 return ptr;
00034 }
00035
00036 char *
00037 PLy_strdup(const char *str)
00038 {
00039 char *result;
00040 size_t len;
00041
00042 len = strlen(str) + 1;
00043 result = PLy_malloc(len);
00044 memcpy(result, str, len);
00045
00046 return result;
00047 }
00048
00049
00050 void
00051 PLy_free(void *ptr)
00052 {
00053 pfree(ptr);
00054 }
00055
00056
00057
00058
00059
00060
00061 PyObject *
00062 PLyUnicode_Bytes(PyObject *unicode)
00063 {
00064 PyObject *bytes, *rv;
00065 char *utf8string, *encoded;
00066
00067
00068 bytes = PyUnicode_AsUTF8String(unicode);
00069 if (bytes == NULL)
00070 PLy_elog(ERROR, "could not convert Python Unicode object to bytes");
00071
00072 utf8string = PyBytes_AsString(bytes);
00073 if (utf8string == NULL) {
00074 Py_DECREF(bytes);
00075 PLy_elog(ERROR, "could not extract bytes from encoded string");
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 if (GetDatabaseEncoding() != PG_UTF8)
00087 {
00088 PG_TRY();
00089 {
00090 encoded = (char *) pg_do_encoding_conversion(
00091 (unsigned char *) utf8string,
00092 strlen(utf8string),
00093 PG_UTF8,
00094 GetDatabaseEncoding());
00095 }
00096 PG_CATCH();
00097 {
00098 Py_DECREF(bytes);
00099 PG_RE_THROW();
00100 }
00101 PG_END_TRY();
00102 }
00103 else
00104 encoded = utf8string;
00105
00106
00107 rv = PyBytes_FromStringAndSize(encoded, strlen(encoded));
00108
00109
00110 if (utf8string != encoded)
00111 pfree(encoded);
00112
00113 Py_DECREF(bytes);
00114 return rv;
00115 }
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128 char *
00129 PLyUnicode_AsString(PyObject *unicode)
00130 {
00131 PyObject *o = PLyUnicode_Bytes(unicode);
00132 char *rv = pstrdup(PyBytes_AsString(o));
00133
00134 Py_XDECREF(o);
00135 return rv;
00136 }
00137
00138 #if PY_MAJOR_VERSION >= 3
00139
00140
00141
00142
00143 PyObject *
00144 PLyUnicode_FromString(const char *s)
00145 {
00146 char *utf8string;
00147 PyObject *o;
00148
00149 utf8string = (char *) pg_do_encoding_conversion((unsigned char *) s,
00150 strlen(s),
00151 GetDatabaseEncoding(),
00152 PG_UTF8);
00153
00154 o = PyUnicode_FromString(utf8string);
00155
00156 if (utf8string != s)
00157 pfree(utf8string);
00158
00159 return o;
00160 }
00161
00162 #endif