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;
}