//---------------------------------------------------------------------------
//	@function:
//		CParseHandlerMetadata::PdrgpsysidParse
//
//	@doc:
//		Parse a list of source system ids
//
//---------------------------------------------------------------------------
DrgPsysid *
CParseHandlerMetadata::PdrgpsysidParse
	(
	const Attributes &attrs,
	Edxltoken edxltokenAttr,
	Edxltoken edxltokenElement
	)
{	
	const XMLCh *xmlszAttrName = CDXLTokens::XmlstrToken(edxltokenAttr);

	// extract systemids
	const XMLCh *xmlsz = attrs.getValue(xmlszAttrName);
	
	if (NULL == xmlsz)
	{
		return NULL;
	}

	DrgPsysid *pdrgpsysid = GPOS_NEW(m_pmp) DrgPsysid(m_pmp);

	// extract separate system ids 
	XMLStringTokenizer xmlsztok(xmlsz, CDXLTokens::XmlstrToken(EdxltokenComma));
	
	XMLCh *xmlszSysId = NULL;
	while (NULL != (xmlszSysId = xmlsztok.nextToken()))
	{
		// get sysid components
		XMLStringTokenizer xmlsztokSysid(xmlszSysId, CDXLTokens::XmlstrToken(EdxltokenDot));
		GPOS_ASSERT(2 == xmlsztokSysid.countTokens());
		
		XMLCh *xmlszType = xmlsztokSysid.nextToken();
		ULONG ulType = CDXLOperatorFactory::UlValueFromXmlstr(m_pphm->Pmm(), xmlszType, edxltokenAttr, edxltokenElement);
		
		XMLCh *xmlszName = xmlsztokSysid.nextToken();
		CWStringDynamic *pstrName = CDXLUtils::PstrFromXMLCh(m_pphm->Pmm(), xmlszName);
		
		pdrgpsysid->Append(GPOS_NEW(m_pmp) CSystemId((IMDId::EMDIdType) ulType, pstrName->Wsz(), pstrName->UlLength()));	
		
		GPOS_DELETE(pstrName);
	}
	
	return pdrgpsysid;
}