Ejemplo n.º 1
0
void DAOProxy::get_field(const char* name, string &value)
{
    //ACS_TRACE("cdb::DAOProxy::get_field");

    CXMLTreeNode* pNode = m_rootNode;
    if (ACE_OS::strlen(name) == 0 || ACE_OS::strcmp(pNode->m_name.c_str(), name) == 0)
	{
	// return attributes
	pNode->getAttributeNames(value);
	return;
	}

    // tokenizer changes buffer, so copy is needed
    char* namecopy = ACE_OS::strdup(name);
    ACE_Tokenizer tokenizer(namecopy);
    tokenizer.delimiter_replace('/', 0);

    string fieldName = tokenizer.next();
    for (char* token = tokenizer.next(); token; token = tokenizer.next())
	{
	CXMLTreeNode::MapStringToNode::const_iterator iter = pNode->m_subNodesMap.find(fieldName);
	if(iter == pNode->m_subNodesMap.end())
	    {
	    // not found, add one level of hierarchy
	    fieldName.append("/").append(token);
	    }
	else
	    {
	    // found, transverse
	    pNode = iter->second;
	    fieldName = token;
	    }

	}

    ACE_OS::free(namecopy);

    // backward compatibility
    if (ACE_OS::strcmp(fieldName.c_str(), "_characteristics") == 0)
	{
	pNode->getAttributeNames(value);
	return;
	}
    else
	{
	CXMLTreeNode::MapStringToString::const_iterator iter = pNode->m_fieldMap.find(fieldName);
	if(iter != pNode->m_fieldMap.end())
	    {
	    // found
	    value = iter->second;
	    return;
	    }
	else
	    {
	    // we should try to get it as node
	    CXMLTreeNode::MapStringToNode::const_iterator iter = pNode->m_subNodesMap.find(fieldName);
	    if(iter != pNode->m_subNodesMap.end())
		{
		iter->second->getAttributeNames(value);
		return;
		}
	    else
		{
		ACS_LOG(LM_RUNTIME_CONTEXT, "cdb::DAOProxy::get_field",
			(LM_WARNING, "Field %s/%s does not exist.", m_nodeName.c_str(), name));
		//throw CDB::FieldDoesNotExist();
		throw cdbErrType::CDBFieldDoesNotExistExImpl (
			__FILE__, __LINE__,
			"DAOProxy::get_field");
		}
	    }
	}
}
Ejemplo n.º 2
0
Boolean DAOImpl::get_field( const String &strFieldName, Field &fld )
{
	if( m_remote ) {
		
		try{
			CORBA::String_var filedData = m_dao->get_field_data( strFieldName.c_str() );
			
      			if(!fld.SetType(Field::tyString, 0)) return 0;
      			return fld.SetString(filedData.in());
		}catch(CORBA::Exception &ex){
			// be silent here
		}
		return false;
	}

	int pos1;
	String fieldName = strFieldName;
	String restOfName;
	CXMLTreeNode::MapStringToNode::iterator subIter;
	CXMLTreeNode* pNode = m_rootNode;
	if( strFieldName.length() == 0 || ACE_OS::strcmp(pNode->m_name.c_str(), strFieldName.c_str()) == 0 ) {
		String filedData;
		pNode->getAttributeNames( filedData );
		fld.SetType(Field::tyString, 0);
		fld.SetString(filedData.c_str());
		return TRUE;
	}
	pos1 = fieldName.find("/");
	while( pos1 != String::npos ) {
		restOfName = fieldName.substr(pos1+1); 
		String subName = fieldName.substr(0, pos1);
		subIter = pNode->m_subNodesMap.find( subName );
		if( subIter == pNode->m_subNodesMap.end() )
			break; // we do not find it but fall down to check in plain entries
		pNode = subIter->second;
		fieldName = restOfName;
		pos1 = fieldName.find("/");
	}
	if( ACE_OS::strcmp(fieldName.c_str(), "_characteristics") == 0 ) {
		ACE_CString all_names;
		MapStringToField::const_iterator iter = pNode->m_fieldMap.begin();
		for(;iter!=pNode->m_fieldMap.end(); iter++ ) {
			all_names = all_names + iter->first + ",";
		}
		fld.SetType( Field::tyString, 0 );
		fld.SetString( all_names.c_str() );
		return TRUE;
	}
	
	MapStringToField::iterator iter = pNode->m_fieldMap.find(fieldName);
	if(iter == pNode->m_fieldMap.end()) {
                subIter = pNode->m_subNodesMap.find( fieldName );
                if( subIter != pNode->m_subNodesMap.end() ) {
                        String filedData;
                        subIter->second->getAttributeNames( filedData );
                        fld.SetType(Field::tyString, 0);
                        fld.SetString(filedData.c_str());
                        return TRUE;
                }
		return FALSE;
	}
	fld = iter->second;
	/*	
	// DEBUG
	String fieldData;
	fld.ToString(fieldData);
	ACS_LOG(0, "cdb::DAOImpl", (LM_INFO, "DAO:'%s' returned '%s'=%s", m_name.c_str(), strFieldName.c_str(), fieldData.c_str()));
	//
	*/
	return TRUE;
}