2009-01-27 04:19:15 +01:00
|
|
|
|
|
|
|
assert = function( b , msg ){
|
|
|
|
if ( b )
|
|
|
|
return;
|
|
|
|
|
|
|
|
throw "assert failed : " + msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.eq = function( a , b , msg ){
|
|
|
|
if ( a == b )
|
|
|
|
return;
|
|
|
|
|
2009-03-11 22:02:57 +01:00
|
|
|
if ( a != null && b != null && a.toString() == b.toString() )
|
2009-02-24 23:09:21 +01:00
|
|
|
return;
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
throw "[" + a + "] != [" + b + "] are not equal : " + msg;
|
|
|
|
}
|
|
|
|
|
2009-02-20 19:46:43 +01:00
|
|
|
assert.neq = function( a , b , msg ){
|
|
|
|
if ( a != b )
|
|
|
|
return;
|
|
|
|
|
|
|
|
throw "[" + a + "] != [" + b + "] are equal : " + msg;
|
|
|
|
}
|
|
|
|
|
2009-01-29 17:46:29 +01:00
|
|
|
assert.soon = function( f ) {
|
|
|
|
var start = new Date();
|
|
|
|
var last;
|
|
|
|
while( 1 ) {
|
|
|
|
if ( f() )
|
|
|
|
return;
|
|
|
|
if ( ( new Date() ).getTime() - start.getTime() > 10000 )
|
|
|
|
throw "assert.soon failed: " + f;
|
|
|
|
sleep( 200 );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-18 19:54:08 +01:00
|
|
|
assert.throws = function( func , params , msg ){
|
|
|
|
|
|
|
|
try {
|
|
|
|
func.apply( null , params );
|
|
|
|
}
|
|
|
|
catch ( e ){
|
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
throw "did not throw exception: " + msg ;
|
|
|
|
}
|
|
|
|
|
2009-03-18 15:50:49 +01:00
|
|
|
assert.commandWorked = function( res , msg ){
|
|
|
|
if ( res.ok == 1 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
throw "command failed: " + tojson( res ) + " : " + msg;
|
|
|
|
}
|
|
|
|
|
|
|
|
assert.commandFailed = function( res , msg ){
|
|
|
|
if ( res.ok == 0 )
|
|
|
|
return;
|
|
|
|
|
|
|
|
throw "command worked when it should have failed: " + tojson( res ) + " : " + msg;
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
Object.extend = function( dst , src ){
|
|
|
|
for ( var k in src ){
|
|
|
|
dst[k] = src[k];
|
|
|
|
}
|
|
|
|
return dst;
|
|
|
|
}
|
|
|
|
|
|
|
|
argumentsToArray = function( a ){
|
|
|
|
var arr = [];
|
|
|
|
for ( var i=0; i<a.length; i++ )
|
|
|
|
arr[i] = a[i];
|
|
|
|
return arr;
|
|
|
|
}
|
|
|
|
|
|
|
|
isString = function( x ){
|
|
|
|
return typeof( x ) == "string";
|
|
|
|
}
|
|
|
|
|
2009-02-20 16:46:23 +01:00
|
|
|
isNumber = function(x){
|
|
|
|
return typeof( x ) == "number";
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
isObject = function( x ){
|
|
|
|
return typeof( x ) == "object";
|
|
|
|
}
|
|
|
|
|
|
|
|
String.prototype.trim = function() {
|
|
|
|
return this.replace(/^\s+|\s+$/g,"");
|
|
|
|
}
|
|
|
|
String.prototype.ltrim = function() {
|
|
|
|
return this.replace(/^\s+/,"");
|
|
|
|
}
|
|
|
|
String.prototype.rtrim = function() {
|
|
|
|
return this.replace(/\s+$/,"");
|
|
|
|
}
|
|
|
|
|
2009-01-27 20:27:41 +01:00
|
|
|
Date.timeFunc = function( theFunc , numTimes ){
|
|
|
|
|
|
|
|
var start = new Date();
|
|
|
|
|
|
|
|
numTimes = numTimes || 1;
|
|
|
|
for ( var i=0; i<numTimes; i++ ){
|
|
|
|
theFunc.apply( null , argumentsToArray( arguments ).slice( 2 ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
return (new Date()).getTime() - start.getTime();
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
Date.prototype.tojson = function(){
|
|
|
|
return "\"" + this.toString() + "\"";
|
|
|
|
}
|
|
|
|
|
|
|
|
RegExp.prototype.tojson = RegExp.prototype.toString;
|
|
|
|
|
2009-03-26 21:16:53 +01:00
|
|
|
Array.prototype.tojson = function( sepLines ){
|
2009-01-27 04:19:15 +01:00
|
|
|
var s = "[";
|
2009-03-26 21:16:53 +01:00
|
|
|
if ( sepLines ) s += "\n";
|
2009-01-27 04:19:15 +01:00
|
|
|
for ( var i=0; i<this.length; i++){
|
2009-03-26 21:16:53 +01:00
|
|
|
if ( i > 0 ){
|
2009-01-27 04:19:15 +01:00
|
|
|
s += ",";
|
2009-03-26 21:16:53 +01:00
|
|
|
if ( sepLines ) s += "\n";
|
|
|
|
}
|
2009-01-27 04:19:15 +01:00
|
|
|
s += tojson( this[i] );
|
|
|
|
}
|
|
|
|
s += "]";
|
2009-03-26 21:16:53 +01:00
|
|
|
if ( sepLines ) s += "\n";
|
2009-01-27 04:19:15 +01:00
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectId.prototype.toString = function(){
|
|
|
|
return this.str;
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectId.prototype.tojson = function(){
|
|
|
|
return "\"" + this.str + "\"";
|
|
|
|
}
|
|
|
|
|
|
|
|
ObjectId.prototype.isObjectId = true;
|
|
|
|
|
2009-03-05 22:06:11 +01:00
|
|
|
Thread = function(){
|
|
|
|
this.init.apply( this, arguments );
|
|
|
|
}
|
|
|
|
|
|
|
|
threadInject( Thread.prototype );
|
|
|
|
|
|
|
|
fork = function() {
|
|
|
|
var t = new Thread( function() {} );
|
|
|
|
Thread.apply( t, arguments );
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
tojson = function( x ){
|
|
|
|
if ( x == null || x == undefined )
|
|
|
|
return "";
|
|
|
|
|
|
|
|
switch ( typeof x ){
|
|
|
|
|
|
|
|
case "string":
|
|
|
|
return "\"" + x + "\"";
|
|
|
|
|
|
|
|
case "number":
|
|
|
|
case "boolean":
|
|
|
|
return "" + x;
|
|
|
|
|
|
|
|
case "object":
|
|
|
|
return tojsonObject( x );
|
|
|
|
|
|
|
|
default:
|
|
|
|
throw "can't handle type " + ( typeof v );
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
tojsonObject = function( x ){
|
2009-03-17 20:48:46 +01:00
|
|
|
assert.eq( ( typeof x ) , "object" , "tojsonObject needs object, not [" + ( typeof x ) + "]" );
|
2009-01-27 04:19:15 +01:00
|
|
|
|
|
|
|
if ( x.tojson )
|
|
|
|
return x.tojson();
|
|
|
|
|
|
|
|
var s = "{";
|
|
|
|
|
|
|
|
var first = true;
|
|
|
|
for ( var k in x ){
|
|
|
|
if ( first ) first = false;
|
|
|
|
else s += " , ";
|
|
|
|
|
|
|
|
s += "\"" + k + "\" : " + tojson( x[k] );
|
|
|
|
}
|
|
|
|
|
|
|
|
return s + "}";
|
|
|
|
}
|
|
|
|
|
|
|
|
shellPrint = function( x ){
|
2009-02-06 18:31:24 +01:00
|
|
|
it = x;
|
2009-01-27 04:19:15 +01:00
|
|
|
if ( x != undefined )
|
|
|
|
shellPrintHelper( x );
|
|
|
|
|
|
|
|
if ( db ){
|
|
|
|
var e = db.getPrevError();
|
|
|
|
if ( e.err ) {
|
|
|
|
if( e.nPrev <= 1 )
|
|
|
|
print( "error on last call: " + tojson( e.err ) );
|
|
|
|
else
|
|
|
|
print( "an error " + tojson(e.err) + " occurred " + e.nPrev + " operations back in the command invocation" );
|
|
|
|
}
|
|
|
|
db.resetError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-22 05:39:32 +01:00
|
|
|
printjson = function(x){
|
|
|
|
print( tojson( x ) );
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
shellPrintHelper = function( x ){
|
|
|
|
|
|
|
|
if ( typeof x != "object" )
|
|
|
|
return print( x );
|
|
|
|
|
|
|
|
var p = x.shellPrint;
|
|
|
|
if ( typeof p == "function" )
|
|
|
|
return x.shellPrint();
|
|
|
|
|
|
|
|
var p = x.tojson;
|
|
|
|
if ( typeof p == "function" )
|
|
|
|
print( x.tojson() );
|
|
|
|
else
|
|
|
|
print( tojson( x ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
shellHelper = function( command , rest ){
|
|
|
|
command = command.trim();
|
|
|
|
var args = rest.trim().replace(/;$/,"").split( "\s+" );
|
|
|
|
|
|
|
|
if ( ! shellHelper[command] )
|
|
|
|
throw "no command [" + command + "]";
|
|
|
|
|
|
|
|
return shellHelper[command].apply( null , args );
|
|
|
|
}
|
|
|
|
|
|
|
|
help = shellHelper.help = function(){
|
|
|
|
print( "HELP" );
|
2009-02-04 20:46:17 +01:00
|
|
|
print( "\t" + "show dbs show database names");
|
|
|
|
print( "\t" + "show collections show collections in current database");
|
|
|
|
print( "\t" + "show users show users in current database");
|
|
|
|
print( "\t" + "show profile show most recent system.profile entries with time >= 1ms");
|
|
|
|
print( "\t" + "use <db name> set curent database to <db name>" );
|
2009-01-27 04:19:15 +01:00
|
|
|
print( "\t" + "db.help() help on DB methods");
|
|
|
|
print( "\t" + "db.foo.help() help on collection methods");
|
2009-02-04 20:46:17 +01:00
|
|
|
print( "\t" + "db.foo.find() list objects in collection foo" );
|
|
|
|
print( "\t" + "db.foo.find( { a : 1 } ) list objects in foo where a == 1" );
|
2009-02-06 19:29:57 +01:00
|
|
|
print( "\t" + "it result of the last line evaluated; use to further iterate");
|
2009-01-27 04:19:15 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
shellHelper.use = function( dbname ){
|
|
|
|
db = db.getMongo().getDB( dbname );
|
|
|
|
print( "switched to db " + db.getName() );
|
|
|
|
}
|
|
|
|
|
|
|
|
shellHelper.show = function( what ){
|
|
|
|
assert( typeof what == "string" );
|
|
|
|
|
2009-02-04 20:46:17 +01:00
|
|
|
if( what == "profile" ) {
|
|
|
|
if( db.system.profile.count() == 0 ) {
|
|
|
|
print("db.system.profile is empty");
|
|
|
|
print("Use db.setProfilingLevel(2) will enable profiling");
|
|
|
|
print("Use db.system.profile.find() to show raw profile entries");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
print();
|
|
|
|
db.system.profile.find({ millis : { $gt : 0 } }).sort({$natural:-1}).limit(5).forEach( function(x){print(""+x.millis+"ms " + String(x.ts).substring(0,24)); print(x.info); print("\n");} )
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
2009-01-27 04:19:15 +01:00
|
|
|
if ( what == "users" )
|
|
|
|
return db.system.users.find();
|
|
|
|
|
2009-02-03 20:42:53 +01:00
|
|
|
if ( what == "collections" || what == "tables" ) {
|
|
|
|
db.getCollectionNames().forEach( function(x){print(x)} );
|
|
|
|
return "";
|
|
|
|
}
|
2009-01-27 04:19:15 +01:00
|
|
|
|
2009-02-10 23:42:31 +01:00
|
|
|
if ( what == "dbs" ) {
|
|
|
|
db.getMongo().getDBNames().sort().forEach( function(x){print(x)} );
|
|
|
|
return "";
|
|
|
|
}
|
2009-01-27 04:19:15 +01:00
|
|
|
|
|
|
|
throw "don't know how to show [" + what + "]";
|
|
|
|
|
|
|
|
}
|