TMemberIndex CObjectIStreamJson::FindDeep( const CItemsInfo& items, const CTempString& name, bool& deep) const { TMemberIndex i = items.Find(name); if (i != kInvalidMember) { deep = false; return i; } i = items.FindDeep(name); if (i != kInvalidMember) { deep = true; return i; } // on writing, we replace hyphens with underscores; // on reading, it complicates our life if (name.find_first_of("_") != CTempString::npos) { TMemberIndex first = items.FirstIndex(); TMemberIndex last = items.LastIndex(); for (i = first; i <= last; ++i) { const CItemInfo *itemInfo = items.GetItemInfo(i); string item_name = itemInfo->GetId().GetName(); NStr::ReplaceInPlace(item_name,"-","_"); if (name == item_name) { deep = false; return i; } } for (i = first; i <= last; ++i) { const CItemInfo* itemInfo = items.GetItemInfo(i); const CMemberId& id = itemInfo->GetId(); if (!id.IsAttlist() && id.HasNotag()) { const CClassTypeInfoBase* classType = dynamic_cast<const CClassTypeInfoBase*>( CItemsInfo::FindRealTypeInfo(itemInfo->GetTypeInfo())); if (classType) { if (FindDeep(classType->GetItems(), name, deep) != kInvalidMember) { deep = true; return i; } } } } } deep = true; return kInvalidMember; }
BEGIN_NCBI_SCOPE ////////////////////////////////////////////////////////////////////////////// static TSvrRef make_server(const CTempString& specification, double& preference) { CTempString server; // string host; Uint4 host = 0; Uint2 port = 0; string::size_type pos = 0; pos = specification.find_first_of("@(", pos); if (pos != string::npos) { server = specification.substr(0, pos); if (specification[pos] == '@') { // string::size_type old_pos = pos + 1; pos = specification.find_first_of(":(", pos + 1); if (pos != string::npos) { // string host_str = specification.substr(old_pos, pos - old_pos); // Ignore host in order to avoid dependebcy on libconnect. // SOCK_StringToHostPort(specification.c_str() + old_pos, &host, &port); if (specification[pos] == ':') { port = NStr::StringToUInt(specification.substr(pos + 1), NStr::fAllowLeadingSpaces | NStr::fAllowTrailingSymbols | NStr::fConvErr_NoThrow); pos = specification.find("(", pos + 1); if (pos != string::npos) { // preference = NStr::StringToDouble( preference = NStr::StringToUInt( specification.substr(pos + 1), NStr::fAllowLeadingSpaces | NStr::fAllowTrailingSymbols | NStr::fConvErr_NoThrow); } } else { // preference = NStr::StringToDouble( preference = NStr::StringToUInt( specification.substr(pos + 1), NStr::fAllowLeadingSpaces | NStr::fAllowTrailingSymbols | NStr::fConvErr_NoThrow); } } else { // host = specification.substr(old_pos); // Ignore host in order to avoid dependebcy on libconnect. // SOCK_StringToHostPort(specification.c_str() + old_pos, &host, &port); } } else { // preference = NStr::StringToDouble( preference = NStr::StringToUInt( specification.substr(pos + 1), NStr::fAllowLeadingSpaces | NStr::fAllowTrailingSymbols | NStr::fConvErr_NoThrow); } } else { server = specification; } if (server.empty() && host == 0) { DATABASE_DRIVER_ERROR("Either server name or host name expected.", 110100 ); } return TSvrRef(new CDBServer(server, host, port)); }