Ejemplo n.º 1
0
void MIIntervalFromPyDelta(PyObject* pyDelta, MI_Interval& interval)
{
    ZeroMemory(&interval, sizeof(MI_Interval));

    int days = PyDateTime_DELTA_GET_DAYS(pyDelta);
    if (days < 0)
    {
        throw MI::Exception(L"Negative datetime.timedelta intervals are not supported");
    }

    interval.days = (MI_Uint32)days;
    MI_Uint32 daySeconds = (MI_Uint32)PyDateTime_DELTA_GET_SECONDS(pyDelta);
    interval.hours = daySeconds / 3600;
    interval.minutes = (daySeconds - interval.hours * 3600) / 60;
    interval.seconds = daySeconds - interval.hours * 3600 - interval.minutes * 60;
    interval.microseconds = (MI_Uint32)PyDateTime_DELTA_GET_MICROSECONDS(pyDelta);
}
Ejemplo n.º 2
0
static PyObject *
_pydatetime_string_delta(pydatetimeObject *self)
{
    PyDateTime_Delta *obj = (PyDateTime_Delta*)self->wrapped;

    char buffer[8];
    int i;
    int a = PyDateTime_DELTA_GET_MICROSECONDS(obj);

    for (i=0; i < 6 ; i++) {
        buffer[5-i] = '0' + (a % 10);
        a /= 10;
    }
    buffer[6] = '\0';

    return Bytes_FromFormat("'%d days %d.%s seconds'::interval",
                            PyDateTime_DELTA_GET_DAYS(obj),
                            PyDateTime_DELTA_GET_SECONDS(obj),
                            buffer);
}
Ejemplo n.º 3
0
static void * pydelta_to_timespec(PyObject *td, struct timespec *ts)
{

    if (!PyDelta_Check(td)) {
        return NULL;
    }

    /* ts->tv_nsec = (PyDateTime_DELTA_GET_MICROSECONDS(td) % MICROSEC) * 1000; */
    ts->tv_nsec = MICRO2NANO(PyDateTime_DELTA_GET_MICROSECONDS(td));
    ts->tv_sec = PyDateTime_DELTA_GET_SECONDS(td);
    if (PyErr_Occurred() != NULL) {
        return NULL;
    }

    ts->tv_sec += PyDateTime_DELTA_GET_DAYS(td) * 24 * 60 * 60;
    if (PyErr_Occurred() != NULL) {
        return NULL;
    }

    printf("pydelta_to_timespec sec: %ld, nsec: %ld\n", ts->tv_sec, ts->tv_nsec);

    return td;
}//pydelta_to_timespec()
Ejemplo n.º 4
0
EXPORT UDate PyObject_AsUDate(PyObject *object)
{
    if (PyFloat_CheckExact(object))
        return (UDate) (PyFloat_AsDouble(object) * 1000.0);
    else
    {
        if (PyDateTime_CheckExact(object))
        {
            PyObject *tzinfo = PyObject_GetAttrString(object, "tzinfo");
            PyObject *utcoffset, *ordinal;

            if (tzinfo == Py_None)
            {
                PyObject *m = PyImport_ImportModule("icu");
                PyObject *cls = PyObject_GetAttrString(m, "ICUtzinfo");

                tzinfo = PyObject_CallMethodObjArgs(cls, getDefault_NAME, NULL);
                Py_DECREF(cls);
                Py_DECREF(m);

                utcoffset = PyObject_CallMethodObjArgs(tzinfo, utcoffset_NAME,
                                                       object, NULL);
                Py_DECREF(tzinfo);
            }
            else
            {
                utcoffset = PyObject_CallMethodObjArgs(object, utcoffset_NAME,
                                                       NULL);
                Py_DECREF(tzinfo);
            }

            ordinal = PyObject_CallMethodObjArgs(object, toordinal_NAME, NULL);

            if (utcoffset != NULL && PyDelta_CheckExact(utcoffset) &&
                ordinal != NULL && PyInt_CheckExact(ordinal))
            {
#if PY_MAJOR_VERSION >= 3
                double ordinalValue = PyLong_AsDouble(ordinal);
#else
                long ordinalValue = PyInt_AsLong(ordinal);
#endif

                double timestamp =
                    (ordinalValue - 719163) * 86400.0 +
                    PyDateTime_DATE_GET_HOUR(object) * 3600.0 +
                    PyDateTime_DATE_GET_MINUTE(object) * 60.0 +
                    (double) PyDateTime_DATE_GET_SECOND(object) +
                    PyDateTime_DATE_GET_MICROSECOND(object) / 1e6 -
#ifndef PYPY_VERSION
                    (((PyDateTime_Delta *) utcoffset)->days * 86400.0 +
                     (double) ((PyDateTime_Delta *) utcoffset)->seconds);
#else
                    (PyDateTime_DELTA_GET_DAYS(
                        (PyDateTime_Delta *) utcoffset) * 86400.0 +
                     (double) PyDateTime_DELTA_GET_SECONDS(
                         (PyDateTime_Delta *) utcoffset));
#endif

                Py_DECREF(utcoffset);
                Py_DECREF(ordinal);

                return (UDate) (timestamp * 1000.0);
            }

            Py_XDECREF(utcoffset);
            Py_XDECREF(ordinal);
        }
    }
    
    PyErr_SetObject(PyExc_TypeError, object);
    throw ICUException();
}