bool getStringValue()

in src/python_common.cpp [6:176]


bool getStringValue(PyObject *field_value, std::string &ret_value, bool &type_mismatch) {
    type_mismatch = false;
    if (field_value == Py_None || field_value == NULL)
        return false;

#if PY_MAJOR_VERSION >= 3      
    if (!PyUnicode_Check(field_value)) {
#else  
    if (!PyString_Check(field_value)) {
#endif
        type_mismatch = true;
        return false;
    }

#if PY_MAJOR_VERSION >= 3
    PyObject* str_object = PyUnicode_AsUTF8String(field_value);  // TODO: check UTF8?
    ret_value = PyBytes_AsString(str_object);
    Py_XDECREF(str_object);
#else
    ret_value = PyString_AsString(field_value);  // TODO: check UTF8?
#endif

    return true;
}

bool getInt32Value(PyObject *field_value, int32_t &ret_value, bool &type_mismatch) {
    type_mismatch = false;
    if (field_value == Py_None || field_value == NULL)
        return false;

    ret_value = PyLong_AsLong(field_value);
    if (ret_value == -1 && PyErr_Occurred()) {
        type_mismatch = true;
        return false;
    }

    return true;
}

bool getInt64Value(PyObject *field_value, int64_t &ret_value, bool &type_mismatch) {
    type_mismatch = false;
    if (field_value == Py_None || field_value == NULL)
        return false;

    ret_value = PyLong_AsLongLong(field_value);
    if (ret_value == -1 && PyErr_Occurred()) {
        type_mismatch = true;
        return false;
    }

    return true;
}

bool getDoubleValue(PyObject *field_value, double &ret_value, bool &type_mismatch) {
    type_mismatch = false;
    if (field_value == Py_None || field_value == NULL)
        return false;

    ret_value = PyFloat_AsDouble(field_value);
    if (ret_value == -1.0 && PyErr_Occurred()) {
        type_mismatch = true;
        return false;
    }

    return true;
}


bool getBooleanValue(PyObject *field_value, bool &ret_value) {
    if (field_value == Py_None || field_value == NULL)
        return false;

    if (!PyBool_Check(field_value))
        return false;

    ret_value = PyObject_Not(field_value) ? false : true;

    return true;
}

bool getStringValue(PyObject *message, const std::string &field_name, PyObject *field_key, std::string &ret_value) {
    if (message == NULL)
        return false;

    if (!PyObject_HasAttr(message, field_key))
        return false;

    PythonRefHolder object(PyObject_GetAttr(message, field_key));
    if (object.getReference() == Py_None)
        return false;

    bool type_mismatch = false;
    bool not_null = getStringValue(object.getReference(), ret_value, type_mismatch);
    if (type_mismatch)
        THROW_EXCEPTION("Wrong type of field '%s'. Required: STRING.", field_name.c_str());

    return not_null;
}

bool getInt32Value(PyObject *message, const std::string &field_name, PyObject *field_key, int32_t &ret_value) {
    if (message == NULL)
        return false;

    if (!PyObject_HasAttr(message, field_key))
        return false;

    PythonRefHolder object(PyObject_GetAttr(message, field_key));
    if (object.getReference() == Py_None)
        return false;

    bool type_mismatch = false;
    bool not_null = getInt32Value(object.getReference(), ret_value, type_mismatch);
    if (type_mismatch)
        THROW_EXCEPTION("Wrong type of field '%s'. Required: INTEGER.", field_name.c_str());

    return not_null;
}

bool getInt64Value(PyObject *message, const std::string &field_name, PyObject *field_key, int64_t &ret_value) {
    if (message == NULL)
        return false;

    if (!PyObject_HasAttr(message, field_key))
        return false;

    PythonRefHolder object(PyObject_GetAttr(message, field_key));
    if (object.getReference() == Py_None)
        return false;

    bool type_mismatch = false;
    bool not_null = getInt64Value(object.getReference(), ret_value, type_mismatch);
    if (type_mismatch)
        THROW_EXCEPTION("Wrong type of field '%s'. Required: INTEGER.", field_name.c_str());

    return not_null;
}

bool getDoubleValue(PyObject *message, const std::string &field_name, PyObject *field_key, double &ret_value) {
    if (message == NULL)
        return false;

    if (!PyObject_HasAttr(message, field_key))
        return false;

    PythonRefHolder object(PyObject_GetAttr(message, field_key));
    if (object.getReference() == Py_None)
        return false;

    bool type_mismatch = false;
    bool not_null = getDoubleValue(object.getReference(), ret_value, type_mismatch);
    if (type_mismatch)
        THROW_EXCEPTION("Wrong type of field '%s'. Required: FLOAT.", field_name.c_str());

    return not_null;
}

bool getBooleanValue(PyObject *message, const std::string &field_name, PyObject *field_key, bool &ret_value) {
    if (message == NULL)
        return false;

    if (!PyObject_HasAttr(message, field_key))
        return false;

    PythonRefHolder object(PyObject_GetAttr(message, field_key));
    if (object.getReference() == Py_None)
        return false;

    return getBooleanValue(object.getReference(), ret_value);
}

}