Changeset 804 for trunk/pgmodule.c


Ignore:
Timestamp:
Jan 31, 2016, 5:57:22 PM (4 years ago)
Author:
cito
Message:

Make the automatic conversion to arrays configurable

The automatic conversion of arrays to lists can now be
disabled with the set_array() method.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/pgmodule.c

    r802 r804  
    9797                                *jsondecode = NULL; /* function for decoding json strings */
    9898static char decimal_point = '.'; /* decimal point used in money values */
    99 static int use_bool = 0; /* whether or not bool objects shall be returned */
     99static int bool_as_text = 1; /* whether bool shall be returned as text */
     100static int array_as_text = 0; /* whether arrays shall be returned as text */
    100101static int bytea_escaped = 0; /* whether bytea shall be returned escaped */
    101102
     
    315316                case OIDARRAYOID:
    316317                case XIDARRAYOID:
    317                         t = PYGRES_INT | PYGRES_ARRAY;
     318                        t = array_as_text ? PYGRES_TEXT : (PYGRES_INT | PYGRES_ARRAY);
    318319                        break;
    319320
    320321                case INT8ARRAYOID:
    321                         t = PYGRES_LONG | PYGRES_ARRAY;
     322                        t = array_as_text ? PYGRES_TEXT : (PYGRES_LONG | PYGRES_ARRAY);
    322323                        break;
    323324
    324325                case FLOAT4ARRAYOID:
    325326                case FLOAT8ARRAYOID:
    326                         t = PYGRES_FLOAT | PYGRES_ARRAY;
     327                        t = array_as_text ? PYGRES_TEXT : (PYGRES_FLOAT | PYGRES_ARRAY);
    327328                        break;
    328329
    329330                case NUMERICARRAYOID:
    330                         t = PYGRES_DECIMAL | PYGRES_ARRAY;
     331                        t = array_as_text ? PYGRES_TEXT : (PYGRES_DECIMAL | PYGRES_ARRAY);
    331332                        break;
    332333
    333334                case CASHARRAYOID:
    334                         t = (decimal_point ?
    335                                 PYGRES_MONEY : PYGRES_TEXT) | PYGRES_ARRAY;
     335                        t = array_as_text ? PYGRES_TEXT : ((decimal_point ?
     336                                PYGRES_MONEY : PYGRES_TEXT) | PYGRES_ARRAY);
    336337                        break;
    337338
    338339                case BOOLARRAYOID:
    339                         t = PYGRES_BOOL | PYGRES_ARRAY;
     340                        t = array_as_text ? PYGRES_TEXT : (PYGRES_BOOL | PYGRES_ARRAY);
    340341                        break;
    341342
    342343                case BYTEAARRAYOID:
    343                         t = (bytea_escaped ? PYGRES_TEXT : PYGRES_BYTEA) | PYGRES_ARRAY;
     344                        t = array_as_text ? PYGRES_TEXT : ((bytea_escaped ?
     345                            PYGRES_TEXT : PYGRES_BYTEA) | PYGRES_ARRAY);
    344346                        break;
    345347
    346348                case JSONARRAYOID:
    347349                case JSONBARRAYOID:
    348                         t = (jsondecode ? PYGRES_JSON : PYGRES_TEXT) | PYGRES_ARRAY;
     350                        t = array_as_text ? PYGRES_TEXT : ((jsondecode ?
     351                            PYGRES_JSON : PYGRES_TEXT) | PYGRES_ARRAY);
    349352                        break;
    350353
     
    361364                case TIMESTAMPTZARRAYOID:
    362365                case REGTYPEARRAYOID:
    363                         t = PYGRES_TEXT | PYGRES_ARRAY;
     366                        t = array_as_text ? PYGRES_TEXT : (PYGRES_TEXT | PYGRES_ARRAY);
    364367                        break;
    365368
     
    538541
    539542                case PYGRES_BOOL:
    540                         /* convert to bool only if use_bool is set */
    541                         if (use_bool)
     543                        /* convert to bool only if bool_as_text is not set */
     544                        if (bool_as_text)
     545                        {
     546                                obj = PyStr_FromString(*s == 't' ? "t" : "f");
     547                        }
     548                        else
    542549                        {
    543550                                obj = *s == 't' ? Py_True : Py_False;
    544551                                Py_INCREF(obj);
    545                         }
    546                         else
    547                         {
    548                                 obj = PyStr_FromString(*s == 't' ? "t" : "f");
    549552                        }
    550553                        break;
     
    612615
    613616                case PYGRES_BOOL:
    614                         /* convert to bool only if use_bool is set */
    615                         if (use_bool)
     617                        /* convert to bool only if bool_as_text is not set */
     618                        if (bool_as_text)
     619                        {
     620                                obj = PyStr_FromString(*s == 't' ? "t" : "f");
     621                        }
     622                        else
    616623                        {
    617624                                obj = *s == 't' ? Py_True : Py_False;
    618625                                Py_INCREF(obj);
    619                         }
    620                         else
    621                         {
    622                                 obj = PyStr_FromString(*s == 't' ? "t" : "f");
    623626                        }
    624627                        break;
     
    51025105        if (PyArg_ParseTuple(args, ""))
    51035106        {
    5104                 ret = use_bool ? Py_True : Py_False;
     5107                ret = bool_as_text ? Py_False : Py_True;
    51055108                Py_INCREF(ret);
    51065109        }
     
    51255128        if (PyArg_ParseTuple(args, "i", &i))
    51265129        {
    5127                 use_bool = i ? 1 : 0;
     5130                bool_as_text = i ? 0 : 1;
    51285131                Py_INCREF(Py_None); ret = Py_None;
    51295132        }
     
    51315134                PyErr_SetString(PyExc_TypeError,
    51325135                        "Function set_bool() expects a boolean value as argument");
     5136
     5137        return ret;
     5138}
     5139
     5140/* get conversion of arrays to lists */
     5141static char pgGetArray__doc__[] =
     5142"get_array() -- check whether arrays are converted as lists";
     5143
     5144static PyObject *
     5145pgGetArray(PyObject *self, PyObject * args)
     5146{
     5147        PyObject *ret = NULL;
     5148
     5149        if (PyArg_ParseTuple(args, ""))
     5150        {
     5151                ret = array_as_text ? Py_False : Py_True;
     5152                Py_INCREF(ret);
     5153        }
     5154        else
     5155                PyErr_SetString(PyExc_TypeError,
     5156                        "Function get_array() takes no arguments");
     5157
     5158        return ret;
     5159}
     5160
     5161/* set conversion of arrays to lists */
     5162static char pgSetArray__doc__[] =
     5163"set_array(on) -- set whether arrays should be converted to lists";
     5164
     5165static PyObject *
     5166pgSetArray(PyObject *self, PyObject * args)
     5167{
     5168        PyObject *ret = NULL;
     5169        int                     i;
     5170
     5171        /* gets arguments */
     5172        if (PyArg_ParseTuple(args, "i", &i))
     5173        {
     5174                array_as_text = i ? 0 : 1;
     5175                Py_INCREF(Py_None); ret = Py_None;
     5176        }
     5177        else
     5178                PyErr_SetString(PyExc_TypeError,
     5179                        "Function set_array() expects a boolean value as argument");
    51335180
    51345181        return ret;
     
    57235770        {"get_bool", (PyCFunction) pgGetBool, METH_VARARGS, pgGetBool__doc__},
    57245771        {"set_bool", (PyCFunction) pgSetBool, METH_VARARGS, pgSetBool__doc__},
     5772        {"get_array", (PyCFunction) pgGetArray, METH_VARARGS, pgGetArray__doc__},
     5773        {"set_array", (PyCFunction) pgSetArray, METH_VARARGS, pgSetArray__doc__},
    57255774        {"get_bytea_escaped", (PyCFunction) pgGetByteaEscaped, METH_VARARGS,
    57265775                pgGetByteaEscaped__doc__},
Note: See TracChangeset for help on using the changeset viewer.