diff options
Diffstat (limited to 'src/mongo/db/commands/clone.cpp')
-rw-r--r-- | src/mongo/db/commands/clone.cpp | 151 |
1 files changed, 76 insertions, 75 deletions
diff --git a/src/mongo/db/commands/clone.cpp b/src/mongo/db/commands/clone.cpp index f2fd0d8928f..0e6c7fbf1e7 100644 --- a/src/mongo/db/commands/clone.cpp +++ b/src/mongo/db/commands/clone.cpp @@ -39,97 +39,98 @@ namespace { - using namespace mongo; - - using std::set; - using std::string; - using std::stringstream; - - /* Usage: - mydb.$cmd.findOne( { clone: "fromhost" } ); - Note: doesn't work with authentication enabled, except as internal operation or for - old-style users for backwards compatibility. - */ - class CmdClone : public Command { - public: - CmdClone() : Command("clone") { } - - virtual bool slaveOk() const { - return false; - } +using namespace mongo; - virtual bool isWriteCommandForConfigServer() const { return true; } +using std::set; +using std::string; +using std::stringstream; - virtual void help( stringstream &help ) const { - help << "clone this database from an instance of the db on another host\n"; - help << "{clone: \"host13\"[, slaveOk: <bool>]}"; +/* Usage: + mydb.$cmd.findOne( { clone: "fromhost" } ); + Note: doesn't work with authentication enabled, except as internal operation or for + old-style users for backwards compatibility. +*/ +class CmdClone : public Command { +public: + CmdClone() : Command("clone") {} + + virtual bool slaveOk() const { + return false; + } + + virtual bool isWriteCommandForConfigServer() const { + return true; + } + + virtual void help(stringstream& help) const { + help << "clone this database from an instance of the db on another host\n"; + help << "{clone: \"host13\"[, slaveOk: <bool>]}"; + } + + virtual Status checkAuthForCommand(ClientBasic* client, + const std::string& dbname, + const BSONObj& cmdObj) { + ActionSet actions; + actions.addAction(ActionType::insert); + actions.addAction(ActionType::createIndex); + if (shouldBypassDocumentValidationForCommand(cmdObj)) { + actions.addAction(ActionType::bypassDocumentValidation); } - virtual Status checkAuthForCommand(ClientBasic* client, - const std::string& dbname, - const BSONObj& cmdObj) { - ActionSet actions; - actions.addAction(ActionType::insert); - actions.addAction(ActionType::createIndex); - if (shouldBypassDocumentValidationForCommand(cmdObj)) { - actions.addAction(ActionType::bypassDocumentValidation); - } - - if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( - ResourcePattern::forDatabaseName(dbname), actions)) { - return Status(ErrorCodes::Unauthorized, "Unauthorized"); - } - return Status::OK(); + if (!AuthorizationSession::get(client)->isAuthorizedForActionsOnResource( + ResourcePattern::forDatabaseName(dbname), actions)) { + return Status(ErrorCodes::Unauthorized, "Unauthorized"); + } + return Status::OK(); + } + + virtual bool run(OperationContext* txn, + const string& dbname, + BSONObj& cmdObj, + int, + string& errmsg, + BSONObjBuilder& result) { + boost::optional<DisableDocumentValidation> maybeDisableValidation; + if (shouldBypassDocumentValidationForCommand(cmdObj)) { + maybeDisableValidation.emplace(txn); } - virtual bool run(OperationContext* txn, - const string& dbname, - BSONObj& cmdObj, - int, - string& errmsg, - BSONObjBuilder& result) { - - boost::optional<DisableDocumentValidation> maybeDisableValidation; - if (shouldBypassDocumentValidationForCommand(cmdObj)) { - maybeDisableValidation.emplace(txn); - } - - string from = cmdObj.getStringField("clone"); - if ( from.empty() ) - return false; + string from = cmdObj.getStringField("clone"); + if (from.empty()) + return false; - CloneOptions opts; - opts.fromDB = dbname; - opts.slaveOk = cmdObj["slaveOk"].trueValue(); + CloneOptions opts; + opts.fromDB = dbname; + opts.slaveOk = cmdObj["slaveOk"].trueValue(); - // See if there's any collections we should ignore - if( cmdObj["collsToIgnore"].type() == Array ){ - BSONObjIterator it( cmdObj["collsToIgnore"].Obj() ); + // See if there's any collections we should ignore + if (cmdObj["collsToIgnore"].type() == Array) { + BSONObjIterator it(cmdObj["collsToIgnore"].Obj()); - while( it.more() ){ - BSONElement e = it.next(); - if( e.type() == String ){ - opts.collsToIgnore.insert( e.String() ); - } + while (it.more()) { + BSONElement e = it.next(); + if (e.type() == String) { + opts.collsToIgnore.insert(e.String()); } } + } - set<string> clonedColls; + set<string> clonedColls; - ScopedTransaction transaction(txn, MODE_IX); - Lock::DBLock dbXLock(txn->lockState(), dbname, MODE_X); + ScopedTransaction transaction(txn, MODE_IX); + Lock::DBLock dbXLock(txn->lockState(), dbname, MODE_X); - Cloner cloner; - Status status = cloner.copyDb(txn, dbname, from, opts, &clonedColls); + Cloner cloner; + Status status = cloner.copyDb(txn, dbname, from, opts, &clonedColls); - BSONArrayBuilder barr; - barr.append( clonedColls ); + BSONArrayBuilder barr; + barr.append(clonedColls); - result.append("clonedColls", barr.arr()); + result.append("clonedColls", barr.arr()); - return appendCommandStatus(result, status); - } + return appendCommandStatus(result, status); + } - } cmdClone; +} cmdClone; -} // namespace +} // namespace |