1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
#include "common.h"
#include "utils/values.h"
using namespace wreport;
namespace wreport {
namespace python {
PyObject* wrpy_varcode_format(wreport::Varcode code)
{
char buf[7];
snprintf(buf, 7, "%c%02d%03d",
WR_VAR_F(code) == 0 ? 'B' :
WR_VAR_F(code) == 1 ? 'R' :
WR_VAR_F(code) == 2 ? 'C' :
WR_VAR_F(code) == 3 ? 'D' : '?',
WR_VAR_X(code), WR_VAR_Y(code));
return PyUnicode_FromString(buf);
}
void set_wreport_exception(const wreport::error& e)
{
switch (e.code())
{
case WR_ERR_NONE:
PyErr_SetString(PyExc_SystemError, e.what());
break;
case WR_ERR_NOTFOUND: // Item not found
PyErr_SetString(PyExc_KeyError, e.what());
break;
case WR_ERR_TYPE: // Wrong variable type
PyErr_SetString(PyExc_TypeError, e.what());
break;
case WR_ERR_ALLOC: // Cannot allocate memory
PyErr_SetString(PyExc_MemoryError, e.what());
break;
case WR_ERR_ODBC: // ODBC error
PyErr_SetString(PyExc_OSError, e.what());
break;
case WR_ERR_HANDLES: // Handle management error
PyErr_SetString(PyExc_SystemError, e.what());
break;
case WR_ERR_TOOLONG: // Buffer is too short to fit data
PyErr_SetString(PyExc_ValueError, e.what());
break;
case WR_ERR_SYSTEM: // Error reported by the system
PyErr_SetString(PyExc_OSError, e.what());
break;
case WR_ERR_CONSISTENCY: // Consistency check failed
PyErr_SetString(PyExc_RuntimeError, e.what());
break;
case WR_ERR_PARSE: // Parse error
PyErr_SetString(PyExc_ValueError, e.what());
break;
case WR_ERR_WRITE: // Write error
PyErr_SetString(PyExc_RuntimeError, e.what());
break;
case WR_ERR_REGEX: // Regular expression error
PyErr_SetString(PyExc_ValueError, e.what());
break;
case WR_ERR_UNIMPLEMENTED: // Feature not implemented
PyErr_SetString(PyExc_NotImplementedError, e.what());
break;
case WR_ERR_DOMAIN: // Value outside acceptable domain
PyErr_SetString(PyExc_OverflowError, e.what());
break;
default:
PyErr_Format(PyExc_SystemError, "unhandled exception with code %d: %s", e.code(), e.what());
break;
}
}
PyObject* raise_wreport_exception(const wreport::error& e)
{
set_wreport_exception(e);
return nullptr;
}
void set_std_exception(const std::exception& e)
{
PyErr_SetString(PyExc_RuntimeError, e.what());
}
PyObject* raise_std_exception(const std::exception& e)
{
set_std_exception(e);
return NULL;
}
int file_get_fileno(PyObject* o)
{
// fileno_value = obj.fileno()
pyo_unique_ptr fileno_meth(PyObject_GetAttrString(o, "fileno"));
if (!fileno_meth) return -1;
pyo_unique_ptr fileno_args(Py_BuildValue("()"));
if (!fileno_args) return -1;
PyObject* fileno_value = PyObject_Call(fileno_meth, fileno_args, NULL);
if (!fileno_value)
{
if (PyErr_ExceptionMatches(PyExc_AttributeError) || PyErr_ExceptionMatches(PyExc_IOError))
PyErr_Clear();
return -1;
}
// fileno = int(fileno_value)
if (!PyObject_TypeCheck(fileno_value, &PyLong_Type)) {
PyErr_SetString(PyExc_ValueError, "fileno() function must return an integer");
return -1;
}
return PyLong_AsLong(fileno_value);
}
PyObject* file_get_data(PyObject* o, char*&buf, Py_ssize_t& len)
{
// Use read() instead
pyo_unique_ptr read_meth(PyObject_GetAttrString(o, "read"));
pyo_unique_ptr read_args(Py_BuildValue("()"));
pyo_unique_ptr data(PyObject_Call(read_meth, read_args, NULL));
if (!data) return nullptr;
if (!PyObject_TypeCheck(data, &PyBytes_Type)) {
PyErr_SetString(PyExc_ValueError, "read() function must return a bytes object");
return nullptr;
}
if (PyBytes_AsStringAndSize(data, &buf, &len))
return nullptr;
return data.release();
}
std::string object_repr(PyObject* o)
{
return from_python<std::string>(throw_ifnull(PyObject_Repr(o)));
}
}
}
|