cursor = db.query(ns.c_str(), query, num, skip);
uassert(13085, "query failed for dbwebserver", cursor.get());
if (one) {
if (cursor->more()) {
BSONObj obj = cursor->next();
out << obj.jsonString(Strict, html ? 1 : 0) << '\n';
} else {
responseCode = 404;
}
return html != 0;
}
if (html) {
string title = string("query ") + ns;
out << start(title) << p(title) << "";
} else {
out << "{\n";
out << " \"offset\" : " << skip << ",\n";
out << " \"rows\": [\n";
}
int howMany = 0;
while (cursor->more()) {
if (howMany++ && html == 0)
out << " ,\n";
BSONObj obj = cursor->next();
if (html) {
if (out.tellp() > 4 * 1024 * 1024) {
out << "Stopping output: more than 4MB returned and in html mode\n";
break;
}
out << obj.jsonString(Strict, html ? 1 : 0) << "\n\n";
} else {
if (out.tellp() > 50 * 1024 * 1024) // 50MB limit - we are using ram
break;
out << " " << obj.jsonString();
}
}
if (html) {
out << "
\n";
if (howMany == 0)
out << p("Collection is empty");
out << _end();
} else {
out << "\n ],\n\n";
out << " \"total_rows\" : " << howMany << " ,\n";
out << " \"query\" : " << query.jsonString() << " ,\n";
out << " \"millis\" : " << t.millis() << '\n';
out << "}\n";
}
return html != 0;
}
// TODO Generate id and revision per couch POST spec
void handlePost(OperationContext* opCtx,
const std::string& ns,
const char* body,
BSONObj& params,
int& responseCode,
stringstream& out) {
try {
BSONObj obj = fromjson(body);
DBDirectClient db(opCtx);
db.insert(ns.c_str(), obj);
} catch (...) {
responseCode = 400; // Bad Request. Seems reasonable for now.
out << "{ \"ok\" : false }";
return;
}
responseCode = 201;
out << "{ \"ok\" : true }";
}
int _getOption(BSONElement e, int def) {
if (e.isNumber())
return e.numberInt();
if (e.type() == String)
return atoi(e.valuestr());
return def;
}
} restHandler;
bool RestAdminAccess::haveAdminUsers(OperationContext* opCtx) const {
AuthorizationSession* authzSession = AuthorizationSession::get(opCtx->getClient());
return authzSession->getAuthorizationManager().hasAnyPrivilegeDocuments(opCtx);
}
class LowLevelMongodStatus : public WebStatusPlugin {
public:
LowLevelMongodStatus()
: WebStatusPlugin("overview", 5, "(only reported if can acquire read lock quickly)") {}
virtual void init() {}
void _gotLock(int millis, stringstream& ss) {
const repl::ReplSettings& replSettings =
repl::getGlobalReplicationCoordinator()->getSettings();
ss << "\n";
ss << "time to get readlock: " << millis << "ms\n";
ss << "# Cursors: " << ClientCursor::totalOpen() << '\n';
ss << "replication: ";
if (*repl::replInfo)
ss << "\nreplInfo: " << repl::replInfo << "\n\n";
if (repl::getGlobalReplicationCoordinator()->getReplicationMode() ==
repl::ReplicationCoordinator::modeReplSet) {
ss << a("", "see replSetGetStatus link top of page") << "--replSet "
<< replSettings.getReplSetString();
}
// TODO(dannenberg) replAllDead is bad and should be removed when masterslave is removed
if (repl::replAllDead)
ss << "\nreplication replAllDead=" << repl::replAllDead << "\n";
else {
ss << "\nmaster: " << replSettings.isMaster() << '\n';
ss << "slave: " << replSettings.isSlave() << '\n';
ss << '\n';
}
BackgroundOperation::dump(ss);
ss << "
\n";
}
virtual void run(OperationContext* opCtx, stringstream& ss) {
Timer t;
Lock::GlobalLock globalSLock(opCtx, MODE_S, 300);
if (globalSLock.isLocked()) {
_gotLock(t.millis(), ss);
} else {
ss << "\ntimed out getting lock\n";
}
}
} lowLevelMongodStatus;
}