13 #include "RelationalAccess/IDatabaseServiceDescription.h"
17 m_frontiergen(false) {
22 const coral::IDatabaseServiceDescription*>& replicaSet) {
24 std::map<int,const coral::IDatabaseServiceDescription*> primap;
25 for (std::vector<const coral::IDatabaseServiceDescription*>::const_iterator
26 itr=replicaSet.begin();itr!=replicaSet.end();++itr) {
27 const std::string
conn=(**itr).connectionString();
29 if (
conn.find(
"sqlite_file")==std::string::npos) {
31 std::string::size_type ipos1=
conn.find(
"://");
32 std::string::size_type ipos2=
conn.find(
'/',ipos1+3);
33 if (ipos1!=std::string::npos && ipos2!=std::string::npos) {
34 const std::string
server=
conn.substr(ipos1+3,ipos2-ipos1-3);
37 for (ServerMap::const_iterator sitr=
m_servermap.begin();
40 primap[sitr->second]=*itr;
47 for (std::map<int,const coral::IDatabaseServiceDescription*>::const_iterator
48 itr=primap.begin();itr!=primap.end();++itr) {
49 replicaSet.push_back(itr->second);
50 std::cout <<
"Allowed replica to try (priority " << itr->first
51 <<
") : " << (itr->second)->connectionString() << std::endl;
53 if (replicaSet.empty())
54 std::cout <<
"No matching replicas found" << std::endl;
60 const char* chost=
getenv(
"ATLAS_CONDDB");
63 const char* chost=
getenv(
"HOSTNAME");
68 system(
"hostname --fqdn > hostnamelookup.tmp");
70 infile.open(
"hostnamelookup.tmp");
78 std::cout <<
"Using machine hostname " <<
m_hostname <<
79 " for DB replica resolution" << std::endl;
81 const char* cfrontier=
getenv(
"FRONTIER_SERVER");
82 if (cfrontier && strcmp(cfrontier,
"")!=0) {
83 std::cout <<
"Frontier server at " << cfrontier <<
" will be considered"
93 std::cout <<
"Cannot open/locate configuration file dbreplica.config"
98 unsigned int bufsize=999;
99 char* p_buf=
new char[bufsize];
100 while (!feof(p_inp)) {
101 char* p_line=fgets(p_buf,bufsize,p_inp);
102 if (p_line!=NULL && p_line[0]!=
'#') {
103 std::string
buf=std::string(p_line);
104 std::string::size_type iofs1=0;
107 std::vector<std::string> domains;
108 std::vector<std::string> servers;
109 while (iofs1<
buf.size()) {
110 std::string::size_type iofs2=
buf.find(
' ',iofs1);
112 if (iofs2==std::string::npos) iofs2=
buf.size()-1;
113 std::string token=
buf.substr(iofs1,iofs2-iofs1);
115 if (token!=
"" && token!=
" ") {
118 }
else if (!sequal) {
120 domains.push_back(token);
124 if (token!=
"ATLF" ||
m_frontiergen) servers.push_back(token);
132 unsigned int bestlen=0;
133 for (std::vector<std::string>::const_iterator itr=domains.begin();
134 itr!=domains.end();++itr) {
135 std::string::size_type len=(itr->size());
136 std::string::size_type hlen=
m_hostname.size();
137 if (hlen>=len && *itr==
m_hostname.substr(hlen-len,len)) {
147 "No specific match for domain found - use default fallback"
156 for (
unsigned int i=0;
i<servers.size();++
i) {
166 " servers found for host " <<
m_hostname << std::endl;
171 const std::string& pathvar) {
173 std::string::size_type iofs1,iofs2,len;
178 while (!
fptr && iofs1<len) {
179 iofs2=pathvar.find(
':',iofs1);
180 if (iofs2==std::string::npos) iofs2=len;