Example #1
0
File: tds.c Project: kohenchia/ctds
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);
}
Example #2
0
File: type.c Project: zillow/ctds
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);
}