static void *createStringObject(const redisReadTask *task, char *str, size_t len) { pythonReader *self = (pythonReader*)task->privdata; PyObject *obj; if (task->type == REDIS_REPLY_ERROR) { PyObject *args = Py_BuildValue("(s#)", str, len); assert(args != NULL); /* TODO: properly handle OOM etc */ obj = PyObject_CallObject(self->replyErrorClass, args); assert(obj != NULL); Py_DECREF(args); } else { obj = createDecodedString(self, str, len); } return tryParentize(task, obj); }
static PyObject *replyToPyObject(hirlite_RliteObject *self, rliteReply *reply) { if (reply->type == RLITE_REPLY_STATUS || reply->type == RLITE_REPLY_STRING) { if (reply->type == RLITE_REPLY_STATUS && reply->len == 2 && memcmp(reply->str, "OK", 2) == 0) { Py_INCREF(Py_True); return Py_True; } return createDecodedString(self, reply->str, reply->len); } if (reply->type == RLITE_REPLY_NIL) { Py_INCREF(Py_None); return Py_None; } if (reply->type == RLITE_REPLY_INTEGER) { return PyLong_FromLongLong(reply->integer); } if (reply->type == RLITE_REPLY_ERROR) { PyObject *obj; PyObject *args = Py_BuildValue("(s#)", reply->str, reply->len); assert(args != NULL); obj = PyObject_CallObject(HIRLITE_STATE->HiErr_Base, args); assert(obj != NULL); Py_DECREF(args); return obj; } if (reply->type == RLITE_REPLY_ARRAY) { PyObject *obj, *element; size_t i; obj = PyList_New(reply->elements); for (i = 0; i < reply->elements; i++) { element = replyToPyObject(self, reply->element[i]); PyList_SET_ITEM(obj, i, element); } return obj; } return NULL; }