/* dbgrid/request.cpp Top level handling of requests (operations such as query, insert, ...) */ /** * Copyright (C) 2008 10gen Inc. * * 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 . */ #include "stdafx.h" #include "server.h" #include "../db/commands.h" #include "../db/dbmessage.h" #include "../client/connpool.h" #include "request.h" #include "config.h" #include "shard.h" namespace mongo { Request::Request( Message& m, MessagingPort& p ) : _m(m) , _d( m ) , _p(p){ assert( _d.getns() ); _id = _m.data->id; _config = grid.getDBConfig( getns() ); if ( _config->sharded( getns() ) ){ _shardInfo = _config->getShardManager( getns() ); uassert( (string)"no shard info for: " + getns() , _shardInfo ); } else { _shardInfo = 0; } } string Request::singleServerName(){ if ( _shardInfo ){ if ( _shardInfo->numShards() > 1 ) throw UserException( "can't call singleServerName on a sharded collection" ); return _shardInfo->findShard( _shardInfo->getShardKey().globalMin() ).getServer(); } string s = _config->getServer( getns() ); uassert( "can't call singleServerName on a sharded collection!" , s.size() > 0 ); return s; } void Request::process(){ int op = _m.data->operation(); assert( op > dbMsg ); Strategy * s = SINGLE; if ( getConfig()->isPartitioned() && op == dbQuery ){ // there are a few things we need to check here // 1. db.eval // TODO: right now i'm just going to block all // will need to make it look at function later // 2. $where - can't access DB // TODO: make it smarter QueryMessage q( _d ); BSONObj query = q.query; if ( q.ntoreturn == 1 && strstr( q.ns , ".$cmd" ) && strcmp( "$eval" , query.firstElement().fieldName() ) ){ log() << "trying to eval: " << q.query << endl; throw UserException( "eval not supported on partitioned databases yet" ); } if ( query.hasField( "$where" ) ) throw UserException( "$where not supported for partitioned databases yet" ); _d.resetPull(); } if ( _shardInfo ){ if ( _shardInfo->numShards() > 1 ) s = SHARDED; } if ( op == dbQuery ) { s->queryOp( *this ); } else if ( op == dbGetMore ) { s->getMore( *this ); } else { s->writeOp( op, *this ); } } } // namespace mongo