Changeset 534


Ignore:
Timestamp:
Nov 16, 2015, 11:46:57 PM (4 years ago)
Author:
darcy
Message:

Closer to Python 3. This compiles under both Python 2 and 3 but unit
tests dump core under 3.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module/pgmodule.c

    r531 r534  
    3030/* Note: This should be linked against the same C runtime lib as Python */
    3131#include <Python.h>
     32
    3233#if PY_MAJOR_VERSION >= 3
    3334#define IS_PY3K
     
    302303        PyObject *str;
    303304
    304         if (!(str = PyBytes_FromString(msg)))
     305        if (!(str = PyUnicode_FromString(msg)))
    305306                err = NULL;
    306307        else
     
    314315                {
    315316                        char *sqlstate = PQresultErrorField(result, PG_DIAG_SQLSTATE);
    316                         str = sqlstate ? PyBytes_FromStringAndSize(sqlstate, 5) : NULL;
     317                        str = sqlstate ? PyUnicode_FromStringAndSize(sqlstate, 5) : NULL;
    317318                }
    318319                else
     
    489490                                sprintf(p, "(%d row%s)", m, m == 1 ? "" : "s");
    490491                                /* return the result */
    491                                 result = PyBytes_FromString(buffer);
     492                                result = PyUnicode_FromString(buffer);
    492493                                free(buffer);
    493494                                return result;
     
    510511        }
    511512        else
    512                 return PyBytes_FromString("(nothing selected)");
     513                return PyUnicode_FromString("(nothing selected)");
    513514}
    514515
     
    927928/* get attribute */
    928929static PyObject *
    929 largeGetAttr(largeObject *self, char *name)
    930 {
     930largeGetAttr(largeObject *self, PyObject *nameobj)
     931{
     932        const char *name = PyBytes_AsString(nameobj);
     933
    931934        /* list postgreSQL large object fields */
    932935
     
    956959        /* error (status) message */
    957960        if (!strcmp(name, "error"))
    958                 return PyBytes_FromString(PQerrorMessage(self->pgcnx->cnx));
     961                return PyUnicode_FromString(PQerrorMessage(self->pgcnx->cnx));
    959962
    960963        /* attributes list */
     
    965968                if (list)
    966969                {
    967                         PyList_SET_ITEM(list, 0, PyBytes_FromString("oid"));
    968                         PyList_SET_ITEM(list, 1, PyBytes_FromString("pgcnx"));
    969                         PyList_SET_ITEM(list, 2, PyBytes_FromString("error"));
     970                        PyList_SET_ITEM(list, 0, PyUnicode_FromString("oid"));
     971                        PyList_SET_ITEM(list, 1, PyUnicode_FromString("pgcnx"));
     972                        PyList_SET_ITEM(list, 2, PyUnicode_FromString("error"));
    970973                }
    971974
     
    975978        /* module name */
    976979        if (!strcmp(name, "__module__"))
    977                 return PyBytes_FromString(MODULE_NAME);
     980                return PyUnicode_FromString(MODULE_NAME);
    978981
    979982        /* class name */
    980983        if (!strcmp(name, "__class__"))
    981                 return PyBytes_FromString("pglarge");
     984                return PyUnicode_FromString("pglarge");
    982985
    983986        /* seeks name in methods (fallback) */
    984         return Py_FindMethod(largeMethods, (PyObject *) self, name);
     987        return PyObject_GenericGetAttr((PyObject *) self, nameobj);
    985988}
    986989
     
    10031006static PyTypeObject largeType = {
    10041007        PyVarObject_HEAD_INIT(NULL, 0)
    1005         "PGlargeObject",                                /* tp_name */
     1008        "pglarge",                                              /* tp_name */
    10061009        sizeof(largeObject),                    /* tp_basicsize */
    10071010        0,                                                              /* tp_itemsize */
     
    10101013        (destructor) largeDealloc,              /* tp_dealloc */
    10111014        (printfunc) largePrint,                 /* tp_print */
    1012         (getattrfunc) largeGetAttr,             /* tp_getattr */
     1015        0,                                                              /* tp_getattr */
    10131016        0,                                                              /* tp_setattr */
    10141017        0,                                                              /* tp_compare */
     
    10201023        0,                              /* tp_call */
    10211024        0,                                                              /* tp_str */
    1022         0,                                                              /* tp_getattro */
     1025        (getattrofunc) largeGetAttr,    /* tp_getattro */
    10231026        0,                              /* tp_setattro */
    10241027        0,                              /* tp_as_buffer */
     
    12691272                                                if (ret[0])             /* return number of rows affected */
    12701273                                                {
    1271                                                         return PyBytes_FromString(ret);
     1274                                                        return PyUnicode_FromString(ret);
    12721275                                                }
    12731276                                                Py_INCREF(Py_None);
     
    13651368        {
    13661369                case 0:
    1367                         str = PyBytes_FromString(line);
     1370                        str = PyUnicode_FromString(line);
    13681371                        break;
    13691372                case 1:
     
    14151418queryRepr(queryObject *self)
    14161419{
    1417         return PyBytes_FromString("<pg query result>");
     1420        return PyUnicode_FromString("<pg query result>");
    14181421}
    14191422
     
    15651568                                        bufsiz = 0;
    15661569                        }
    1567                         else if (PyBytes_Check(item))
     1570                        else if (PyUnicode_Check(item))
    15681571                        {
    15691572                                const char* t = PyBytes_AS_STRING(item);
     
    16981701
    16991702        if (name)
    1700                 return PyBytes_FromString(name);
     1703                return PyUnicode_FromString(name);
    17011704
    17021705        /* unknown parameter, return None */
     
    21072110                                   *temp;
    21082111
    2109                 if (!(temp = PyBytes_FromString(notify->relname)))
     2112                if (!(temp = PyUnicode_FromString(notify->relname)))
    21102113                        return NULL;
    21112114
     
    21242127
    21252128                /* extra exists even in old versions that did not support it */
    2126                 if (!(temp = PyBytes_FromString(notify->extra)))
     2129                if (!(temp = PyUnicode_FromString(notify->extra)))
    21272130                {
    21282131                        Py_DECREF(notify_result);
     
    21862189
    21872190static PyObject *
    2188 connGetAttr(connObject *self, char *name)
    2189 {
     2191connGetAttr(connObject *self, PyObject *nameobj)
     2192{
     2193        const char *name = PyBytes_AsString(nameobj);
     2194
    21902195        /*
    21912196         * Although we could check individually, there are only a few
     
    22092214                if (!r)
    22102215                        r = "localhost";
    2211                 return PyBytes_FromString(r);
     2216                return PyUnicode_FromString(r);
    22122217        }
    22132218
     
    22182223        /* selected database */
    22192224        if (!strcmp(name, "db"))
    2220                 return PyBytes_FromString(PQdb(self->cnx));
     2225                return PyUnicode_FromString(PQdb(self->cnx));
    22212226
    22222227        /* selected options */
    22232228        if (!strcmp(name, "options"))
    2224                 return PyBytes_FromString(PQoptions(self->cnx));
     2229                return PyUnicode_FromString(PQoptions(self->cnx));
    22252230
    22262231        /* selected postgres tty */
    22272232        if (!strcmp(name, "tty"))
    2228                 return PyBytes_FromString(PQtty(self->cnx));
     2233                return PyUnicode_FromString(PQtty(self->cnx));
    22292234
    22302235        /* error (status) message */
    22312236        if (!strcmp(name, "error"))
    2232                 return PyBytes_FromString(PQerrorMessage(self->cnx));
     2237                return PyUnicode_FromString(PQerrorMessage(self->cnx));
    22332238
    22342239        /* connection status : 1 - OK, 0 - BAD */
     
    22382243        /* provided user name */
    22392244        if (!strcmp(name, "user"))
    2240                 return PyBytes_FromString(PQuser(self->cnx));
     2245                return PyUnicode_FromString(PQuser(self->cnx));
    22412246
    22422247        /* protocol version */
     
    22592264                if (list)
    22602265                {
    2261                         PyList_SET_ITEM(list, 0, PyBytes_FromString("host"));
    2262                         PyList_SET_ITEM(list, 1, PyBytes_FromString("port"));
    2263                         PyList_SET_ITEM(list, 2, PyBytes_FromString("db"));
    2264                         PyList_SET_ITEM(list, 3, PyBytes_FromString("options"));
    2265                         PyList_SET_ITEM(list, 4, PyBytes_FromString("tty"));
    2266                         PyList_SET_ITEM(list, 5, PyBytes_FromString("error"));
    2267                         PyList_SET_ITEM(list, 6, PyBytes_FromString("status"));
    2268                         PyList_SET_ITEM(list, 7, PyBytes_FromString("user"));
    2269                         PyList_SET_ITEM(list, 8, PyBytes_FromString("protocol_version"));
    2270                         PyList_SET_ITEM(list, 9, PyBytes_FromString("server_version"));
     2266                        PyList_SET_ITEM(list, 0, PyUnicode_FromString("host"));
     2267                        PyList_SET_ITEM(list, 1, PyUnicode_FromString("port"));
     2268                        PyList_SET_ITEM(list, 2, PyUnicode_FromString("db"));
     2269                        PyList_SET_ITEM(list, 3, PyUnicode_FromString("options"));
     2270                        PyList_SET_ITEM(list, 4, PyUnicode_FromString("tty"));
     2271                        PyList_SET_ITEM(list, 5, PyUnicode_FromString("error"));
     2272                        PyList_SET_ITEM(list, 6, PyUnicode_FromString("status"));
     2273                        PyList_SET_ITEM(list, 7, PyUnicode_FromString("user"));
     2274                        PyList_SET_ITEM(list, 8, PyUnicode_FromString("protocol_version"));
     2275                        PyList_SET_ITEM(list, 9, PyUnicode_FromString("server_version"));
    22712276                }
    22722277
     
    22742279        }
    22752280
    2276         return Py_FindMethod(connMethods, (PyObject *) self, name);
     2281        return PyObject_GenericGetAttr((PyObject *) self, nameobj);
    22772282}
    22782283
     
    22802285static PyTypeObject connType = {
    22812286        PyVarObject_HEAD_INIT(NULL, 0)
    2282         "PGconnObject",                         /* tp_name */
     2287        "pgconnobject",                         /* tp_name */
    22832288        sizeof(connObject),                     /* tp_basicsize */
    22842289        0,                                                      /* tp_itemsize */
     
    22872292        (destructor) connDelete,        /* tp_dealloc */
    22882293        0,                                                      /* tp_print */
    2289         (getattrfunc) connGetAttr,      /* tp_getattr */
     2294        0,                                                      /* tp_getattr */
    22902295        0,                                                      /* tp_setattr */
    22912296        0,                                                      /* tp_reserved */
     
    22972302        0,                                                      /* tp_call */
    22982303        0,                                                      /* tp_str */
    2299         0,                                                      /* tp_getattro */
     2304        (getattrofunc) connGetAttr,     /* tp_getattro */
    23002305        0,                                                      /* tp_setattro */
    23012306        0,                                                      /* tp_as_buffer */
     
    25692574                        }
    25702575                        else
    2571                                 str = PyBytes_FromString(PQgetvalue(self->result, self->current_row, j));
     2576                                str = PyUnicode_FromString(PQgetvalue(self->result, self->current_row, j));
    25722577
    25732578                        PyTuple_SET_ITEM(rowtuple, j, str);
     
    26742679
    26752680        /* gets field number */
    2676         if (PyBytes_Check(param))
     2681        if (PyUnicode_Check(param))
    26772682                num = PQfnumber(self->result, PyBytes_AsString(param));
    26782683        else if (PyLong_Check(param))
     
    27082713        PyTuple_SET_ITEM(result, 0, PyLong_FromLong(num));
    27092714        PyTuple_SET_ITEM(result, 1,
    2710                 PyBytes_FromString(PQfname(self->result, num)));
     2715                PyUnicode_FromString(PQfname(self->result, num)));
    27112716        PyTuple_SET_ITEM(result, 2,
    27122717                PyLong_FromLong(PQftype(self->result, num)));
     
    28092814                return NULL;
    28102815
    2811         return PyBytes_FromString(PQgetvalue(self->result,
     2816        return PyUnicode_FromString(PQgetvalue(self->result,
    28122817                                                                        self->current_row, num));
    28132818}
     
    28422847/* gets query object attributes */
    28432848static PyObject *
    2844 sourceGetAttr(sourceObject *self, char *name)
    2845 {
     2849sourceGetAttr(sourceObject *self, PyObject *nameobj)
     2850{
     2851        const char *name = PyBytes_AsString(nameobj);
     2852
    28462853        /* pg connection object */
    28472854        if (!strcmp(name, "pgcnx"))
     
    28772884                PyObject *list = PyList_New(5);
    28782885
    2879                 PyList_SET_ITEM(list, 0, PyBytes_FromString("pgcnx"));
    2880                 PyList_SET_ITEM(list, 1, PyBytes_FromString("arraysize"));
    2881                 PyList_SET_ITEM(list, 2, PyBytes_FromString("resulttype"));
    2882                 PyList_SET_ITEM(list, 3, PyBytes_FromString("ntuples"));
    2883                 PyList_SET_ITEM(list, 4, PyBytes_FromString("nfields"));
     2886                PyList_SET_ITEM(list, 0, PyUnicode_FromString("pgcnx"));
     2887                PyList_SET_ITEM(list, 1, PyUnicode_FromString("arraysize"));
     2888                PyList_SET_ITEM(list, 2, PyUnicode_FromString("resulttype"));
     2889                PyList_SET_ITEM(list, 3, PyUnicode_FromString("ntuples"));
     2890                PyList_SET_ITEM(list, 4, PyUnicode_FromString("nfields"));
    28842891
    28852892                return list;
     
    28882895        /* module name */
    28892896        if (!strcmp(name, "__module__"))
    2890                 return PyBytes_FromString(MODULE_NAME);
     2897                return PyUnicode_FromString(MODULE_NAME);
    28912898
    28922899        /* class name */
    28932900        if (!strcmp(name, "__class__"))
    2894                 return PyBytes_FromString("pgsource");
     2901                return PyUnicode_FromString("pgsource");
    28952902
    28962903        /* seeks name in methods (fallback) */
    2897         return Py_FindMethod(sourceMethods, (PyObject *) self, name);
     2904        return PyObject_GenericGetAttr((PyObject *) self, nameobj);
    28982905}
    28992906
     
    29232930sourceRepr(sourceObject *self)
    29242931{
    2925         return PyBytes_FromString("<pg source object>");
     2932        return PyUnicode_FromString("<pg source object>");
    29262933}
    29272934
     
    29372944                case RESULT_DDL:
    29382945                case RESULT_DML:
    2939                         return PyBytes_FromString(PQcmdStatus(self->result));
     2946                        return PyUnicode_FromString(PQcmdStatus(self->result));
    29402947                case RESULT_EMPTY:
    29412948                default:
    2942                         return PyBytes_FromString("(empty PostgreSQL source object)");
     2949                        return PyUnicode_FromString("(empty PostgreSQL source object)");
    29432950        }
    29442951}
     
    29492956static PyTypeObject sourceType = {
    29502957        PyVarObject_HEAD_INIT(NULL, 0)
    2951         "PGsourceObject",                               /* tp_name */
     2958        "pgsourceobject",                               /* tp_name */
    29522959        sizeof(sourceObject),                   /* tp_basicsize */
    29532960        0,                                                              /* tp_itemsize */
     
    29552962        (destructor) sourceDealloc,             /* tp_dealloc */
    29562963        0,                                                              /* tp_print */
    2957         (getattrfunc) sourceGetAttr,    /* tp_getattr */
     2964        0,                                                              /* tp_getattr */
    29582965        (setattrfunc) sourceSetAttr,    /* tp_setattr */
    29592966        0,                                                              /* tp_compare */
     
    29652972        0,                                                              /* tp_call */
    29662973        (reprfunc) sourceStr,                   /* tp_str */
    2967         0,                                                              /* tp_getattro */
     2974        (getattrofunc) sourceGetAttr,   /* tp_getattro */
    29682975        0,                                                              /* tp_setattro */
    29692976        0,                                                              /* tp_as_buffer */
     
    29802987
    29812988/* connects to a database */
    2982 static char connect__doc__[] =
     2989static char pgConnect__doc__[] =
    29832990"connect(dbname, host, port, opt, tty) -- connect to a PostgreSQL database "
    29842991"using specified parameters (optionals, keywords aware).";
     
    31273134        {
    31283135                name = PQfname(self->result, i);
    3129                 str = PyBytes_FromString(name);
     3136                str = PyUnicode_FromString(name);
    31303137                PyTuple_SET_ITEM(fieldstuple, i, str);
    31313138        }
     
    31613168        /* gets fields name and builds object */
    31623169        name = PQfname(self->result, i);
    3163         return PyBytes_FromString(name);
     3170        return PyUnicode_FromString(name);
    31643171}
    31653172
     
    33013308
    33023309                                        default:
    3303                                                 val = PyBytes_FromString(s);
     3310                                                val = PyUnicode_FromString(s);
    33043311                                                break;
    33053312                                }
     
    34363443
    34373444                                        default:
    3438                                                 val = PyBytes_FromString(s);
     3445                                                val = PyUnicode_FromString(s);
    34393446                                                break;
    34403447                                }
     
    35023509/* get attribute */
    35033510static PyObject *
    3504 noticeGetAttr(noticeObject *self, char *name)
     3511noticeGetAttr(noticeObject *self, PyObject *nameobj)
    35053512{
    35063513        PGresult const *res = self->res;
     3514        const char *name = PyBytes_AsString(nameobj);
    35073515        int fieldcode;
    35083516
     
    35303538        /* full message */
    35313539        if (!strcmp(name, "message"))
    3532                 return PyBytes_FromString(PQresultErrorMessage(res));
     3540                return PyUnicode_FromString(PQresultErrorMessage(res));
    35333541
    35343542        /* other possible fields */
     
    35463554                char *s = PQresultErrorField(res, fieldcode);
    35473555                if (s)
    3548                         return PyBytes_FromString(s);
     3556                        return PyUnicode_FromString(s);
    35493557                else
    35503558                {
     
    35593567                if (list)
    35603568                {
    3561                         PyList_SET_ITEM(list, 0, PyBytes_FromString("pgcnx"));
    3562                         PyList_SET_ITEM(list, 1, PyBytes_FromString("severity"));
    3563                         PyList_SET_ITEM(list, 2, PyBytes_FromString("message"));
    3564                         PyList_SET_ITEM(list, 3, PyBytes_FromString("primary"));
    3565                         PyList_SET_ITEM(list, 4, PyBytes_FromString("detail"));
    3566                         PyList_SET_ITEM(list, 5, PyBytes_FromString("hint"));
     3569                        PyList_SET_ITEM(list, 0, PyUnicode_FromString("pgcnx"));
     3570                        PyList_SET_ITEM(list, 1, PyUnicode_FromString("severity"));
     3571                        PyList_SET_ITEM(list, 2, PyUnicode_FromString("message"));
     3572                        PyList_SET_ITEM(list, 3, PyUnicode_FromString("primary"));
     3573                        PyList_SET_ITEM(list, 4, PyUnicode_FromString("detail"));
     3574                        PyList_SET_ITEM(list, 5, PyUnicode_FromString("hint"));
    35673575                }
    35683576                return list;
    35693577        }
    35703578
    3571         PyErr_Format(PyExc_AttributeError,
    3572                 "'noticeObject' has no attribute %s", name);
    3573         return NULL;
     3579        return PyObject_GenericGetAttr((PyObject *) self, nameobj);
    35743580}
    35753581
     
    35773583noticeStr(noticeObject *self)
    35783584{
    3579         return noticeGetAttr(self, "message");
     3585        return noticeGetAttr(self, PyBytes_FromString("message"));
    35803586}
    35813587
     
    35833589static PyTypeObject noticeType = {
    35843590        PyVarObject_HEAD_INIT(NULL, 0)
    3585         "PGnoticeObject",                               /* tp_name */
     3591        "pgnoticeobject",                               /* tp_name */
    35863592        sizeof(noticeObject),                   /* tp_basicsize */
    35873593        0,                                                              /* tp_itemsize */
     
    35893595        0,                                                              /* tp_dealloc */
    35903596        0,                                                              /* tp_print */
    3591         (getattrfunc) noticeGetAttr,    /* tp_getattr */
     3597        0,                                                              /* tp_getattr */
    35923598        0,                                                              /* tp_setattr */
    35933599        0,                                                              /* tp_compare */
     
    35983604        0,                                                              /* tp_hash */
    35993605        0,                                                              /* tp_call */
    3600         (reprfunc) noticeStr                    /* tp_str */
     3606        (reprfunc) noticeStr,                   /* tp_str */
     3607        (getattrofunc) noticeGetAttr,   /* tp_getattro */
     3608        PyObject_GenericSetAttr,                /* tp_setattro */
     3609        0,                                                              /* tp_as_buffer */
     3610        Py_TPFLAGS_DEFAULT,                             /* tp_flags */
    36013611};
    36023612
     
    36203630};
    36213631
    3622 /* gets query object attributes */
    3623 static PyObject *
    3624 queryGetAttr(queryObject *self, char *name)
    3625 {
    3626         return Py_FindMethod(queryMethods, (PyObject *) self, name);
    3627 }
    3628 
    36293632/* query type definition */
    36303633static PyTypeObject queryType = {
    36313634        PyVarObject_HEAD_INIT(NULL, 0)
    3632         "PGqueryObject",                                /* tp_name */
     3635        "pgqueryobject",                                /* tp_name */
    36333636        sizeof(queryObject),                    /* tp_basicsize */
    36343637        0,                                                              /* tp_itemsize */
     
    36363639        (destructor) queryDealloc,              /* tp_dealloc */
    36373640        0,                                                              /* tp_print */
    3638         (getattrfunc) queryGetAttr,             /* tp_getattr */
     3641        0,                                                              /* tp_getattr */
    36393642        0,                                                              /* tp_setattr */
    36403643        0,                                                              /* tp_compare */
     
    36463649        0,                                                              /* tp_call */
    36473650        (reprfunc) queryStr,                    /* tp_str */
    3648         0,                                                              /* tp_getattro */
     3651        PyObject_GenericGetAttr,                /* tp_getattro */
    36493652        0,                                                              /* tp_setattro */
    36503653        0,                                                              /* tp_as_buffer */
     
    37713774        if (PyArg_ParseTuple(args, ""))
    37723775        {
    3773                 ret = PyBytes_FromString(decimal_point);
     3776                ret = PyUnicode_FromString(decimal_point);
    37743777        }
    37753778        else
     
    38773880
    38783881        if (temp)
    3879                 pg_default_host = PyBytes_FromString(temp);
     3882                pg_default_host = PyUnicode_FromString(temp);
    38803883        else
    38813884        {
     
    39283931
    39293932        if (temp)
    3930                 pg_default_base = PyBytes_FromString(temp);
     3933                pg_default_base = PyUnicode_FromString(temp);
    39313934        else
    39323935        {
     
    39793982
    39803983        if (temp)
    3981                 pg_default_opt = PyBytes_FromString(temp);
     3984                pg_default_opt = PyUnicode_FromString(temp);
    39823985        else
    39833986        {
     
    40314034
    40324035        if (temp)
    4033                 pg_default_tty = PyBytes_FromString(temp);
     4036                pg_default_tty = PyUnicode_FromString(temp);
    40344037        else
    40354038        {
     
    40844087
    40854088        if (temp)
    4086                 pg_default_user = PyBytes_FromString(temp);
     4089                pg_default_user = PyUnicode_FromString(temp);
    40874090        else
    40884091        {
     
    41124115
    41134116        if (temp)
    4114                 pg_default_passwd = PyBytes_FromString(temp);
     4117                pg_default_passwd = PyUnicode_FromString(temp);
    41154118        else
    41164119        {
     
    41794182static struct PyMethodDef pgMethods[] = {
    41804183        {"connect", (PyCFunction) pgConnect, METH_VARARGS|METH_KEYWORDS,
    4181                         connect__doc__},
     4184                        pgConnect__doc__},
    41824185        {"escape_string", (PyCFunction) pgEscapeString, METH_VARARGS,
    41834186                        pgEscapeString__doc__},
     
    42184221static struct PyModuleDef pgType = {
    42194222        PyModuleDef_HEAD_INIT,
    4220         "pg",
    4221         pg__doc__,
    4222         -1,
    4223         pgMethods,
    4224         NULL,
    4225         NULL,
    4226         NULL,
    4227         NULL
     4223        "pg",           /* m_name */
     4224        pg__doc__,      /* m_doc */
     4225        -1,                     /* m_size */
     4226        pgMethods,      /* m_methods */
     4227        NULL,           /* m_reload */
     4228        NULL,           /* m_traverse */
     4229        NULL,           /* m_clear */
     4230        NULL            /* m_free */
    42284231};
    4229 #endif
    42304232
    42314233/* Initialization function for the module */
    4232 #ifdef IS_PY3K
    42334234PyMODINIT_FUNC PyInit__pg(void)
    42344235#else
     
    42364237#endif
    42374238{
    4238         PyObject   *mod,
    4239                            *dict,
    4240                            *v;
     4239        PyObject   *mod, *dict, *v;
    42414240
    42424241        /* Create the module and add the functions */
     
    42924291
    42934292        /* Make the version available */
    4294         v = PyBytes_FromString(PyPgVersion);
     4293        v = PyUnicode_FromString(PyPgVersion);
    42954294        PyDict_SetItemString(dict, "version", v);
    42964295        PyDict_SetItemString(dict, "__version__", v);
Note: See TracChangeset for help on using the changeset viewer.