DBClientBase* DBConnectionPool::get(const string& host) { boostlock L(poolMutex); PoolForHost *&p = pools[host]; if ( p == 0 ) p = new PoolForHost(); if ( p->pool.empty() ) { string errmsg; DBClientBase *c; if( host.find(',') == string::npos ) { DBClientConnection *cc = new DBClientConnection(true); if ( !cc->connect(host.c_str(), errmsg) ) { delete cc; uassert( (string)"dbconnectionpool: connect failed" + host , false); return 0; } c = cc; } else { DBClientPaired *p = new DBClientPaired(); if( !p->connect(host) ) { delete p; uassert( (string)"dbconnectionpool: connect failed [2] " + host , false); return 0; } c = p; } return c; } DBClientBase *c = p->pool.front(); p->pool.pop(); return c; }
// "./db testclient" to invoke void testClient3() { out() << "testClient()" << endl; // DBClientConnection c(true); DBClientPaired c; string err; if ( !c.connect("10.211.55.2", "1.2.3.4") ) { // if( !c.connect("10.211.55.2", err) ) { out() << "testClient: connect() failed" << endl; } else { // temp: out() << "test query returns: " << c.findOne("foo.bar", fromjson("{}")).toString() << endl; } again: out() << "query foo.bar..." << endl; auto_ptr<DBClientCursor> cursor = c.query("foo.bar", BSONObj(), 0, 0, 0, Option_CursorTailable); DBClientCursor *cc = cursor.get(); if ( cc == 0 ) { out() << "query() returned 0, sleeping 10 secs" << endl; sleepsecs(10); goto again; } while ( 1 ) { bool m; try { m = cc->more(); } catch (AssertionException&) { out() << "more() asserted, sleeping 10 sec" << endl; goto again; } out() << "more: " << m << " dead:" << cc->isDead() << endl; if ( !m ) { if ( cc->isDead() ) out() << "cursor dead, stopping" << endl; else { out() << "Sleeping 10 seconds" << endl; sleepsecs(10); continue; } break; } out() << cc->next().toString() << endl; } }
void testPaired() { DBClientPaired p; log() << "connect returns " << p.connect("localhost:27017", "localhost:27018") << endl; //DBClientConnection p(true); string errmsg; // log() << "connect " << p.connect("localhost", errmsg) << endl; log() << "auth " << p.auth("dwight", "u", "p", errmsg) << endl; while( 1 ) { sleepsecs(3); try { log() << "findone returns " << p.findOne("dwight.foo", BSONObj()).toString() << endl; sleepsecs(3); BSONObj info; bool im; log() << "ismaster returns " << p.isMaster(im,&info) << " info: " << info.toString() << endl; } catch(...) { cout << "caught exception" << endl; } } }
int Tool::main( int argc , char ** argv ){ static StaticObserver staticObserver; cmdLine.prealloc = false; boost::filesystem::path::default_name_check( boost::filesystem::no_check ); _name = argv[0]; /* using the same style as db.cpp */ int command_line_style = (((po::command_line_style::unix_style ^ po::command_line_style::allow_guessing) | po::command_line_style::allow_long_disguise) ^ po::command_line_style::allow_sticky); try { po::options_description all_options("all options"); all_options.add(*_options).add(*_hidden_options); po::store( po::command_line_parser( argc , argv ). options(all_options). positional( _positonalOptions ). style(command_line_style).run() , _params ); po::notify( _params ); } catch (po::error &e) { cerr << "ERROR: " << e.what() << endl << endl; printHelp(cerr); return EXIT_BADOPTIONS; } // hide password from ps output for (int i=0; i < (argc-1); ++i){ if (!strcmp(argv[i], "-p") || !strcmp(argv[i], "--password")){ char* arg = argv[i+1]; while (*arg){ *arg++ = 'x'; } } } if ( _params.count( "help" ) ){ printHelp(cout); return 0; } if ( _params.count( "verbose" ) ) { logLevel = 1; } for (string s = "vv"; s.length() <= 10; s.append("v")) { if (_params.count(s)) { logLevel = s.length(); } } preSetup(); bool useDirectClient = hasParam( "dbpath" ); if ( ! useDirectClient ) { _host = "127.0.0.1"; if ( _params.count( "host" ) ) _host = _params["host"].as<string>(); if ( _params.count( "port" ) ) _host += ':' + _params["port"].as<string>(); if ( _noconnection ){ // do nothing } else if ( _host.find( "," ) == string::npos ){ DBClientConnection * c = new DBClientConnection( _autoreconnect ); _conn = c; string errmsg; if ( ! c->connect( _host , errmsg ) ){ cerr << "couldn't connect to [" << _host << "] " << errmsg << endl; return -1; } } else { log(1) << "using pairing" << endl; DBClientPaired * c = new DBClientPaired(); _paired = true; _conn = c; if ( ! c->connect( _host ) ){ cerr << "couldn't connect to paired server: " << _host << endl; return -1; } } (_usesstdout ? cout : cerr ) << "connected to: " << _host << endl; } else { if ( _params.count( "directoryperdb" ) ) { directoryperdb = true; } assert( lastError.get( true ) ); Client::initThread("tools"); _conn = new DBDirectClient(); _host = "DIRECT"; static string myDbpath = getParam( "dbpath" ); dbpath = myDbpath.c_str(); try { acquirePathLock(); } catch ( DBException& e ){ cerr << endl << "If you are running a mongod on the same " "path you should connect to that instead of direct data " "file access" << endl << endl; dbexit( EXIT_CLEAN ); return -1; } theFileAllocator().start(); } if ( _params.count( "db" ) ) _db = _params["db"].as<string>(); if ( _params.count( "collection" ) ) _coll = _params["collection"].as<string>(); if ( _params.count( "username" ) ) _username = _params["username"].as<string>(); if ( _params.count( "password" ) && ( _password.empty() ) ) { _password = askPassword(); } if (_params.count("ipv6")) enableIPv6(); int ret = -1; try { ret = run(); } catch ( DBException& e ){ cerr << "assertion: " << e.toString() << endl; ret = -1; } if ( currentClient.get() ) currentClient->shutdown(); if ( useDirectClient ) dbexit( EXIT_CLEAN ); return ret; }
int mongo::Tool::main( int argc , char ** argv ){ boost::filesystem::path::default_name_check( boost::filesystem::no_check ); _name = argv[0]; /* using the same style as db.cpp */ int command_line_style = (((po::command_line_style::unix_style ^ po::command_line_style::allow_guessing) | po::command_line_style::allow_long_disguise) ^ po::command_line_style::allow_sticky); try { po::options_description all_options("all options"); all_options.add(*_options).add(*_hidden_options); po::store( po::command_line_parser( argc , argv ). options(all_options). positional( _positonalOptions ). style(command_line_style).run() , _params ); po::notify( _params ); } catch (po::error &e) { cerr << "ERROR: " << e.what() << endl << endl; printHelp(cerr); return EXIT_BADOPTIONS; } if ( _params.count( "help" ) ){ printHelp(cerr); return 0; } if ( _params.count( "verbose" ) ) { logLevel = 1; } for (string s = "vv"; s.length() <= 10; s.append("v")) { if (_params.count(s)) { logLevel = s.length(); } } if ( ! hasParam( "dbpath" ) ) { _host = "127.0.0.1"; if ( _params.count( "host" ) ) _host = _params["host"].as<string>(); if ( _host.find( "," ) == string::npos ){ DBClientConnection * c = new DBClientConnection(); _conn = c; string errmsg; if ( ! c->connect( _host , errmsg ) ){ cerr << "couldn't connect to [" << _host << "] " << errmsg << endl; return -1; } } else { log(1) << "using pairing" << endl; DBClientPaired * c = new DBClientPaired(); _paired = true; _conn = c; if ( ! c->connect( _host ) ){ cerr << "couldn't connect to paired server: " << _host << endl; return -1; } } cerr << "connected to: " << _host << endl; } else { Client::initThread("tools"); _conn = new DBDirectClient(); _host = "DIRECT"; static string myDbpath = getParam( "dbpath" ); mongo::dbpath = myDbpath.c_str(); mongo::acquirePathLock(); theFileAllocator().start(); } if ( _params.count( "db" ) ) _db = _params["db"].as<string>(); if ( _params.count( "collection" ) ) _coll = _params["collection"].as<string>(); if ( _params.count( "username" ) ) _username = _params["username"].as<string>(); if ( _params.count( "password" ) ) _password = _params["password"].as<string>(); int ret = -1; try { ret = run(); } catch ( DBException& e ){ cerr << "assertion: " << e.toString() << endl; ret = -1; } if ( currentClient.get() ) currentClient->shutdown(); return ret; }