summaryrefslogtreecommitdiff
path: root/db/client.cpp
diff options
context:
space:
mode:
authorAntonin Kral <a.kral@bobek.cz>2010-01-31 08:32:52 +0100
committerAntonin Kral <a.kral@bobek.cz>2010-01-31 08:32:52 +0100
commit4eefaf421bfeddf040d96a3dafb12e09673423d7 (patch)
treecb2e5ccc7f98158894f977ff131949da36673591 /db/client.cpp
downloadmongodb-4eefaf421bfeddf040d96a3dafb12e09673423d7.tar.gz
Imported Upstream version 1.3.1
Diffstat (limited to 'db/client.cpp')
-rw-r--r--db/client.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/db/client.cpp b/db/client.cpp
new file mode 100644
index 0000000..68a0c9e
--- /dev/null
+++ b/db/client.cpp
@@ -0,0 +1,99 @@
+// client.cpp
+
+/**
+* Copyright (C) 2009 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 <http://www.gnu.org/licenses/>.
+*/
+
+/* Client represents a connection to the database (the server-side) and corresponds
+ to an open socket (or logical connection if pooling on sockets) from a client.
+*/
+
+#include "stdafx.h"
+#include "db.h"
+#include "client.h"
+#include "curop.h"
+#include "json.h"
+
+namespace mongo {
+
+ boost::mutex Client::clientsMutex;
+ set<Client*> Client::clients; // always be in clientsMutex when manipulating this
+ boost::thread_specific_ptr<Client> currentClient;
+
+ Client::Client(const char *desc) :
+ _curOp(new CurOp()),
+ _database(0), _ns("")/*, _nsstr("")*/
+ ,_shutdown(false),
+ _desc(desc),
+ _god(0)
+ {
+ ai = new AuthenticationInfo();
+ boostlock bl(clientsMutex);
+ clients.insert(this);
+ }
+
+ Client::~Client() {
+ delete _curOp;
+ delete ai;
+ ai = 0;
+ _god = 0;
+ if ( !_shutdown ) {
+ cout << "ERROR: Client::shutdown not called!" << endl;
+ }
+ }
+
+ bool Client::shutdown(){
+ _shutdown = true;
+
+ {
+ boostlock bl(clientsMutex);
+ clients.erase(this);
+ }
+
+ bool didAnything = false;
+
+ if ( _tempCollections.size() ){
+ didAnything = true;
+ for ( list<string>::iterator i = _tempCollections.begin(); i!=_tempCollections.end(); i++ ){
+ string ns = *i;
+ dblock l;
+ setClient( ns.c_str() );
+ if ( ! nsdetails( ns.c_str() ) )
+ continue;
+ try {
+ string err;
+ BSONObjBuilder b;
+ dropCollection( ns , err , b );
+ }
+ catch ( ... ){
+ log() << "error dropping temp collection: " << ns << endl;
+ }
+ }
+ _tempCollections.clear();
+ }
+
+ return didAnything;
+ }
+
+ BSONObj CurOp::_tooBig = fromjson("{\"$msg\":\"query not recording (too large)\"}");
+ WrappingInt CurOp::_nextOpNum;
+
+ Client::Context::Context( string ns , Database * db )
+ : _client( currentClient.get() ) {
+ assert( db && db->isOk() );
+ _client->setns( ns.c_str() , db );
+ }
+
+}