\n";
int n = 0;
OpTime otFirst;
OpTime otLast;
OpTime otEnd;
while( c->more() ) {
bo o = c->next();
otLast = o["ts"]._opTime();
if( otFirst.isNull() )
otFirst = otLast;
say(ss, o);
n++;
}
if( n == 0 ) {
ss << rsoplog << " is empty\n";
}
else {
auto_ptr c = conn->query(rsoplog, Query().sort("$natural",-1), 20, 0, &fields);
string x;
bo o = c->next();
otEnd = o["ts"]._opTime();
while( 1 ) {
stringstream z;
if( o["ts"]._opTime() == otLast )
break;
say(z, o);
x = z.str() + x;
if( !c->more() )
break;
bo o = c->next();
}
if( !x.empty() ) {
ss << "\n...\n\n" << x;
}
}
ss << " \n";
if( !otEnd.isNull() )
ss << "Log length in time: " << otEnd.getSecs() - otFirst.getSecs() << " secs
\n"; } void ReplSetImpl::_summarizeAsHtml(stringstream& s) const { s << table(0, false); s << tr("Set name:", _name); s << tr("Majority up:", elect.aMajoritySeemsToBeUp()?"yes":"no" ); s << _table(); const char *h[] = {"Member", "Up", "cctime", "Last heartbeat", "Votes", "State", "Status", "opord", 0}; s << table(h); /* this is to sort the member rows by their ordinal _id, so they show up in the same order on all the different web ui's; that is less confusing for the operator. */ map\n";
vector v = _rsLog.get();
for( int i = 0; i < (int)v.size(); i++ ) {
assert( strlen(v[i]) > 20 );
int r = repeats(v, i);
if( r < 0 ) {
s << color( clean(v,i) );
} else {
stringstream x;
x << string(v[i], 0, 20);
int nr = (i-r);
int last = i+nr-1;
for( ; r < i ; r++ ) x << '.';
if( 1 ) {
stringstream r;
if( nr == 1 ) r << "repeat last line";
else r << "repeats last " << nr << " lines; ends " << string(v[last]+4,0,15);
first = false; s << a("", r.str(), clean(v,i,x.str()));
}
else s << x.str();
s << '\n';
i = last;
}
}
s << " \n";
}
Member* ReplSetImpl::findById(unsigned id) const {
if( id == _self->id() ) return _self;
for( Member *m = head(); m; m = m->next() )
if( m->id() == id )
return m;
return 0;
}
void ReplSetImpl::_summarizeStatus(BSONObjBuilder& b) const {
Member *m =_members.head();
vector