summaryrefslogtreecommitdiff
path: root/src/mongo/db/commands/clone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/commands/clone.cpp')
-rw-r--r--src/mongo/db/commands/clone.cpp151
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