static PyObject* tds_Date(PyObject* self, PyObject* args) { int year, month, day; if (!PyArg_ParseTuple(args, "iii", &year, &month, &day)) { return NULL; } VERIFY_DATETIME_PART(year, 1, 9999); VERIFY_DATETIME_PART(month, 1, 12); VERIFY_DATETIME_PART(day, 1, 31); return PyDate_FromDate_(year, month, day); UNUSED(self); }
static PyObject* DATETIME_topython(enum TdsType tdstype, const void* data, size_t ndata) { DBDATETIME dbdatetime; if (!ndata) Py_RETURN_NONE; switch (tdstype) { default: { DBINT size = dbconvert(NULL, tdstype, data, (DBINT)ndata, SYBDATETIME, (BYTE*)&dbdatetime, -1); if (-1 == size) { PyErr_Format(PyExc_RuntimeError, "failed to convert DATETIME"); return NULL; } ndata = (size_t)size; data = (const uint8_t*)&dbdatetime; /* Intentional fall-through. */ } #if defined(CTDS_HAVE_TDSTIME) case TDSDATE: case TDSTIME: case TDSDATETIME2: case TDSSMALLDATETIME: #endif /* if defined(CTDS_HAVE_TDSTIME) */ case TDSDATETIME: case TDSDATETIMEN: { int usecond; #if defined(CTDS_HAVE_TDSTIME) DBDATEREC2 dbdaterec; (void)dbanydatecrack(NULL, &dbdaterec, tdstype, data); usecond = dbdaterec.nanosecond / 1000; #else /* if defined(CTDS_HAVE_TDSTIME) */ DBDATEREC dbdaterec; (void)dbdatecrack(NULL, &dbdaterec, (DBDATETIME*)data); usecond = dbdaterec.millisecond * 1000; #endif /* else if defined(CTDS_HAVE_TDSTIME) */ /* If freetds was not compiled with MSDBLIB defined, the month, quarter, day of week are 0-based values. */ if (!s_freetds_msdblib) { dbdaterec.quarter++; dbdaterec.month++; dbdaterec.weekday++; } switch (tdstype) { case TDSDATE: { return PyDate_FromDate_(dbdaterec.year, dbdaterec.month, dbdaterec.day); } case TDSTIME: { return PyTime_FromTime_(dbdaterec.hour, dbdaterec.minute, dbdaterec.second, usecond); } default: { return PyDateTime_FromDateAndTime_(dbdaterec.year, dbdaterec.month, dbdaterec.day, dbdaterec.hour, dbdaterec.minute, dbdaterec.second, usecond); } } break; } } }