bool TickDbClassDescriptorImpl::parseDataType()

in src/dxapi/native/tickdb/http/xml/tickdb_class_descriptor.cpp [112:160]


bool TickDbClassDescriptorImpl::parseDataType(DataType &dataType, XMLElement *dataTypeNode)
{
    dataType.encodingName.clear();
    dataType.descriptorGuid.clear();
    dataType.isNullable = false;

    if (NULL != dataTypeNode) {
        const char *type = dataTypeNode->Attribute("xsi:type");
        dataType.typeName = type;

        const char *encoding = getText(dataTypeNode, "encoding");
            // parse returns false and does not change target if parsing failed
        parse(dataType.encodingName, encoding);
        //f.setType(string(type).append("-").append(encoding).c_str());

        parse(dataType.descriptorGuid, getText(dataTypeNode, "descriptor"));

        XMLElement *typesElement = dataTypeNode->FirstChildElement("types");
        while (NULL != typesElement) {
            dataType.types.emplace_back(typesElement->GetText());
            typesElement = typesElement->NextSiblingElement("types");
        }

        parse(dataType.isNullable, getText(dataTypeNode, "nullable"));

        string typeDescription = type;
        if (NULL != encoding) {
            typeDescription.append("-").append(encoding);
        }

        dataType.descriptor = FieldTypeDescriptor(FieldType::fromString(typeDescription), 0, dataType.isNullable);

        if (typeDescription == "array") {
            XMLElement * subType = dataTypeNode->FirstChildElement("type");
            if (NULL == subType) {
                THROW_DBGLOG("Array element type is empty.");
            }

            DataType *elementType = new DataType();
            parseDataType(*elementType, subType);
            dataType.elementType = shared_ptr<DataType>(elementType);
        }
    } else {
        // = NULL
        dataType.descriptor = FieldTypeDescriptor(FieldType::Enum::UNKNOWN, 0, false);
    }

    return true;
}