static PyObject *CS_COMMAND_ct_param(CS_COMMANDObj *self, PyObject *args) { PyObject *obj; CS_RETCODE status; if (!PyArg_ParseTuple(args, "O", &obj)) return NULL; if (self->cmd == NULL) { PyErr_SetString(PyExc_TypeError, "CS_COMMAND has been dropped"); return NULL; } /* FIXME: Need to handle CS_UPDATECOL variant */ if (DataBuf_Check(obj)) { DataBufObj *databuf = (DataBufObj *)obj; /* PyErr_Clear(); */ SY_CONN_BEGIN_THREADS(self->conn); status = ct_param(self->cmd, &databuf->fmt, databuf->buff, databuf->copied[0], databuf->indicator[0]); SY_CONN_END_THREADS(self->conn); if (self->debug) { debug_msg("ct_param(cmd%d, &databuf%d->fmt=", self->serial, databuf->serial); datafmt_debug(&databuf->fmt); debug_msg(", databuf%d->buff, %d, %d) -> %s\n", databuf->serial, (int)databuf->copied[0], databuf->indicator[0], value_str(VAL_STATUS, status)); } if (PyErr_Occurred()) return NULL; } else if (CS_DATAFMT_Check(obj)) { CS_DATAFMTObj *datafmt = (CS_DATAFMTObj *)obj; /* PyErr_Clear(); */ SY_CONN_BEGIN_THREADS(self->conn); status = ct_param(self->cmd, &datafmt->fmt, NULL, CS_UNUSED, (CS_SMALLINT)CS_UNUSED); SY_CONN_END_THREADS(self->conn); if (self->debug) { debug_msg("ct_param(cmd%d, &fmt=", self->serial); datafmt_debug(&datafmt->fmt); debug_msg(", NULL, CS_UNUSED, CS_UNUSED) -> %s\n", value_str(VAL_STATUS, status)); } if (PyErr_Occurred()) return NULL; } else { PyErr_SetString(PyExc_TypeError, "expect CS_DATAFMT or DataBuf"); return NULL; } return PyInt_FromLong(status); }
PyObject *databuf_alloc(PyObject *obj) { DataBufObj *self; self = PyObject_NEW(DataBufObj, &DataBufType); if (self == NULL) return NULL; SY_LEAK_REG(self); self->buff = NULL; self->copied = NULL; self->indicator = NULL; self->serial = databuf_serial++; if (CS_DATAFMT_Check(obj)) { self->strip = ((CS_DATAFMTObj*)obj)->strip; self->fmt = ((CS_DATAFMTObj*)obj)->fmt; if (self->fmt.count == 0) self->fmt.count = 1; /* Seems like FreeTDS reports the wrong maxlength in * ct_describe() - fix this when binding to a buffer. */ /* Seems like Sybase's blk_describe has the same problem - PCP */ if (self->fmt.datatype == CS_NUMERIC_TYPE || self->fmt.datatype == CS_DECIMAL_TYPE) self->fmt.maxlength = sizeof(CS_NUMERIC); if (allocate_buffers(self) == NULL) { Py_DECREF(self); return NULL; } } else { if (PyInt_Check(obj) || obj == Py_None) /* if (PyInt_AsLong(obj) <= INT32_MAX && PyInt_AsLong(obj) >= INT32_MIN) */ int_datafmt(&self->fmt); else if (PyLong_Check(obj)) numeric_datafmt(&self->fmt, CS_SRC_VALUE, 0); else if (PyFloat_Check(obj)) float_datafmt(&self->fmt); else if (Numeric_Check(obj)) numeric_datafmt(&self->fmt, CS_SRC_VALUE, CS_SRC_VALUE); else if (DateTime_Check(obj)) datetime_datafmt(&self->fmt, ((DateTimeObj*)obj)->type); #ifdef CS_DATE_TYPE else if (Date_Check(obj)) date_datafmt(&self->fmt); #endif else if (Money_Check(obj)) money_datafmt(&self->fmt, ((MoneyObj*)obj)->type); else if (PyString_Check(obj)) { char_datafmt(&self->fmt); self->fmt.maxlength = PyString_Size(obj) + 1; #ifdef HAVE_DATETIME } else if (pydatetime_check(obj)) { datetime_datafmt(&self->fmt, CS_DATETIME_TYPE); } else if (pydate_check(obj)) { #ifdef CS_DATE_TYPE date_datafmt(&self->fmt); #else datetime_datafmt(&self->fmt, CS_DATETIME_TYPE); #endif #endif #ifdef HAVE_DECIMAL } else if (pydecimal_check(obj)) { numeric_datafmt(&self->fmt, CS_SRC_VALUE, CS_SRC_VALUE); #endif } else { PyErr_SetString(PyExc_TypeError, "unsupported parameter type"); Py_DECREF(self); return NULL; } self->fmt.status = CS_INPUTVALUE; self->fmt.count = 1; if (allocate_buffers(self) == NULL || DataBuf_ass_item((PyObject*)self, 0, obj) < 0) { Py_DECREF(self); return NULL; } } return (PyObject*)self; }