Author: cito
Date: Sat Nov 21 19:53:02 2015
New Revision: 583

Log:
Make inserttable() run on Python 3

Modified:
   trunk/module/pgmodule.c

Modified: trunk/module/pgmodule.c
==============================================================================
--- trunk/module/pgmodule.c     Sat Nov 21 18:51:18 2015        (r582)
+++ trunk/module/pgmodule.c     Sat Nov 21 19:53:02 2015        (r583)
@@ -1413,6 +1413,7 @@
        char            *table,
                                *buffer,
                                *bufpt;
+       char            *enc=NULL;
        size_t          bufsiz;
        PyObject        *list,
                                *sublist,
@@ -1542,9 +1543,9 @@
                                else
                                        bufsiz = 0;
                        }
-                       else if (PyStr_Check(item))
+                       else if (PyBytes_Check(item))
                        {
-                               const char* t = PyBytes_AS_STRING(item);
+                               const char* t = PyBytes_AsString(item);
                                while (*t && bufsiz)
                                {
                                        if (*t == '\\' || *t == '\t' || *t == 
'\n')
@@ -1555,10 +1556,36 @@
                                        *bufpt++ = *t++; --bufsiz;
                                }
                        }
+                       else if (PyUnicode_Check(item))
+                       {
+                               PyObject *s;
+                               if (!enc)
+                                       enc = (char *)pg_encoding_to_char(
+                                               PQclientEncoding(self->cnx));
+                               if (!strcmp(enc, "UTF8"))
+                                       s = PyUnicode_AsUTF8String(item);
+                               else if (!strcmp(enc, "LATIN1"))
+                                       s = PyUnicode_AsLatin1String(item);
+                               else if (!strcmp(enc, "SQL_ASCII"))
+                                       s = PyUnicode_AsASCIIString(item);
+                               else
+                                       s = PyUnicode_AsEncodedString(item, 
enc, "strict");
+                               const char* t = PyBytes_AsString(s);
+                               while (*t && bufsiz)
+                               {
+                                       if (*t == '\\' || *t == '\t' || *t == 
'\n')
+                                       {
+                                               *bufpt++ = '\\'; --bufsiz;
+                                               if (!bufsiz) break;
+                                       }
+                                       *bufpt++ = *t++; --bufsiz;
+                               }
+                               Py_DECREF(s);
+                       }
                        else if (PyInt_Check(item) || PyLong_Check(item))
                        {
                                PyObject* s = PyObject_Str(item);
-                               const char* t = PyBytes_AsString(s);
+                               const char* t = PyStr_AsString(s);
                                while (*t && bufsiz)
                                {
                                        *bufpt++ = *t++; --bufsiz;
@@ -1568,7 +1595,7 @@
                        else
                        {
                                PyObject* s = PyObject_Repr(item);
-                               const char* t = PyBytes_AsString(s);
+                               const char* t = PyStr_AsString(s);
                                while (*t && bufsiz)
                                {
                                        if (*t == '\\' || *t == '\t' || *t == 
'\n')
_______________________________________________
PyGreSQL mailing list
[email protected]
https://mail.vex.net/mailman/listinfo.cgi/pygresql

Reply via email to