summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-05-20 14:51:25 -0400
committerEliot Horowitz <eliot@10gen.com>2009-05-20 14:51:25 -0400
commitafafd6aee9b08c8155042ef054a7133bad8b3ff9 (patch)
treea636dea48fbab655e22d710f3399d9cac436085b
parentce515d5e45cee514088e4ebfd44e7bc87d713f85 (diff)
parentc5ffd65fb28fb6b201bb6027cb0ef0b52fefcf8c (diff)
downloadmongo-afafd6aee9b08c8155042ef054a7133bad8b3ff9.tar.gz
Merge branch 'master' of git@github.com:mongodb/mongo
-rw-r--r--SConstruct5
-rw-r--r--db/db.cpp9
-rw-r--r--db/instance.cpp9
-rw-r--r--db/instance.h3
-rw-r--r--db/matcher.cpp5
-rw-r--r--dbtests/dbtests.cpp7
-rw-r--r--dbtests/querytests.cpp17
-rw-r--r--jstests/repl/repl6.js4
-rw-r--r--jstests/tool/tool1.js53
-rw-r--r--mongo.xcodeproj/project.pbxproj10
-rw-r--r--shell/utils.cpp6
-rw-r--r--tools/Tool.cpp43
-rw-r--r--tools/Tool.h9
-rw-r--r--tools/bridge.cpp36
-rw-r--r--tools/dump.cpp7
-rw-r--r--tools/export.cpp26
-rw-r--r--tools/files.cpp2
-rw-r--r--tools/importJSON.cpp8
-rw-r--r--tools/restore.cpp8
19 files changed, 196 insertions, 71 deletions
diff --git a/SConstruct b/SConstruct
index 28d87ffd2b5..3b6dd6dae61 100644
--- a/SConstruct
+++ b/SConstruct
@@ -663,7 +663,7 @@ mongod = env.Program( "mongod" , commonFiles + coreDbFiles + serverOnlyFiles + [
Default( mongod )
# tools
-allToolFiles = allClientFiles + [ "tools/Tool.cpp" ]
+allToolFiles = commonFiles + coreDbFiles + serverOnlyFiles + [ "client/gridfs.cpp", "tools/Tool.cpp" ]
env.Program( "mongodump" , allToolFiles + [ "tools/dump.cpp" ] )
env.Program( "mongorestore" , allToolFiles + [ "tools/restore.cpp" ] )
@@ -828,6 +828,7 @@ if not onlyServer and not noshell:
addSmoketest( "smokeSharding", [ "mongo", "mongod", "mongos" ], [ jsDirTestSpec( "sharding" ) ] )
addSmoketest( "smokeJsPerf", [ "mongo" ], [ mongo[0].abspath + " " + jsSpec( [ "perf", "*.js" ] ) ] )
addSmoketest( "smokeQuota", [ "mongo" ], runShellTest )
+ addSmoketest( "smokeTool", [ "mongo" ], [ jsDirTestSpec( "tool" ) ] )
mongodForTests = None
mongodForTestsPort = "27017"
@@ -881,7 +882,7 @@ def addMongodReqTargets( env, target, source ):
testEnv.Alias( "addMongodReqTargets", [], [addMongodReqTargets] )
testEnv.AlwaysBuild( "addMongodReqTargets" )
-testEnv.Alias( "smokeAll", [ "smoke", "mongosTest", "smokeClone", "smokeRepl", "addMongodReqTargets", "smokeDisk", "smokeSharding" ] )
+testEnv.Alias( "smokeAll", [ "smoke", "mongosTest", "smokeClone", "smokeRepl", "addMongodReqTargets", "smokeDisk", "smokeSharding", "smokeTool" ] )
testEnv.AlwaysBuild( "smokeAll" )
def addMongodReqNoJsTargets( env, target, source ):
diff --git a/db/db.cpp b/db/db.cpp
index 3d51a465993..58c7896afa5 100644
--- a/db/db.cpp
+++ b/db/db.cpp
@@ -328,15 +328,6 @@ namespace mongo {
Timer startupSrandTimer;
- void acquirePathLock() {
-#if !defined(_WIN32) && !defined(__sunos__)
- string name = ( boost::filesystem::path( dbpath ) / "mongod.lock" ).native_file_string();
- lockFile = open( name.c_str(), O_RDONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO );
- massert( "Unable to create / open lock file for dbpath: " + name, lockFile > 0 );
- massert( "Unable to acquire lock for dbpath: " + name, flock( lockFile, LOCK_EX | LOCK_NB ) == 0 );
-#endif
- }
-
void _initAndListen(int listenPort, const char *appserverLoc = null) {
#if !defined(_WIN32)
diff --git a/db/instance.cpp b/db/instance.cpp
index 8f7141f5d5d..b3ac8e06150 100644
--- a/db/instance.cpp
+++ b/db/instance.cpp
@@ -698,4 +698,13 @@ namespace mongo {
::exit(rc);
}
+ void acquirePathLock() {
+#if !defined(_WIN32) && !defined(__sunos__)
+ string name = ( boost::filesystem::path( dbpath ) / "mongod.lock" ).native_file_string();
+ lockFile = open( name.c_str(), O_RDONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO );
+ massert( "Unable to create / open lock file for dbpath: " + name, lockFile > 0 );
+ massert( "Unable to acquire lock for dbpath: " + name, flock( lockFile, LOCK_EX | LOCK_NB ) == 0 );
+#endif
+ }
+
} // namespace mongo
diff --git a/db/instance.h b/db/instance.h
index b8920011f6a..75211dfb90f 100644
--- a/db/instance.h
+++ b/db/instance.h
@@ -144,5 +144,8 @@ namespace mongo {
string oldName_;
};
};
+
+ extern int lockFile;
+ void acquirePathLock();
} // namespace mongo
diff --git a/db/matcher.cpp b/db/matcher.cpp
index 3c70fb0f76e..4a4175e62a6 100644
--- a/db/matcher.cpp
+++ b/db/matcher.cpp
@@ -386,6 +386,7 @@ namespace mongo {
compareOp - Equality, LT, GT, etc.
deep - out param. set to true/false if we scanned an array
isArr -
+ nextArr - true if an array has already been found
Special forms:
@@ -424,7 +425,7 @@ namespace mongo {
BSONElement z = ai.next();
if ( z.type() == Object ) {
BSONObj eo = z.embeddedObject();
- int cmp = matchesDotted(fieldName, toMatch, eo, compareOp, deep, false, nextArr);
+ int cmp = matchesDotted(fieldName, toMatch, eo, compareOp, deep, false, true);
if ( cmp > 0 ) {
if ( deep ) *deep = true;
return 1;
@@ -446,7 +447,7 @@ namespace mongo {
return -1;
BSONObj eo = se.embeddedObject();
- return matchesDotted(p+1, toMatch, eo, compareOp, deep, se.type() == Array, true);
+ return matchesDotted(p+1, toMatch, eo, compareOp, deep, se.type() == Array, nextArr);
} else {
e = obj.getField(fieldName);
}
diff --git a/dbtests/dbtests.cpp b/dbtests/dbtests.cpp
index f22d5ec563a..c9e2b596694 100644
--- a/dbtests/dbtests.cpp
+++ b/dbtests/dbtests.cpp
@@ -89,12 +89,7 @@ int main( int argc, char** argv ) {
dbpathSpec += "/";
dbpath = dbpathSpec.c_str();
-#if !defined(_WIN32) && !defined(__sunos__)
- string name = ( boost::filesystem::path( dbpath ) / "mongod.lock" ).native_file_string();
- int lockFile = open( name.c_str(), O_RDONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO );
- massert( "Unable to create / open lock file for dbpath: " + name, lockFile > 0 );
- massert( "Unable to acquire lock for dbpath: " + name, flock( lockFile, LOCK_EX | LOCK_NB ) == 0 );
-#endif
+ acquirePathLock();
srand( seed );
printGitVersion();
diff --git a/dbtests/querytests.cpp b/dbtests/querytests.cpp
index 46b3d56a363..1e13193bef9 100644
--- a/dbtests/querytests.cpp
+++ b/dbtests/querytests.cpp
@@ -623,6 +623,22 @@ namespace QueryTests {
ASSERT_EQUALS( 1U, client().count( ns, fromjson( "{i:{$in:['a']}}" ) ) );
}
};
+
+ class EmbeddedArray : public ClientBase {
+ public:
+ ~EmbeddedArray() {
+ client().dropCollection( "unittests.querytests.EmbeddedArray" );
+ }
+ void run() {
+ const char *ns = "unittests.querytests.EmbeddedArray";
+ client().insert( ns, fromjson( "{foo:{bar:['spam']}}" ) );
+ client().insert( ns, fromjson( "{foo:{bar:['spam','eggs']}}" ) );
+ client().insert( ns, fromjson( "{bar:['spam']}" ) );
+ client().insert( ns, fromjson( "{bar:['spam','eggs']}" ) );
+ ASSERT_EQUALS( 2U, client().count( ns, BSON( "bar" << "spam" ) ) );
+ ASSERT_EQUALS( 2U, client().count( ns, BSON( "foo.bar" << "spam" ) ) );
+ }
+ };
class All : public Suite {
public:
@@ -657,6 +673,7 @@ namespace QueryTests {
add< MinMax >();
add< DirectLocking >();
add< FastCountIn >();
+ add< EmbeddedArray >();
}
};
diff --git a/jstests/repl/repl6.js b/jstests/repl/repl6.js
index 5c9c0db6de5..8447d698d92 100644
--- a/jstests/repl/repl6.js
+++ b/jstests/repl/repl6.js
@@ -4,10 +4,8 @@ var baseName = "jstests_repl6test";
soonCount = function( m, count ) {
assert.soon( function() {
- // print( "check count" );
- // print( "count: " + s.getDB( baseName ).z.find().count() );
return m.getDB( baseName ).a.find().count() == count;
- } );
+ }, "expected count: " + count + " from : " + m );
}
doTest = function( signal ) {
diff --git a/jstests/tool/tool1.js b/jstests/tool/tool1.js
new file mode 100644
index 00000000000..7a9a7c6970f
--- /dev/null
+++ b/jstests/tool/tool1.js
@@ -0,0 +1,53 @@
+// mongo tool tests, very basic to start with
+
+baseName = "jstests_tool_tool1";
+dbPath = "/data/db/" + baseName + "/";
+externalPath = "/data/db/" + baseName + "_external/"
+externalFile = externalPath + "export.json"
+
+port = allocatePorts( 1 )[ 0 ];
+resetDbpath( externalPath );
+
+m = startMongod( "--port", port, "--dbpath", dbPath, "--nohttpinterface" );
+c = m.getDB( baseName ).getCollection( baseName );
+c.save( { a: 1 } );
+
+startMongoProgramNoConnect( "mongodump", "--host", "127.0.0.1:" + port, "--out", externalPath );
+sleep( 3000 );
+c.drop();
+startMongoProgramNoConnect( "mongorestore", "--host", "127.0.0.1:" + port, "--dir", externalPath );
+assert.soon( function() { return c.findOne() && 1 == c.findOne().a; } );
+
+resetDbpath( externalPath );
+
+startMongoProgramNoConnect( "mongoexport", "--host", "127.0.0.1:" + port, "-d", baseName, "-c", baseName, "--out", externalFile );
+sleep( 3000 );
+c.drop();
+startMongoProgramNoConnect( "mongoimportjson", "--host", "127.0.0.1:" + port, "-d", baseName, "-c", baseName, "--file", externalFile );
+assert.soon( function() { return c.findOne() && 1 == c.findOne().a; } );
+
+stopMongod( port );
+resetDbpath( externalPath );
+
+startMongoProgramNoConnect( "mongodump", "--dbpath", dbPath, "--out", externalPath );
+sleep( 3000 );
+resetDbpath( dbPath );
+startMongoProgramNoConnect( "mongorestore", "--dbpath", dbPath, "--dir", externalPath );
+sleep( 5000 );
+m = startMongoProgram( "mongod", "--port", port, "--dbpath", dbPath, "--nohttpinterface" );
+c = m.getDB( baseName ).getCollection( baseName );
+assert( c.findOne(), "object missing" );
+assert( 1 == c.findOne().a, "object wrong" );
+
+stopMongod( port );
+resetDbpath( externalPath );
+
+startMongoProgramNoConnect( "mongoexport", "--dbpath", dbPath, "-d", baseName, "-c", baseName, "--out", externalFile );
+sleep( 3000 );
+resetDbpath( dbPath );
+startMongoProgramNoConnect( "mongoimportjson", "--dbpath", dbPath, "-d", baseName, "-c", baseName, "--file", externalFile );
+sleep( 5000 );
+m = startMongoProgram( "mongod", "--port", port, "--dbpath", dbPath, "--nohttpinterface" );
+c = m.getDB( baseName ).getCollection( baseName );
+assert( c.findOne(), "object missing" );
+assert( 1 == c.findOne().a, "object wrong" );
diff --git a/mongo.xcodeproj/project.pbxproj b/mongo.xcodeproj/project.pbxproj
index 3adc984980e..f9128a4073d 100644
--- a/mongo.xcodeproj/project.pbxproj
+++ b/mongo.xcodeproj/project.pbxproj
@@ -54,6 +54,7 @@
933E22110F4327B2000209E3 /* perftest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = perftest.cpp; sourceTree = "<group>"; };
933E22120F4327B2000209E3 /* perftest.o */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.objfile"; path = perftest.o; sourceTree = "<group>"; };
933EF9C70FC3434000C4B294 /* quota1.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = quota1.js; sourceTree = "<group>"; };
+ 9340BBEA0FC4521C00656DE0 /* tool1.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = tool1.js; sourceTree = "<group>"; };
9342232B0EF16D4F00608550 /* connpool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = connpool.cpp; sourceTree = "<group>"; };
9342232C0EF16D4F00608550 /* connpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = connpool.h; sourceTree = "<group>"; };
9342232D0EF16D4F00608550 /* dbclient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dbclient.cpp; sourceTree = "<group>"; };
@@ -378,6 +379,14 @@
path = quota;
sourceTree = "<group>";
};
+ 9340BBE90FC4521C00656DE0 /* tool */ = {
+ isa = PBXGroup;
+ children = (
+ 9340BBEA0FC4521C00656DE0 /* tool1.js */,
+ );
+ path = tool;
+ sourceTree = "<group>";
+ };
9342232A0EF16D4F00608550 /* client */ = {
isa = PBXGroup;
children = (
@@ -588,6 +597,7 @@
93A8D1D10F37544800C92B85 /* jstests */ = {
isa = PBXGroup;
children = (
+ 9340BBE90FC4521C00656DE0 /* tool */,
933EF9C60FC3434000C4B294 /* quota */,
93DB95170FC1D3D50047F950 /* capped4.js */,
93DB94A40FC1BFA30047F950 /* capped3.js */,
diff --git a/shell/utils.cpp b/shell/utils.cpp
index 9483321ff26..9e8a7296b12 100644
--- a/shell/utils.cpp
+++ b/shell/utils.cpp
@@ -124,7 +124,7 @@ namespace mongo {
memset(address.sin_zero, 0, sizeof(address.sin_zero));
address.sin_family = AF_INET;
address.sin_port = 0;
- address.sin_addr.s_addr = 0;
+ address.sin_addr.s_addr = inet_addr( "127.0.0.1" );
assert( 0 == ::bind( s, (sockaddr*)&address, sizeof( address ) ) );
sockaddr_in newAddress;
@@ -136,7 +136,7 @@ namespace mongo {
}
sort( ports.begin(), ports.end() );
- for( int i = 1; i < ports.size(); ++i )
+ for( unsigned i = 1; i < ports.size(); ++i )
massert( "duplicate ports allocated", ports[ i - 1 ] != ports[ i ] );
BSONObjBuilder b;
b.append( "", ports );
@@ -217,7 +217,7 @@ namespace mongo {
}
argv_[ args.nFields() ] = 0;
- if ( program == "mongo" )
+ if ( program != "mongod" && program != "mongos" && program != "mongobridge" )
port_ = 0;
else
assert( port_ > 0 );
diff --git a/tools/Tool.cpp b/tools/Tool.cpp
index 3f273c86417..257653d6342 100644
--- a/tools/Tool.cpp
+++ b/tools/Tool.cpp
@@ -6,13 +6,7 @@
#include <boost/filesystem/operations.hpp>
-namespace mongo {
- DBClientBase *createDirectClient() {
- cout << "no direct client available" << endl;
- assert( false );
- return 0;
- }
-} // namespace mongo
+#include "util/file_allocator.h"
using namespace std;
using namespace mongo;
@@ -20,7 +14,7 @@ using namespace mongo;
namespace po = boost::program_options;
mongo::Tool::Tool( string name , string defaultDB , string defaultCollection ) :
- _name( name ) , _db( defaultDB ) , _coll( defaultCollection ){
+ _name( name ) , _db( defaultDB ) , _coll( defaultCollection ), _useDirect() {
_options = new po::options_description( name + " options" );
_options->add_options()
@@ -28,6 +22,7 @@ mongo::Tool::Tool( string name , string defaultDB , string defaultCollection ) :
("host,h",po::value<string>(), "mongo host to connect to" )
("db,d",po::value<string>(), "database to use" )
("collection,c",po::value<string>(), "collection to use (some commands)" )
+ ("dbpath",po::value<string>(), "directly access mongod data files in this path, instead of connecting to a mongod instance" )
;
}
@@ -53,19 +48,29 @@ int mongo::Tool::main( int argc , char ** argv ){
printExtraHelp( cerr );
return 0;
}
-
- const char * host = "127.0.0.1";
- if ( _params.count( "host" ) )
- host = _params["host"].as<string>().c_str();
-
- string errmsg;
- if ( ! _conn.connect( host , errmsg ) ){
- cerr << "couldn't connect to [" << host << "] " << errmsg << endl;
- return -1;
+
+ if ( !hasParam( "dbpath" ) ) {
+ const char * host = "127.0.0.1";
+ if ( _params.count( "host" ) )
+ host = _params["host"].as<string>().c_str();
+
+ string errmsg;
+ if ( ! _conn.connect( host , errmsg ) ){
+ cerr << "couldn't connect to [" << host << "] " << errmsg << endl;
+ return -1;
+ }
+
+ cerr << "connected to: " << host << endl;
+ } else {
+ _useDirect = true;
+ static string myDbpath = getParam( "dbpath" );
+ mongo::dbpath = myDbpath.c_str();
+ mongo::acquirePathLock();
+#if !defined(_WIN32)
+ theFileAllocator().start();
+#endif
}
- cerr << "connected to: " << host << endl;
-
if ( _params.count( "db" ) )
_db = _params["db"].as<string>();
diff --git a/tools/Tool.h b/tools/Tool.h
index 8f7b2fa76c6..a579ad9afd6 100644
--- a/tools/Tool.h
+++ b/tools/Tool.h
@@ -11,6 +11,7 @@
#endif
#include "client/dbclient.h"
+#include "db/instance.h"
using std::string;
@@ -48,17 +49,21 @@ namespace mongo {
}
virtual int run() = 0;
-
+
virtual void printExtraHelp( ostream & out );
protected:
string _name;
- mongo::DBClientConnection _conn;
string _db;
string _coll;
+ mongo::DBClientBase &conn() { return _useDirect ? (mongo::DBClientBase&)_direct : (mongo::DBClientBase&)_conn; };
+
private:
+ mongo::DBClientConnection _conn;
+ mongo::DBDirectClient _direct;
+ bool _useDirect;
boost::program_options::options_description * _options;
boost::program_options::positional_options_description _positonalOptions;
diff --git a/tools/bridge.cpp b/tools/bridge.cpp
index 3ec9450abb9..f997ffd6c80 100644
--- a/tools/bridge.cpp
+++ b/tools/bridge.cpp
@@ -58,15 +58,42 @@ private:
MessagingPort &mp_;
};
+set<MessagingPort*> ports;
+
class MyListener : public Listener {
public:
MyListener( int port ) : Listener( "", port ) {}
virtual void accepted(MessagingPort *mp) {
+ ports.insert( mp );
Forwarder f( *mp );
boost::thread t( f );
}
};
+auto_ptr< MyListener > listener;
+
+#if !defined(_WIN32)
+#include <execinfo.h>
+void cleanup( int sig ) {
+ close( listener->socket() );
+ for ( set<MessagingPort*>::iterator i = ports.begin(); i != ports.end(); i++ )
+ (*i)->shutdown();
+ ::exit( 0 );
+}
+
+void setupSignals() {
+ signal( SIGINT , cleanup );
+ signal( SIGTERM , cleanup );
+ signal( SIGPIPE , cleanup );
+ signal( SIGABRT , cleanup );
+ signal( SIGSEGV , cleanup );
+ signal( SIGBUS , cleanup );
+ signal( SIGFPE , cleanup );
+}
+#else
+inline void setupSignals() {}
+#endif
+
void helpExit() {
cout << "usage mongobridge --port <port> --dest <destUri>" << endl;
cout << " port: port to listen for mongo messages" << endl;
@@ -80,7 +107,8 @@ void check( bool b ) {
}
int main( int argc, char **argv ) {
-
+ setupSignals();
+
check( argc == 5 );
for( int i = 1; i < 5; ++i ) {
@@ -95,9 +123,9 @@ int main( int argc, char **argv ) {
}
check( port != 0 && !destUri.empty() );
- MyListener l( port );
- l.init();
- l.listen();
+ listener.reset( new MyListener( port ) );
+ listener->init();
+ listener->listen();
return 0;
}
diff --git a/tools/dump.cpp b/tools/dump.cpp
index 26604e15f0e..03bcb2c7b0e 100644
--- a/tools/dump.cpp
+++ b/tools/dump.cpp
@@ -40,7 +40,7 @@ public:
int out = open( outputFile.string().c_str() , O_WRONLY | O_CREAT | O_TRUNC , 0666 );
assert( out );
- auto_ptr<DBClientCursor> cursor = _conn.query( coll.c_str() , BSONObj() , 0 , 0 , 0 , Option_SlaveOk );
+ auto_ptr<DBClientCursor> cursor = conn().query( coll.c_str() , BSONObj() , 0 , 0 , 0 , Option_SlaveOk );
int num = 0;
while ( cursor->more() ) {
@@ -61,7 +61,7 @@ public:
string sns = db + ".system.namespaces";
- auto_ptr<DBClientCursor> cursor = _conn.query( sns.c_str() , BSONObj() , 0 , 0 , 0 , Option_SlaveOk );
+ auto_ptr<DBClientCursor> cursor = conn().query( sns.c_str() , BSONObj() , 0 , 0 , 0 , Option_SlaveOk );
while ( cursor->more() ) {
BSONObj obj = cursor->next();
if ( obj.toString().find( ".$" ) != string::npos )
@@ -84,7 +84,7 @@ public:
if ( db == "*" ){
cout << "all dbs" << endl;
- BSONObj res = _conn.findOne( "admin.$cmd" , BSON( "listDatabases" << 1 ) );
+ BSONObj res = conn().findOne( "admin.$cmd" , BSON( "listDatabases" << 1 ) );
BSONObj dbs = res.getField( "databases" ).embeddedObjectUserCheck();
set<string> keys;
dbs.getFieldNames( keys );
@@ -105,6 +105,7 @@ public:
}
return 0;
}
+
};
int main( int argc , char ** argv ) {
diff --git a/tools/export.cpp b/tools/export.cpp
index 119f0be6d18..49e402d5149 100644
--- a/tools/export.cpp
+++ b/tools/export.cpp
@@ -36,15 +36,21 @@ class Export : public Tool {
public:
Export() : Tool( "export" ){
add_options()
- ("query,q" , po::value<string>() , " query filter" )
- ("fields,f" , po::value<string>() , " comma seperated list of field names e.g. -f=name,age " )
+ ("query,q" , po::value<string>() , "query filter" )
+ ("fields,f" , po::value<string>() , "comma seperated list of field names e.g. -f=name,age " )
("csv","export to csv instead of json")
+ ("out,o", po::value<string>(), "output file; if not specified, stdout is used")
;
}
int run(){
const string ns = getNS();
const bool csv = hasParam( "csv" );
+ ostream *outPtr = &cout;
+ string outfile = getParam( "out" );
+ if ( hasParam( "out" ) )
+ outPtr = new ofstream( outfile.c_str() );
+ ostream &out = *outPtr;
BSONObj * fieldsToReturn = 0;
BSONObj realFieldsToReturn;
@@ -74,15 +80,15 @@ public:
}
- auto_ptr<DBClientCursor> cursor = _conn.query( ns.c_str() , getParam( "query" , "" ) , 0 , 0 , fieldsToReturn , Option_SlaveOk );
+ auto_ptr<DBClientCursor> cursor = conn().query( ns.c_str() , getParam( "query" , "" ) , 0 , 0 , fieldsToReturn , Option_SlaveOk );
if ( csv ){
for ( vector<string>::iterator i=fields.begin(); i != fields.end(); i++ ){
if ( i != fields.begin() )
- cout << ",";
- cout << *i;
+ out << ",";
+ out << *i;
}
- cout << endl;
+ out << endl;
}
while ( cursor->more() ) {
@@ -90,15 +96,15 @@ public:
if ( csv ){
for ( vector<string>::iterator i=fields.begin(); i != fields.end(); i++ ){
if ( i != fields.begin() )
- cout << ",";
+ out << ",";
const BSONElement & e = obj[i->c_str()];
if ( ! e.eoo() )
- cout << e.jsonString( TenGen , false );
+ out << e.jsonString( TenGen , false );
}
- cout << endl;
+ out << endl;
}
else {
- cout << obj.jsonString() << endl;
+ out << obj.jsonString() << endl;
}
}
diff --git a/tools/files.cpp b/tools/files.cpp
index 04b7dc0da4f..957c546105d 100644
--- a/tools/files.cpp
+++ b/tools/files.cpp
@@ -65,7 +65,7 @@ public:
return -1;
}
- GridFS g( _conn , _db );
+ GridFS g( conn() , _db );
string filename = getParam( "file" );
if ( cmd == "list" ){
diff --git a/tools/importJSON.cpp b/tools/importJSON.cpp
index 7eb4f0a9fe9..28bd48b72ba 100644
--- a/tools/importJSON.cpp
+++ b/tools/importJSON.cpp
@@ -63,11 +63,11 @@ public:
if ( hasParam( "drop" ) ){
cout << "dropping: " << ns << endl;
- _conn.dropCollection( ns.c_str() );
+ conn().dropCollection( ns.c_str() );
}
if ( hasParam( "idbefore" ) ){
- _conn.ensureIndex( ns.c_str() , BSON( "_id" << 1 ) );
+ conn().ensureIndex( ns.c_str() , BSON( "_id" << 1 ) );
}
int num = 0;
@@ -87,7 +87,7 @@ public:
try {
BSONObj o = fromjson( line );
- _conn.insert( ns.c_str() , o );
+ conn().insert( ns.c_str() , o );
}
catch ( MsgAssertionException& ma ){
cout << "exception:" << ma.toString() << endl;
@@ -101,7 +101,7 @@ public:
}
if ( hasParam( "id" ) ){
- _conn.ensureIndex( ns.c_str() , BSON( "_id" << 1 ) );
+ conn().ensureIndex( ns.c_str() , BSON( "_id" << 1 ) );
}
return 0;
diff --git a/tools/restore.cpp b/tools/restore.cpp
index aa36b901ce1..269a95a7cfe 100644
--- a/tools/restore.cpp
+++ b/tools/restore.cpp
@@ -79,8 +79,10 @@ public:
ns += "." + l;
}
- if ( boost::filesystem::file_size( root ) == 0 )
- return;
+ if ( boost::filesystem::file_size( root ) == 0 ) {
+ out() << "file " + root.native_file_string() + " empty, aborting" << endl;
+ return;
+ }
out() << "\t going into namespace [" << ns << "]" << endl;
@@ -95,7 +97,7 @@ public:
while ( read < mmf.length() ) {
BSONObj o( data );
- _conn.insert( ns.c_str() , o );
+ conn().insert( ns.c_str() , o );
read += o.objsize();
data += o.objsize();