summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2009-05-20 11:39:22 -0400
committerAaron <aaron@10gen.com>2009-05-20 11:39:22 -0400
commit85c396b10c9519e72a17a1bd378a2af73a4fb14e (patch)
tree9eca6bd7905e84a01931befd63f509a30a90b653
parentda7a9b3f71a151b17665d7033370adb5507bf3fd (diff)
parent226885b97c3960616af62076b72f1160b43ba7e2 (diff)
downloadmongo-85c396b10c9519e72a17a1bd378a2af73a4fb14e.tar.gz
Merge branch 'master' of git@github.com:mongodb/mongo
-rw-r--r--SConstruct3
-rw-r--r--db/matcher.cpp5
-rw-r--r--dbtests/querytests.cpp17
-rw-r--r--jstests/tool/tool1.js36
-rw-r--r--mongo.xcodeproj/project.pbxproj10
-rw-r--r--shell/utils.cpp4
-rw-r--r--tools/export.cpp20
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;
}
}