
Go to the source code of this file.
Functions | |
| void * | PLy_malloc (size_t bytes) |
| void * | PLy_malloc0 (size_t bytes) |
| char * | PLy_strdup (const char *str) |
| void | PLy_free (void *ptr) |
| PyObject * | PLyUnicode_Bytes (PyObject *unicode) |
| char * | PLyUnicode_AsString (PyObject *unicode) |
| void PLy_free | ( | void * | ptr | ) |
Definition at line 51 of file plpy_util.c.
References pfree().
Referenced by PLy_abort_open_subtransactions(), PLy_cursor_dealloc(), PLy_input_tuple_funcs(), PLy_output_tuple_funcs(), PLy_plan_dealloc(), PLy_pop_execution_context(), PLy_procedure_delete(), PLy_procedure_get(), PLy_subtransaction_exit(), and PLy_typeinfo_dealloc().
{
pfree(ptr);
}
| void* PLy_malloc | ( | size_t | bytes | ) |
Definition at line 21 of file plpy_util.c.
References MemoryContextAlloc(), and TopMemoryContext.
Referenced by PLy_malloc0(), PLy_procedure_create(), PLy_push_execution_context(), PLy_spi_prepare(), PLy_strdup(), and PLy_subtransaction_enter().
{
/* We need our allocations to be long-lived, so use TopMemoryContext */
return MemoryContextAlloc(TopMemoryContext, bytes);
}
| void* PLy_malloc0 | ( | size_t | bytes | ) |
Definition at line 28 of file plpy_util.c.
References MemSet, and PLy_malloc().
Referenced by PLy_input_datum_func2(), PLy_input_tuple_funcs(), PLy_output_datum_func2(), PLy_output_tuple_funcs(), and PLy_procedure_create().
{
void *ptr = PLy_malloc(bytes);
MemSet(ptr, 0, bytes);
return ptr;
}
| char* PLy_strdup | ( | const char * | str | ) |
Definition at line 37 of file plpy_util.c.
References PLy_malloc().
Referenced by plpython_inline_handler(), PLy_cursor_plan(), PLy_cursor_query(), PLy_procedure_compile(), and PLy_procedure_create().
{
char *result;
size_t len;
len = strlen(str) + 1;
result = PLy_malloc(len);
memcpy(result, str, len);
return result;
}
| char* PLyUnicode_AsString | ( | PyObject * | unicode | ) |
Definition at line 129 of file plpy_util.c.
References PLyUnicode_Bytes(), pstrdup(), and PyBytes_AsString.
Referenced by PLy_exec_trigger(), PLy_modify_tuple(), and PLy_spi_prepare().
{
PyObject *o = PLyUnicode_Bytes(unicode);
char *rv = pstrdup(PyBytes_AsString(o));
Py_XDECREF(o);
return rv;
}
| PyObject* PLyUnicode_Bytes | ( | PyObject * | unicode | ) |
Definition at line 62 of file plpy_util.c.
References ERROR, GetDatabaseEncoding(), NULL, pfree(), PG_CATCH, pg_do_encoding_conversion(), PG_END_TRY, PG_RE_THROW, PG_TRY, PG_UTF8, PLy_elog(), PyBytes_AsString, and PyBytes_FromStringAndSize.
Referenced by PLyObject_ToDatum(), and PLyUnicode_AsString().
{
PyObject *bytes, *rv;
char *utf8string, *encoded;
/* First encode the Python unicode object with UTF-8. */
bytes = PyUnicode_AsUTF8String(unicode);
if (bytes == NULL)
PLy_elog(ERROR, "could not convert Python Unicode object to bytes");
utf8string = PyBytes_AsString(bytes);
if (utf8string == NULL) {
Py_DECREF(bytes);
PLy_elog(ERROR, "could not extract bytes from encoded string");
}
/*
* Then convert to server encoding if necessary.
*
* PyUnicode_AsEncodedString could be used to encode the object directly
* in the server encoding, but Python doesn't support all the encodings
* that PostgreSQL does (EUC_TW and MULE_INTERNAL). UTF-8 is used as an
* intermediary in PLyUnicode_FromString as well.
*/
if (GetDatabaseEncoding() != PG_UTF8)
{
PG_TRY();
{
encoded = (char *) pg_do_encoding_conversion(
(unsigned char *) utf8string,
strlen(utf8string),
PG_UTF8,
GetDatabaseEncoding());
}
PG_CATCH();
{
Py_DECREF(bytes);
PG_RE_THROW();
}
PG_END_TRY();
}
else
encoded = utf8string;
/* finally, build a bytes object in the server encoding */
rv = PyBytes_FromStringAndSize(encoded, strlen(encoded));
/* if pg_do_encoding_conversion allocated memory, free it now */
if (utf8string != encoded)
pfree(encoded);
Py_DECREF(bytes);
return rv;
}
1.7.1