diff --git a/psycopg/adapter_datetime.c b/psycopg/adapter_datetime.c index 19fd97e2..2b9f69fd 100644 --- a/psycopg/adapter_datetime.c +++ b/psycopg/adapter_datetime.c @@ -62,30 +62,37 @@ pydatetime_str(pydatetimeObject *self) if (self->type <= PSYCO_DATETIME_TIMESTAMP) { PyObject *tz; - /* Select the right PG type to cast into. - * fmt contains %s in Py2 and %U in Py3, - * So it can be used with the Text_FromFormatS macro */ + /* Select the right PG type to cast into. */ char *fmt = NULL; switch (self->type) { case PSYCO_DATETIME_TIME: - fmt = "'" Text_S "'::time"; + fmt = "'%s'::time"; break; case PSYCO_DATETIME_DATE: - fmt = "'" Text_S "'::date"; + fmt = "'%s'::date"; break; case PSYCO_DATETIME_TIMESTAMP: tz = PyObject_GetAttrString(self->wrapped, "tzinfo"); if (!tz) { return NULL; } - fmt = (tz == Py_None) - ? "'" Text_S "'::timestamp" - : "'" Text_S "'::timestamptz"; + fmt = (tz == Py_None) ? "'%s'::timestamp" : "'%s'::timestamptz"; Py_DECREF(tz); break; } iso = PyObject_CallMethod(self->wrapped, "isoformat", NULL); if (iso) { - res = Text_FromFormatS(fmt, iso); +#if PY_MAJOR_VERSION > 2 + { + PyObject *biso; + if (!(biso = PyUnicode_AsEncodedString(iso, "ascii", NULL))) { + Py_DECREF(iso); + return NULL; + } + Py_DECREF(iso); + iso = biso; + } +#endif + res = Bytes_FromFormat(fmt, Bytes_AsString(iso)); Py_DECREF(iso); } return res; @@ -103,8 +110,8 @@ pydatetime_str(pydatetimeObject *self) } buffer[6] = '\0'; - return PyString_FromFormat("'%d days %d.%s seconds'::interval", - obj->days, obj->seconds, buffer); + return Bytes_FromFormat("'%d days %d.%s seconds'::interval", + obj->days, obj->seconds, buffer); } } diff --git a/psycopg/python.h b/psycopg/python.h index 40895bbf..452c7341 100644 --- a/psycopg/python.h +++ b/psycopg/python.h @@ -81,18 +81,12 @@ #define Text_Format(f,a) PyString_Format(f,a) #define Text_FromUTF8(s) PyString_FromString(s) #define Text_FromUTF8AndSize(s,n) PyString_FromStringAndSize(s,n) -/* f must contain exactly a %s placeholder */ -#define Text_FromFormatS(f,s) PyString_FromFormat(f, PyString_AsString(s)) -#define Text_S "%s" #else #define Text_Type PyUnicode_Type #define Text_Check(s) PyUnicode_Check(s) #define Text_Format(f,a) PyUnicode_Format(f,a) #define Text_FromUTF8(s) PyUnicode_FromString(s) #define Text_FromUTF8AndSize(s,n) PyUnicode_FromStringAndSize(s,n) -/* f must contain exactly a %U placeholder */ -#define Text_FromFormatS(f,s) PyUnicode_FromFormat(f, s) -#define Text_S "%U" #endif #if PY_MAJOR_VERSION > 2