static PyObject* tds_TimeFromTicks(PyObject* self, PyObject* args) { PyObject* time = NULL; PyObject* datetime = PyDateTime_FromTimestamp_(args); if (datetime) { time = PyTime_FromTime_(PyDateTime_DATE_GET_HOUR_(datetime), PyDateTime_DATE_GET_MINUTE_(datetime), PyDateTime_DATE_GET_SECOND_(datetime), PyDateTime_DATE_GET_MICROSECOND_(datetime)); Py_DECREF(datetime); } return time; UNUSED(self); }
int datetime_to_sql(PyObject* o, enum TdsType* tdstype, void* converted, size_t cbconverted) { int written = 0; /* Python only supports microsecond precision. */ char buffer[ARRAYSIZE("YYYY-MM-DD HH:MM:SS.nnnnnn")]; /* The best _supported_ TDS type. Default to DATETIME which is widely supported across TDS and FreeTDS versions. */ *tdstype = TDSDATETIME; if (PyDate_Check_(o)) { written += sprintf(&buffer[written], "%04d-%02d-%02d", PyDateTime_GET_YEAR_(o), PyDateTime_GET_MONTH_(o), PyDateTime_GET_DAY_(o)); } if (PyDateTime_Check_(o)) { written += sprintf(&buffer[written], " "); } if (PyTime_Check_(o) || PyDateTime_Check_(o)) { int hours = (PyDateTime_Check_(o)) ? PyDateTime_DATE_GET_HOUR_(o) : PyDateTime_TIME_GET_HOUR_(o); int minutes = (PyDateTime_Check_(o)) ? PyDateTime_DATE_GET_MINUTE_(o) : PyDateTime_TIME_GET_MINUTE_(o); int seconds = (PyDateTime_Check_(o)) ? PyDateTime_DATE_GET_SECOND_(o) : PyDateTime_TIME_GET_SECOND_(o); int useconds = (PyDateTime_Check_(o)) ? PyDateTime_DATE_GET_MICROSECOND_(o) : PyDateTime_TIME_GET_MICROSECOND_(o); written += sprintf(&buffer[written], "%02d:%02d:%02d", hours, minutes, seconds); if (useconds) { #if defined(CTDS_HAVE_TDSTIME) written += sprintf(&buffer[written], ".%06d", useconds); /* Always use DATETIME2 to preserve fractional second precision. */ *tdstype = (PyDateTime_Check_(o)) ? TDSDATETIME2 : TDSTIME; #else /* if defined(CTDS_HAVE_TDSTIME) */ /* For compatibility with the MS SQL DATETIME type, only include microsecond granularity. */ written += sprintf(&buffer[written], ".%03d", useconds / 1000); *tdstype = TDSDATETIME; #endif /* else if defined(CTDS_HAVE_TDSTIME) */ } #if defined(CTDS_HAVE_TDSTIME) else { *tdstype = (PyDateTime_Check_(o)) ? TDSDATETIME : TDSTIME; } #endif /* if defined(CTDS_HAVE_TDSTIME) */ } return (int)dbconvert(NULL, TDSCHAR, (const BYTE*)buffer, (DBINT)written, *tdstype, (BYTE*)converted, (DBINT)cbconverted); }