PyObject* MI2Py(const MI_Value& value, MI_Type valueType, MI_Uint32 flags) { if (flags & MI_FLAG_NULL) Py_RETURN_NONE; if (valueType & MI_ARRAY) { return MIArray2PyTuple(value, (MI_Type)(valueType ^ MI_ARRAY)); } switch (valueType) { case MI_BOOLEAN: return PyBool_FromLong(value.boolean); case MI_SINT8: return PyLong_FromLong(value.sint8); case MI_UINT8: return PyLong_FromUnsignedLong(value.uint8); case MI_SINT16: return PyLong_FromLong(value.sint16); case MI_UINT16: return PyLong_FromUnsignedLong(value.uint16); case MI_SINT32: return PyLong_FromLong(value.sint32); case MI_UINT32: return PyLong_FromUnsignedLong(value.uint32); case MI_SINT64: return PyLong_FromLongLong(value.sint64); case MI_UINT64: return PyLong_FromUnsignedLongLong(value.uint64); case MI_REAL32: return PyFloat_FromDouble(value.real32); case MI_REAL64: return PyFloat_FromDouble(value.real64); case MI_CHAR16: return PyLong_FromLong(value.char16); case MI_DATETIME: // TODO: understand where this import needs to be called PyDateTime_IMPORT; if (value.datetime.isTimestamp) { const MI_Timestamp& ts = value.datetime.u.timestamp; // TODO: Add timezone support! return PyDateTime_FromDateAndTime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, ts.microseconds); } else { return PyDeltaFromMIInterval(value.datetime.u.interval); } break; case MI_STRING: return PyUnicode_FromWideChar(value.string, wcslen(value.string)); case MI_INSTANCE: return (PyObject*)Instance_New(std::make_shared<MI::Instance>(value.instance, false)); case MI_REFERENCE: return (PyObject*)Instance_New(std::make_shared<MI::Instance>(value.reference, false)); default: throw MI::TypeConversionException(); } }
static PyObject* OperationOptions_GetTimeout(OperationOptions* self, PyObject* timeout) { try { MI_Interval interval; AllowThreads(&self->cs, [&]() { interval = self->operationOptions->GetTimeout(); }); return PyDeltaFromMIInterval(interval); } catch (std::exception& ex) { SetPyException(ex); return NULL; } }