diff options
author | Aaron <aaron@10gen.com> | 2009-05-20 11:39:22 -0400 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2009-05-20 11:39:22 -0400 |
commit | 85c396b10c9519e72a17a1bd378a2af73a4fb14e (patch) | |
tree | 9eca6bd7905e84a01931befd63f509a30a90b653 | |
parent | da7a9b3f71a151b17665d7033370adb5507bf3fd (diff) | |
parent | 226885b97c3960616af62076b72f1160b43ba7e2 (diff) | |
download | mongo-85c396b10c9519e72a17a1bd378a2af73a4fb14e.tar.gz |
Merge branch 'master' of git@github.com:mongodb/mongo
-rw-r--r-- | SConstruct | 3 | ||||
-rw-r--r-- | db/matcher.cpp | 5 | ||||
-rw-r--r-- | dbtests/querytests.cpp | 17 | ||||
-rw-r--r-- | jstests/tool/tool1.js | 36 | ||||
-rw-r--r-- | mongo.xcodeproj/project.pbxproj | 10 | ||||
-rw-r--r-- | shell/utils.cpp | 4 | ||||
-rw-r--r-- | tools/export.cpp | 20 |
7 files changed, 83 insertions, 12 deletions
diff --git a/SConstruct b/SConstruct index f408591b96b..3b6dd6dae61 100644 --- a/SConstruct +++ b/SConstruct @@ -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/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/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/tool/tool1.js b/jstests/tool/tool1.js new file mode 100644 index 00000000000..ba044f58fc0 --- /dev/null +++ b/jstests/tool/tool1.js @@ -0,0 +1,36 @@ +// 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 ]; + +m = startMongod( "--port", port, "--dbpath", dbPath, "--nohttpinterface" ); +resetDbpath( externalPath ); +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; } ); 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..50e6785f666 100644 --- a/shell/utils.cpp +++ b/shell/utils.cpp @@ -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" ) port_ = 0; else assert( port_ > 0 ); diff --git a/tools/export.cpp b/tools/export.cpp index 2245b7c7328..f07ed84ea29 100644 --- a/tools/export.cpp +++ b/tools/export.cpp @@ -39,12 +39,18 @@ public: ("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; @@ -79,10 +85,10 @@ public: 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; } } |