diff options
author | Eliot Horowitz <eliot@10gen.com> | 2011-12-24 15:33:26 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2011-12-24 15:33:45 -0500 |
commit | ae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba (patch) | |
tree | 92f8e1649e6f080b251ff5f1763679a72eb59b34 /src/mongo/s/s_only.cpp | |
parent | dfa4cd7e2cf109b072440155fabc08a93c8045a0 (diff) | |
download | mongo-ae1ecd9c786911f9f1f0242f0f7d702b3e5dfeba.tar.gz |
bulk move of code to src/ SERVER-4551
Diffstat (limited to 'src/mongo/s/s_only.cpp')
-rw-r--r-- | src/mongo/s/s_only.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/mongo/s/s_only.cpp b/src/mongo/s/s_only.cpp new file mode 100644 index 00000000000..05e652db57e --- /dev/null +++ b/src/mongo/s/s_only.cpp @@ -0,0 +1,111 @@ +// s_only.cpp + +/* Copyright 2009 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "pch.h" +#include "request.h" +#include "client.h" +#include "../client/dbclient.h" +#include "../db/dbhelpers.h" +#include "../db/matcher.h" +#include "../db/commands.h" + +/* + most a pile of hacks to make linking nicer + + */ +namespace mongo { + + TSP_DEFINE(Client,currentClient) + + Client::LockStatus::LockStatus() { + // why is mongo::Client used in mongos? that is very weird. + // commenting this out until that is cleaned up or until someone puts a comment here + // explaining why it does make sense. + ////dassert(false); + } + + Client::Client(const char *desc , AbstractMessagingPort *p) : + _context(0), + _shutdown(false), + _desc(desc), + _god(0), + _lastOp(0), + _mp(p) { + } + Client::~Client() {} + bool Client::shutdown() { return true; } + + static unsigned long long nThreads = 0; + void assertStartingUp() { + dassert( nThreads <= 1 ); + } + Client& Client::initThread(const char *desc, AbstractMessagingPort *mp) { + DEV nThreads++; // never decremented. this is for casi class asserts + setThreadName(desc); + assert( currentClient.get() == 0 ); + Client *c = new Client(desc, mp); + currentClient.reset(c); + mongo::lastError.initThread(); + return *c; + } + + string Client::clientAddress(bool includePort) const { + ClientInfo * ci = ClientInfo::get(); + if ( ci ) + return ci->getRemote(); + return ""; + } + + bool execCommand( Command * c , + Client& client , int queryOptions , + const char *ns, BSONObj& cmdObj , + BSONObjBuilder& result, + bool fromRepl ) { + assert(c); + + string dbname = nsToDatabase( ns ); + + if ( cmdObj["help"].trueValue() ) { + stringstream ss; + ss << "help for: " << c->name << " "; + c->help( ss ); + result.append( "help" , ss.str() ); + result.append( "lockType" , c->locktype() ); + return true; + } + + if ( c->adminOnly() ) { + if ( dbname != "admin" ) { + result.append( "errmsg" , "access denied- use admin db" ); + log() << "command denied: " << cmdObj.toString() << endl; + return false; + } + log( 2 ) << "command: " << cmdObj << endl; + } + + if (!client.getAuthenticationInfo()->isAuthorized(dbname)) { + result.append("errmsg" , "unauthorized"); + return false; + } + + string errmsg; + int ok = c->run( dbname , cmdObj , queryOptions, errmsg , result , fromRepl ); + if ( ! ok ) + result.append( "errmsg" , errmsg ); + return ok; + } +} |