Files
mongo/db/commands.cpp

69 lines
1.9 KiB
C++
Raw Normal View History

2008-09-08 20:37:59 -04:00
/* commands.cpp
db "commands" (sent via db.$cmd.findOne(...))
*/
/**
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "stdafx.h"
#include "jsobj.h"
#include "commands.h"
2008-09-08 20:37:59 -04:00
2008-10-22 16:56:39 -04:00
map<string,Command*> *commands;
Command::Command(const char *_name) : name(_name) {
// register ourself.
if( commands == 0 )
commands = new map<string,Command*>;
(*commands)[name] = this;
}
2008-10-22 16:56:39 -04:00
bool runCommandAgainstRegistered(const char *ns, BSONObj& jsobj, BSONObjBuilder& anObjBuilder) {
2008-09-08 20:37:59 -04:00
const char *p = strchr(ns, '.');
if( !p ) return false;
if( strcmp(p, ".$cmd") != 0 ) return false;
bool ok = false;
bool valid = false;
2008-10-21 16:13:48 -04:00
BSONElement e;
2008-09-08 20:37:59 -04:00
e = jsobj.firstElement();
map<string,Command*>::iterator i;
if( e.eoo() )
;
/* check for properly registered command objects. Note that all the commands below should be
migrated over to the command object format.
*/
else if( (i = commands->find(e.fieldName())) != commands->end() ) {
valid = true;
string errmsg;
Command *c = i->second;
if( c->adminOnly() && strncmp(ns, "admin", p-ns) != 0 ) {
ok = false;
errmsg = "access denied";
}
else {
ok = c->run(ns, jsobj, errmsg, anObjBuilder, false);
}
if( !ok )
anObjBuilder.append("errmsg", errmsg);
2008-10-22 16:56:39 -04:00
return true;
}
2008-10-22 16:56:39 -04:00
return false;
2008-11-17 15:39:03 -05:00
}