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