Ejemplo n.º 1
0
Archivo: tds.c Proyecto: kohenchia/ctds
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);
}
Ejemplo n.º 2
0
Archivo: type.c Proyecto: zillow/ctds
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;
        }
    }
}