diff --git a/ChangeLog b/ChangeLog index 676cded3..ac6cc66c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-12-15 Daniele Varrazzo + + * psycopg/utils.c: Added psycopg_strdup function. + 2010-12-14 Daniele Varrazzo * psycopg/connection_type.c: No need to put connection fields to zero. diff --git a/psycopg/psycopg.h b/psycopg/psycopg.h index d023e47e..00cb98ad 100644 --- a/psycopg/psycopg.h +++ b/psycopg/psycopg.h @@ -120,6 +120,8 @@ HIDDEN void psyco_set_error(PyObject *exc, PyObject *curs, const char *msg, HIDDEN char *psycopg_escape_string(PyObject *conn, const char *from, Py_ssize_t len, char *to, Py_ssize_t *tolen); +HIDDEN char *psycopg_strdup(const char *from, Py_ssize_t len); + /* Exceptions docstrings */ #define Error_doc \ "Base class for error exceptions." diff --git a/psycopg/utils.c b/psycopg/utils.c index 22464e60..f2a0ab09 100644 --- a/psycopg/utils.c +++ b/psycopg/utils.c @@ -70,3 +70,25 @@ psycopg_escape_string(PyObject *obj, const char *from, Py_ssize_t len, return to; } + +/* Duplicate a string. + * + * Allocate a new buffer on the Python heap containing the new string. + * 'len' is optional: if 0 the length is calculated. + * + * Return NULL and set an exception in case of error. + */ +char * +psycopg_strdup(const char *from, Py_ssize_t len) +{ + char *rv; + + if (!len) { len = strlen(from); } + if (!(rv = PyMem_Malloc(len + 1))) { + PyErr_NoMemory(); + return NULL; + } + strcpy(rv, from); + return rv; +} +