diff options
author | Eliot Horowitz <eliot@10gen.com> | 2010-02-28 13:52:33 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2010-02-28 13:52:33 -0500 |
commit | 63b5f7e470fc2d63603bd7b49f8057052f4826e6 (patch) | |
tree | 5bca19d58007d5fcc03f4614ce8ab03e293b92c5 /shell | |
parent | 0e10fb37681679f7429dc5243e7d75263c905b9f (diff) | |
download | mongo-63b5f7e470fc2d63603bd7b49f8057052f4826e6.tar.gz |
update vstudio js file
Diffstat (limited to 'shell')
-rw-r--r-- | shell/mongo_vstudio.cpp | 2811 |
1 files changed, 1159 insertions, 1652 deletions
diff --git a/shell/mongo_vstudio.cpp b/shell/mongo_vstudio.cpp index 3b4d6a86c05..f88b3c2b6f7 100644 --- a/shell/mongo_vstudio.cpp +++ b/shell/mongo_vstudio.cpp @@ -1,462 +1,616 @@ -/* - * Copyright 2010 10gen Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - const char * jsconcatcode = -"if ( ( typeof DBCollection ) == \"undefined\" ){\n" - "DBCollection = function( mongo , db , shortName , fullName ){\n" - "this._mongo = mongo;\n" - "this._db = db;\n" - "this._shortName = shortName;\n" - "this._fullName = fullName;\n" - "this.verify();\n" - "}\n" - "}\n" - "DBCollection.prototype.verify = function(){\n" - "assert( this._fullName , \"no fullName\" );\n" - "assert( this._shortName , \"no shortName\" );\n" - "assert( this._db , \"no db\" );\n" - "assert.eq( this._fullName , this._db._name + \".\" + this._shortName , \"name mismatch\" );\n" - "assert( this._mongo , \"no mongo in DBCollection\" );\n" - "}\n" - "DBCollection.prototype.getName = function(){\n" - "return this._shortName;\n" - "}\n" - "DBCollection.prototype.help = function(){\n" - "print(\"DBCollection help\");\n" - "print(\"\\tdb.foo.getDB() get DB object associated with collection\");\n" - "print(\"\\tdb.foo.findOne([query])\");\n" - "print(\"\\tdb.foo.find( [query] , [fields]) - first parameter is an optional query filter. second parameter is optional set of fields to return.\");\n" - "print(\"\\t e.g. db.foo.find( { x : 77 } , { name : 1 , x : 1 } )\");\n" - "print(\"\\tdb.foo.find(...).sort(...)\");\n" - "print(\"\\tdb.foo.find(...).limit(n)\");\n" - "print(\"\\tdb.foo.find(...).skip(n)\");\n" - "print(\"\\tdb.foo.find(...).count()\");\n" - "print(\"\\tdb.foo.count()\");\n" - "print(\"\\tdb.foo.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )\");\n" - "print(\"\\tdb.foo.save(obj)\");\n" - "print(\"\\tdb.foo.update(query, object[, upsert_bool])\");\n" - "print(\"\\tdb.foo.remove(query)\" );\n" - "print(\"\\tdb.foo.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups\");\n" - "print(\"\\tdb.foo.dropIndexes()\");\n" - "print(\"\\tdb.foo.dropIndex(name)\");\n" - "print(\"\\tdb.foo.getIndexes()\");\n" - "print(\"\\tdb.foo.drop() drop the collection\");\n" - "print(\"\\tdb.foo.renameCollection( newName ) renames the collection\");\n" - "print(\"\\tdb.foo.validate() - SLOW\");\n" - "print(\"\\tdb.foo.stats()\");\n" - "print(\"\\tdb.foo.dataSize()\");\n" - "print(\"\\tdb.foo.storageSize() - includes free space allocated to this collection\");\n" - "print(\"\\tdb.foo.totalIndexSize() - size in bytes of all the indexes\");\n" - "print(\"\\tdb.foo.totalSize() - storage allocated for all data and indexes\");\n" - "}\n" - "DBCollection.prototype.getFullName = function(){\n" - "return this._fullName;\n" - "}\n" - "DBCollection.prototype.getDB = function(){\n" - "return this._db;\n" - "}\n" - "DBCollection.prototype._dbCommand = function( cmd ){\n" - "return this._db._dbCommand( cmd );\n" - "}\n" - "DBCollection.prototype._massageObject = function( q ){\n" - "if ( ! q )\n" - "return {};\n" - "var type = typeof q;\n" - "if ( type == \"function\" )\n" - "return { $where : q };\n" - "if ( q.isObjectId )\n" - "return { _id : q };\n" - "if ( type == \"object\" )\n" - "return q;\n" - "if ( type == \"string\" ){\n" - "if ( q.length == 24 )\n" - "return { _id : q };\n" - "return { $where : q };\n" - "}\n" - "throw \"don't know how to massage : \" + type;\n" - "}\n" - "DBCollection.prototype._validateObject = function( o ){\n" - "if ( o._ensureSpecial && o._checkModify )\n" - "throw \"can't save a DBQuery object\";\n" - "}\n" - "DBCollection._allowedFields = { $id : 1 , $ref : 1 };\n" - "DBCollection.prototype._validateForStorage = function( o ){\n" - "this._validateObject( o );\n" - "for ( var k in o ){\n" - "if ( k.indexOf( \".\" ) >= 0 ) {\n" - "throw \"can't have . in field names [\" + k + \"]\" ;\n" - "}\n" - "if ( k.indexOf( \"$\" ) == 0 && ! DBCollection._allowedFields[k] ) {\n" - "throw \"field names cannot start with $ [\" + k + \"]\";\n" - "}\n" - "if ( o[k] !== null && typeof( o[k] ) === \"object\" ) {\n" - "this._validateForStorage( o[k] );\n" - "}\n" - "}\n" - "};\n" - "DBCollection.prototype.find = function( query , fields , limit , skip ){\n" - "return new DBQuery( this._mongo , this._db , this ,\n" - "this._fullName , this._massageObject( query ) , fields , limit , skip );\n" - "}\n" - "DBCollection.prototype.findOne = function( query , fields ){\n" - "var cursor = this._mongo.find( this._fullName , this._massageObject( query ) || {} , fields , -1 , 0 );\n" - "if ( ! cursor.hasNext() )\n" +"__quiet = false;\n" + "chatty = function(s){\n" + "if ( ! __quiet )\n" + "print( s );}\n" + "friendlyEqual = function( a , b ){\n" + "if ( a == b )\n" + "return true;\n" + "if ( tojson( a ) == tojson( b ) )\n" + "return true;\n" + "return false;}\n" + "doassert = function( msg ){\n" + "print( \"assert: \" + msg );\n" + "throw msg;}\n" + "assert = function( b , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( b )\n" + "return;\n" + "doassert( \"assert failed : \" + msg );}\n" + "assert._debug = false;\n" + "assert.eq = function( a , b , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( a == b )\n" + "return;\n" + "if ( ( a != null && b != null ) && friendlyEqual( a , b ) )\n" + "return;\n" + "doassert( \"[\" + tojson( a ) + \"] != [\" + tojson( b ) + \"] are not equal : \" + msg );}\n" + "assert.neq = function( a , b , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( a != b )\n" + "return;\n" + "doassert( \"[\" + a + \"] != [\" + b + \"] are equal : \" + msg );}\n" + "assert.soon = function( f, msg, timeout, interval ) {\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "var start = new Date();\n" + "timeout = timeout || 30000;\n" + "interval = interval || 200;\n" + "var last;\n" + "while( 1 ) {\n" + "if ( typeof( f ) == \"string\" ){\n" + "if ( eval( f ) )\n" + "return;}\n" + "else {\n" + "if ( f() )\n" + "return;}\n" + "if ( ( new Date() ).getTime() - start.getTime() > timeout )\n" + "doassert( \"assert.soon failed: \" + f + \", msg:\" + msg );\n" + "sleep( interval );}}\n" + "assert.throws = function( func , params , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "try {\n" + "func.apply( null , params );}\n" + "catch ( e ){\n" + "return e;}\n" + "doassert( \"did not throw exception: \" + msg );}\n" + "assert.commandWorked = function( res , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( res.ok == 1 )\n" + "return;\n" + "doassert( \"command failed: \" + tojson( res ) + \" : \" + msg );}\n" + "assert.commandFailed = function( res , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( res.ok == 0 )\n" + "return;\n" + "doassert( \"command worked when it should have failed: \" + tojson( res ) + \" : \" + msg );}\n" + "assert.isnull = function( what , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( what == null )\n" + "return;\n" + "doassert( \"supposed to null (\" + ( msg || \"\" ) + \") was: \" + tojson( what ) );}\n" + "assert.lt = function( a , b , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( a < b )\n" + "return;\n" + "doassert( a + \" is not less than \" + b + \" : \" + msg );}\n" + "assert.gt = function( a , b , msg ){\n" + "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" + "if ( a > b )\n" + "return;\n" + "doassert( a + \" is not greater than \" + b + \" : \" + msg );}\n" + "assert.close = function( a , b , msg ){\n" + "var diff = Math.abs( (a-b)/((a+b)/2) );\n" + "if ( diff < .001 )\n" + "return;\n" + "doassert( a + \" is not close to \" + b + \" diff: \" + diff + \" : \" + msg );}\n" + "Object.extend = function( dst , src , deep ){\n" + "for ( var k in src ){\n" + "var v = src[k];\n" + "if ( deep && typeof(v) == \"object\" ){\n" + "v = Object.extend( typeof ( v.length ) == \"number\" ? [] : {} , v , true );}\n" + "dst[k] = v;}\n" + "return dst;}\n" + "argumentsToArray = function( a ){\n" + "var arr = [];\n" + "for ( var i=0; i<a.length; i++ )\n" + "arr[i] = a[i];\n" + "return arr;}\n" + "isString = function( x ){\n" + "return typeof( x ) == \"string\";}\n" + "isNumber = function(x){\n" + "return typeof( x ) == \"number\";}\n" + "isObject = function( x ){\n" + "return typeof( x ) == \"object\";}\n" + "String.prototype.trim = function() {\n" + "return this.replace(/^\\s+|\\s+$/g,\"\");}\n" + "String.prototype.ltrim = function() {\n" + "return this.replace(/^\\s+/,\"\");}\n" + "String.prototype.rtrim = function() {\n" + "return this.replace(/\\s+$/,\"\");}\n" + "Date.timeFunc = function( theFunc , numTimes ){\n" + "var start = new Date();\n" + "numTimes = numTimes || 1;\n" + "for ( var i=0; i<numTimes; i++ ){\n" + "theFunc.apply( null , argumentsToArray( arguments ).slice( 2 ) );}\n" + "return (new Date()).getTime() - start.getTime();}\n" + "Date.prototype.tojson = function(){\n" + "return \"\\\"\" + this.toString() + \"\\\"\";}\n" + "RegExp.prototype.tojson = RegExp.prototype.toString;\n" + "Array.contains = function( a , x ){\n" + "for ( var i=0; i<a.length; i++ ){\n" + "if ( a[i] == x )\n" + "return true;}\n" + "return false;}\n" + "Array.unique = function( a ){\n" + "var u = [];\n" + "for ( var i=0; i<a.length; i++){\n" + "var o = a[i];\n" + "if ( ! Array.contains( u , o ) ){\n" + "u.push( o );}}\n" + "return u;}\n" + "Array.shuffle = function( arr ){\n" + "for ( var i=0; i<arr.length-1; i++ ){\n" + "var pos = i+Random.randInt(arr.length-i);\n" + "var save = arr[i];\n" + "arr[i] = arr[pos];\n" + "arr[pos] = save;}\n" + "return arr;}\n" + "Array.tojson = function( a , indent ){\n" + "if (!indent)\n" + "indent = \"\";\n" + "if (a.length == 0) {\n" + "return \"[ ]\";}\n" + "var s = \"[\\n\";\n" + "indent += \"\\t\";\n" + "for ( var i=0; i<a.length; i++){\n" + "s += indent + tojson( a[i], indent );\n" + "if ( i < a.length - 1 ){\n" + "s += \",\\n\";}}\n" + "if ( a.length == 0 ) {\n" + "s += indent;}\n" + "indent = indent.substring(1);\n" + "s += \"\\n\"+indent+\"]\";\n" + "return s;}\n" + "Array.fetchRefs = function( arr , coll ){\n" + "var n = [];\n" + "for ( var i=0; i<arr.length; i ++){\n" + "var z = arr[i];\n" + "if ( coll && coll != z.getCollection() )\n" + "continue;\n" + "n.push( z.fetch() );}\n" + "return n;}\n" + "Array.sum = function( arr ){\n" + "if ( arr.length == 0 )\n" "return null;\n" - "var ret = cursor.next();\n" - "if ( cursor.hasNext() ) throw \"findOne has more than 1 result!\";\n" - "if ( ret.$err )\n" - "throw \"error \" + tojson( ret );\n" - "return ret;\n" - "}\n" - "DBCollection.prototype.insert = function( obj , _allow_dot ){\n" - "if ( ! obj )\n" - "throw \"no object!\";\n" - "if ( ! _allow_dot ) {\n" - "this._validateForStorage( obj );\n" - "}\n" - "return this._mongo.insert( this._fullName , obj );\n" - "}\n" - "DBCollection.prototype.remove = function( t ){\n" - "this._mongo.remove( this._fullName , this._massageObject( t ) );\n" - "}\n" - "DBCollection.prototype.update = function( query , obj , upsert ){\n" - "assert( query , \"need a query\" );\n" - "assert( obj , \"need an object\" );\n" - "this._validateObject( obj );\n" - "return this._mongo.update( this._fullName , query , obj , upsert ? true : false );\n" - "}\n" - "DBCollection.prototype.save = function( obj ){\n" - "if ( obj == null || typeof( obj ) == \"undefined\" )\n" - "throw \"can't save a null\";\n" - "if ( typeof( obj._id ) == \"undefined\" ){\n" - "obj._id = new ObjectId();\n" - "return this.insert( obj );\n" - "}\n" + "var s = arr[0];\n" + "for ( var i=1; i<arr.length; i++ )\n" + "s += arr[i];\n" + "return s;}\n" + "Array.avg = function( arr ){\n" + "if ( arr.length == 0 )\n" + "return null;\n" + "return Array.sum( arr ) / arr.length;}\n" + "Array.stdDev = function( arr ){\n" + "var avg = Array.avg( arr );\n" + "var sum = 0;\n" + "for ( var i=0; i<arr.length; i++ ){\n" + "sum += Math.pow( arr[i] - avg , 2 );}\n" + "return Math.sqrt( sum / arr.length );}\n" + "Object.keySet = function( o ) {\n" + "var ret = new Array();\n" + "for( i in o ) {\n" + "if ( !( i in o.__proto__ && o[ i ] === o.__proto__[ i ] ) ) {\n" + "ret.push( i );}}\n" + "return ret;}\n" + "if ( ! ObjectId.prototype )\n" + "ObjectId.prototype = {}\n" + "ObjectId.prototype.toString = function(){\n" + "return this.str;}\n" + "ObjectId.prototype.tojson = function(){\n" + "return \"ObjectId(\\\"\" + this.str + \"\\\")\";}\n" + "ObjectId.prototype.isObjectId = true;\n" + "if ( typeof( DBPointer ) != \"undefined\" ){\n" + "DBPointer.prototype.fetch = function(){\n" + "assert( this.ns , \"need a ns\" );\n" + "assert( this.id , \"need an id\" );\n" + "return db[ this.ns ].findOne( { _id : this.id } );}\n" + "DBPointer.prototype.tojson = function(indent){\n" + "return tojson({\"ns\" : this.ns, \"id\" : this.id}, indent);}\n" + "DBPointer.prototype.getCollection = function(){\n" + "return this.ns;}\n" + "DBPointer.prototype.toString = function(){\n" + "return \"DBPointer \" + this.ns + \":\" + this.id;}}\n" "else {\n" - "return this.update( { _id : obj._id } , obj , true );\n" - "}\n" - "}\n" - "DBCollection.prototype._genIndexName = function( keys ){\n" - "var name = \"\";\n" - "for ( var k in keys ){\n" - "if ( name.length > 0 )\n" - "name += \"_\";\n" - "name += k + \"_\";\n" - "var v = keys[k];\n" - "if ( typeof v == \"number\" )\n" - "name += v;\n" - "}\n" - "return name;\n" - "}\n" - "DBCollection.prototype._indexSpec = function( keys, options ) {\n" - "var ret = { ns : this._fullName , key : keys , name : this._genIndexName( keys ) };\n" - "if ( ! options ){\n" - "}\n" - "else if ( typeof ( options ) == \"string\" )\n" - "ret.name = options;\n" - "else if ( typeof ( options ) == \"boolean\" )\n" - "ret.unique = true;\n" - "else if ( typeof ( options ) == \"object\" ){\n" - "if ( options.length ){\n" - "var nb = 0;\n" - "for ( var i=0; i<options.length; i++ ){\n" - "if ( typeof ( options[i] ) == \"string\" )\n" - "ret.name = options[i];\n" - "else if ( typeof( options[i] ) == \"boolean\" ){\n" - "if ( options[i] ){\n" - "if ( nb == 0 )\n" - "ret.unique = true;\n" - "if ( nb == 1 )\n" - "ret.dropDups = true;\n" - "}\n" - "nb++;\n" - "}\n" - "}\n" - "}\n" + "print( \"warning: no DBPointer\" );}\n" + "if ( typeof( DBRef ) != \"undefined\" ){\n" + "DBRef.prototype.fetch = function(){\n" + "assert( this.$ref , \"need a ns\" );\n" + "assert( this.$id , \"need an id\" );\n" + "return db[ this.$ref ].findOne( { _id : this.$id } );}\n" + "DBRef.prototype.tojson = function(indent){\n" + "return tojson({\"$ref\" : this.$ref, \"$id\" : this.$id}, indent);}\n" + "DBRef.prototype.getCollection = function(){\n" + "return this.$ref;}\n" + "DBRef.prototype.toString = function(){\n" + "return this.tojson();}}\n" "else {\n" - "Object.extend( ret , options );\n" - "}\n" - "}\n" + "print( \"warning: no DBRef\" );}\n" + "if ( typeof( BinData ) != \"undefined\" ){\n" + "BinData.prototype.tojson = function(){\n" + "return \"BinData type: \" + this.type + \" len: \" + this.len;}}\n" "else {\n" - "throw \"can't handle: \" + typeof( options );\n" - "}\n" - "/*\n" - "return ret;\n" - "var name;\n" - "var nTrue = 0;\n" - "if ( ! isObject( options ) ) {\n" - "options = [ options ];\n" - "}\n" - "if ( options.length ){\n" - "for( var i = 0; i < options.length; ++i ) {\n" - "var o = options[ i ];\n" - "if ( isString( o ) ) {\n" - "ret.name = o;\n" - "} else if ( typeof( o ) == \"boolean\" ) {\n" - "if ( o ) {\n" - "++nTrue;\n" - "}\n" - "}\n" - "}\n" - "if ( nTrue > 0 ) {\n" - "ret.unique = true;\n" - "}\n" - "if ( nTrue > 1 ) {\n" - "ret.dropDups = true;\n" - "}\n" - "}\n" - "*/\n" - "return ret;\n" - "}\n" - "DBCollection.prototype.createIndex = function( keys , options ){\n" - "var o = this._indexSpec( keys, options );\n" - "this._db.getCollection( \"system.indexes\" ).insert( o , true );\n" - "}\n" - "DBCollection.prototype.ensureIndex = function( keys , options ){\n" - "var name = this._indexSpec( keys, options ).name;\n" - "this._indexCache = this._indexCache || {};\n" - "if ( this._indexCache[ name ] ){\n" - "return false;\n" - "}\n" - "this.createIndex( keys , options );\n" - "if ( this.getDB().getLastError() == \"\" ) {\n" - "this._indexCache[name] = true;\n" - "}\n" - "return true;\n" - "}\n" - "DBCollection.prototype.resetIndexCache = function(){\n" - "this._indexCache = {};\n" - "}\n" - "DBCollection.prototype.reIndex = function(){\n" - "var specs = this.getIndexSpecs();\n" - "this.dropIndexes();\n" - "for ( var i = 0; i < specs.length; ++i ){\n" - "this.ensureIndex( specs[i].key, [ specs[i].unique, specs[i].name ] );\n" - "}\n" - "}\n" - "DBCollection.prototype.dropIndexes = function(){\n" - "this.resetIndexCache();\n" - "var res = this._db.runCommand( { deleteIndexes: this.getName(), index: \"*\" } );\n" - "assert( res , \"no result from dropIndex result\" );\n" - "if ( res.ok )\n" - "return res;\n" - "if ( res.errmsg.match( /not found/ ) )\n" - "return res;\n" - "throw \"error dropping indexes : \" + tojson( res );\n" - "}\n" - "DBCollection.prototype.drop = function(){\n" - "this.resetIndexCache();\n" - "return this._db.runCommand( { drop: this.getName() } );\n" - "}\n" - "DBCollection.prototype.renameCollection = function( newName ){\n" - "return this._db._adminCommand( { renameCollection : this._fullName , to : this._db._name + \".\" + newName } ).ok;\n" - "}\n" - "DBCollection.prototype.validate = function() {\n" - "var res = this._db.runCommand( { validate: this.getName() } );\n" - "res.valid = false;\n" - "if ( res.result ){\n" - "var str = \"-\" + tojson( res.result );\n" - "res.valid = ! ( str.match( /exception/ ) || str.match( /corrupt/ ) );\n" - "var p = /lastExtentSize:(\\d+)/;\n" - "var r = p.exec( str );\n" - "if ( r ){\n" - "res.lastExtentSize = Number( r[1] );\n" - "}\n" - "}\n" - "return res;\n" - "}\n" - "DBCollection.prototype.getIndexes = function(){\n" - "return this.getDB().getCollection( \"system.indexes\" ).find( { ns : this.getFullName() } ).toArray();\n" - "}\n" - "DBCollection.prototype.getIndices = DBCollection.prototype.getIndexes;\n" - "DBCollection.prototype.getIndexSpecs = DBCollection.prototype.getIndexes;\n" - "DBCollection.prototype.getIndexKeys = function(){\n" - "return this.getIndexes().map(\n" - "function(i){\n" - "return i.key;\n" - "}\n" + "print( \"warning: no BinData\" );}\n" + "if ( typeof _threadInject != \"undefined\" ){\n" + "print( \"fork() available!\" );\n" + "Thread = function(){\n" + "this.init.apply( this, arguments );}\n" + "_threadInject( Thread.prototype );\n" + "ScopedThread = function() {\n" + "this.init.apply( this, arguments );}\n" + "ScopedThread.prototype = new Thread( function() {} );\n" + "_scopedThreadInject( ScopedThread.prototype );\n" + "fork = function() {\n" + "var t = new Thread( function() {} );\n" + "Thread.apply( t, arguments );\n" + "return t;}\n" + "EventGenerator = function( me, collectionName, mean ) {\n" + "this.mean = mean;\n" + "this.events = new Array( me, collectionName );}\n" + "EventGenerator.prototype._add = function( action ) {\n" + "this.events.push( [ Random.genExp( this.mean ), action ] );}\n" + "EventGenerator.prototype.addInsert = function( obj ) {\n" + "this._add( \"t.insert( \" + tojson( obj ) + \" )\" );}\n" + "EventGenerator.prototype.addRemove = function( obj ) {\n" + "this._add( \"t.remove( \" + tojson( obj ) + \" )\" );}\n" + "EventGenerator.prototype.addUpdate = function( objOld, objNew ) {\n" + "this._add( \"t.update( \" + tojson( objOld ) + \", \" + tojson( objNew ) + \" )\" );}\n" + "EventGenerator.prototype.addCheckCount = function( count, query, shouldPrint, checkQuery ) {\n" + "query = query || {};\n" + "shouldPrint = shouldPrint || false;\n" + "checkQuery = checkQuery || false;\n" + "var action = \"assert.eq( \" + count + \", t.count( \" + tojson( query ) + \" ) );\"\n" + "if ( checkQuery ) {\n" + "action += \" assert.eq( \" + count + \", t.find( \" + tojson( query ) + \" ).toArray().length );\"}\n" + "if ( shouldPrint ) {\n" + "action += \" print( me + ' ' + \" + count + \" );\";}\n" + "this._add( action );}\n" + "EventGenerator.prototype.getEvents = function() {\n" + "return this.events;}\n" + "EventGenerator.dispatch = function() {\n" + "var args = argumentsToArray( arguments );\n" + "var me = args.shift();\n" + "var collectionName = args.shift();\n" + "var m = new Mongo( db.getMongo().host );\n" + "var t = m.getDB( \"test\" )[ collectionName ];\n" + "for( var i in args ) {\n" + "sleep( args[ i ][ 0 ] );\n" + "eval( args[ i ][ 1 ] );}}\n" + "ParallelTester = function() {\n" + "this.params = new Array();}\n" + "ParallelTester.prototype.add = function( fun, args ) {\n" + "args = args || [];\n" + "args.unshift( fun );\n" + "this.params.push( args );}\n" + "ParallelTester.prototype.run = function( msg, newScopes ) {\n" + "newScopes = newScopes || false;\n" + "assert.parallelTests( this.params, msg, newScopes );}\n" + "ParallelTester.createJstestsLists = function( n ) {\n" + "var params = new Array();\n" + "for( var i = 0; i < n; ++i ) {\n" + "params.push( [] );}\n" + "var makeKeys = function( a ) {\n" + "var ret = {};\n" + "for( var i in a ) {\n" + "ret[ a[ i ] ] = 1;}\n" + "return ret;}\n" + "var skipTests = makeKeys( [ \"jstests/dbadmin.js\",\n" + "\"jstests/repair.js\",\n" + "\"jstests/cursor8.js\",\n" + "\"jstests/recstore.js\",\n" + "\"jstests/extent.js\",\n" + "\"jstests/indexb.js\",\n" + "\"jstests/profile1.js\",\n" + "\"jstests/mr3.js\",\n" + "\"jstests/apitest_db.js\"] );\n" + "var serialTestsArr = [ \"jstests/fsync.js\",\n" + "\"jstests/fsync2.js\" ];\n" + "var serialTests = makeKeys( serialTestsArr );\n" + "params[ 0 ] = serialTestsArr;\n" + "var files = listFiles(\"jstests\");\n" + "files = Array.shuffle( files );\n" + "var i = 0;\n" + "files.forEach(\n" + "function(x) {\n" + "if ( /_runner/.test(x.name) ||\n" + "/_lodeRunner/.test(x.name) ||\n" + "( x.name in skipTests ) ||\n" + "( x.name in serialTests ) ||\n" + "! /\\.js$/.test(x.name ) ){\n" + "print(\" >>>>>>>>>>>>>>> skipping \" + x.name);\n" + "return;}\n" + "params[ i % n ].push( x.name );\n" + "++i;}\n" ");\n" - "}\n" - "DBCollection.prototype.count = function( x ){\n" - "return this.find( x ).count();\n" - "}\n" - "/**\n" - "* Drop free lists. Normally not used.\n" - "* Note this only does the collection itself, not the namespaces of its indexes (see cleanAll).\n" - "*/\n" - "DBCollection.prototype.clean = function() {\n" - "return this._dbCommand( { clean: this.getName() } );\n" - "}\n" - "/**\n" - "* <p>Drop a specified index.</p>\n" - "*\n" - "* <p>\n" - "* Name is the name of the index in the system.indexes name field. (Run db.system.indexes.find() to\n" - "* see example data.)\n" - "* </p>\n" - "*\n" - "* <p>Note : alpha: space is not reclaimed </p>\n" - "* @param {String} name of index to delete.\n" - "* @return A result object. result.ok will be true if successful.\n" - "*/\n" - "DBCollection.prototype.dropIndex = function(index) {\n" - "assert(index , \"need to specify index to dropIndex\" );\n" - "if ( ! isString( index ) && isObject( index ) )\n" - "index = this._genIndexName( index );\n" - "var res = this._dbCommand( { deleteIndexes: this.getName(), index: index } );\n" - "this.resetIndexCache();\n" - "return res;\n" - "}\n" - "DBCollection.prototype.copyTo = function( newName ){\n" - "return this.getDB().eval(\n" - "function( collName , newName ){\n" - "var from = db[collName];\n" - "var to = db[newName];\n" - "to.ensureIndex( { _id : 1 } );\n" - "var count = 0;\n" - "var cursor = from.find();\n" - "while ( cursor.hasNext() ){\n" - "var o = cursor.next();\n" - "count++;\n" - "to.save( o );\n" - "}\n" - "return count;\n" - "} , this.getName() , newName\n" + "params[ 0 ] = Array.shuffle( params[ 0 ] );\n" + "for( var i in params ) {\n" + "params[ i ].unshift( i );}\n" + "return params;}\n" + "ParallelTester.fileTester = function() {\n" + "var args = argumentsToArray( arguments );\n" + "var suite = args.shift();\n" + "args.forEach(\n" + "function( x ) {\n" + "print(\" S\" + suite + \" Test : \" + x + \" ...\");\n" + "var time = Date.timeFunc( function() { load(x); }, 1);\n" + "print(\" S\" + suite + \" Test : \" + x + \" \" + time + \"ms\" );}\n" + ");}\n" + "assert.parallelTests = function( params, msg, newScopes ) {\n" + "newScopes = newScopes || false;\n" + "var wrapper = function( fun, argv ) {\n" + "eval (\n" + "\"var z = function() {\" +\n" + "\"var __parallelTests__fun = \" + fun.toString() + \";\" +\n" + "\"var __parallelTests__argv = \" + tojson( argv ) + \";\" +\n" + "\"var __parallelTests__passed = false;\" +\n" + "\"try {\" +\n" + "\"__parallelTests__fun.apply( 0, __parallelTests__argv );\" +\n" + "\"__parallelTests__passed = true;\" +\n" + "\"} catch ( e ) {\" +\n" + "\"print( e );\" +\n" + "\"}\" +\n" + "\"return __parallelTests__passed;\" +\n" + "\"}\"\n" ");\n" - "}\n" - "DBCollection.prototype.getCollection = function( subName ){\n" - "return this._db.getCollection( this._shortName + \".\" + subName );\n" - "}\n" - "DBCollection.prototype.stats = function(){\n" - "return this._db.runCommand( { collstats : this._shortName } );\n" - "}\n" - "DBCollection.prototype.dataSize = function(){\n" - "return this.stats().size;\n" - "}\n" - "DBCollection.prototype.storageSize = function(){\n" - "return this.stats().storageSize;\n" - "}\n" - "DBCollection.prototype.totalIndexSize = function( verbose ){\n" + "return z;}\n" + "var runners = new Array();\n" + "for( var i in params ) {\n" + "var param = params[ i ];\n" + "var test = param.shift();\n" + "var t;\n" + "if ( newScopes )\n" + "t = new ScopedThread( wrapper( test, param ) );\n" + "else\n" + "t = new Thread( wrapper( test, param ) );\n" + "runners.push( t );}\n" + "runners.forEach( function( x ) { x.start(); } );\n" + "var nFailed = 0;\n" + "runners.forEach( function( x ) { if( !x.returnData() ) { ++nFailed; } } );\n" + "assert.eq( 0, nFailed, msg );}}\n" + "tojson = function( x, indent , nolint ){\n" + "if ( x === null )\n" + "return \"null\";\n" + "if ( x === undefined )\n" + "return \"undefined\";\n" + "if (!indent)\n" + "indent = \"\";\n" + "switch ( typeof x ){\n" + "case \"string\": {\n" + "var s = \"\\\"\";\n" + "for ( var i=0; i<x.length; i++ ){\n" + "if ( x[i] == '\"' ){\n" + "s += \"\\\\\\\"\";}\n" + "else\n" + "s += x[i];}\n" + "return s + \"\\\"\";}\n" + "case \"number\":\n" + "case \"boolean\":\n" + "return \"\" + x;\n" + "case \"object\":{\n" + "var s = tojsonObject( x, indent , nolint );\n" + "if ( ( nolint == null || nolint == true ) && s.length < 80 && ( indent == null || indent.length == 0 ) ){\n" + "s = s.replace( /[\\s\\r\\n ]+/gm , \" \" );}\n" + "return s;}\n" + "case \"function\":\n" + "return x.toString();\n" + "default:\n" + "throw \"tojson can't handle type \" + ( typeof x );}}\n" + "tojsonObject = function( x, indent , nolint ){\n" + "var lineEnding = nolint ? \" \" : \"\\n\";\n" + "var tabSpace = nolint ? \"\" : \"\\t\";\n" + "assert.eq( ( typeof x ) , \"object\" , \"tojsonObject needs object, not [\" + ( typeof x ) + \"]\" );\n" + "if (!indent)\n" + "indent = \"\";\n" + "if ( typeof( x.tojson ) == \"function\" && x.tojson != tojson ) {\n" + "return x.tojson(indent,nolint);}\n" + "if ( typeof( x.constructor.tojson ) == \"function\" && x.constructor.tojson != tojson ) {\n" + "return x.constructor.tojson( x, indent , nolint );}\n" + "if ( x.toString() == \"[object MaxKey]\" )\n" + "return \"{ $maxKey : 1 }\";\n" + "if ( x.toString() == \"[object MinKey]\" )\n" + "return \"{ $minKey : 1 }\";\n" + "var s = \"{\" + lineEnding;\n" + "indent += tabSpace;\n" "var total = 0;\n" - "var mydb = this._db;\n" - "var shortName = this._shortName;\n" - "this.getIndexes().forEach(\n" - "function( spec ){\n" - "var coll = mydb.getCollection( shortName + \".$\" + spec.name );\n" - "var mysize = coll.dataSize();\n" - "total += coll.dataSize();\n" - "if ( verbose ) {\n" - "print( coll + \"\\t\" + mysize );\n" - "}\n" - "}\n" - ");\n" - "return total;\n" - "}\n" - "DBCollection.prototype.totalSize = function(){\n" - "var total = this.storageSize();\n" - "var mydb = this._db;\n" - "var shortName = this._shortName;\n" - "this.getIndexes().forEach(\n" - "function( spec ){\n" - "var coll = mydb.getCollection( shortName + \".$\" + spec.name );\n" - "var mysize = coll.storageSize();\n" - "total += coll.dataSize();\n" - "}\n" - ");\n" - "return total;\n" - "}\n" - "DBCollection.prototype.convertToCapped = function( bytes ){\n" - "if ( ! bytes )\n" - "throw \"have to specify # of bytes\";\n" - "return this._dbCommand( { convertToCapped : this._shortName , size : bytes } )\n" - "}\n" - "DBCollection.prototype.exists = function(){\n" - "return this._db.system.namespaces.findOne( { name : this._fullName } );\n" - "}\n" - "DBCollection.prototype.isCapped = function(){\n" - "var e = this.exists();\n" - "return ( e && e.options && e.options.capped ) ? true : false;\n" - "}\n" - "DBCollection.prototype.distinct = function( keyString ){\n" - "var res = this._dbCommand( { distinct : this._shortName , key : keyString } );\n" - "if ( ! res.ok )\n" - "throw \"distinct failed: \" + tojson( res );\n" - "return res.values;\n" - "}\n" - "DBCollection.prototype.group = function( params ){\n" - "params.ns = this._shortName;\n" - "return this._db.group( params );\n" - "}\n" - "DBCollection.prototype.groupcmd = function( params ){\n" - "params.ns = this._shortName;\n" - "return this._db.groupcmd( params );\n" - "}\n" - "DBCollection.prototype.toString = function(){\n" - "return this.getFullName();\n" - "}\n" - "DBCollection.prototype.shellPrint = DBCollection.prototype.toString;\n" + "for ( var k in x ) total++;\n" + "if ( total == 0 ) {\n" + "s += indent + lineEnding;}\n" + "var keys = x;\n" + "if ( typeof( x._simpleKeys ) == \"function\" )\n" + "keys = x._simpleKeys();\n" + "var num = 1;\n" + "for ( var k in keys ){\n" + "var val = x[k];\n" + "if ( val == DB.prototype || val == DBCollection.prototype )\n" + "continue;\n" + "s += indent + \"\\\"\" + k + \"\\\" : \" + tojson( val, indent , nolint );\n" + "if (num != total) {\n" + "s += \",\";\n" + "num++;}\n" + "s += lineEnding;}\n" + "indent = indent.substring(1);\n" + "return s + indent + \"}\";}\n" + "shellPrint = function( x ){\n" + "it = x;\n" + "if ( x != undefined )\n" + "shellPrintHelper( x );\n" + "if ( db ){\n" + "var e = db.getPrevError();\n" + "if ( e.err ) {\n" + "if( e.nPrev <= 1 )\n" + "print( \"error on last call: \" + tojson( e.err ) );\n" + "else\n" + "print( \"an error \" + tojson(e.err) + \" occurred \" + e.nPrev + \" operations back in the command invocation\" );}\n" + "db.resetError();}}\n" + "printjson = function(x){\n" + "print( tojson( x ) );}\n" + "shellPrintHelper = function( x ){\n" + "if ( typeof( x ) == \"undefined\" ){\n" + "if ( typeof( db ) != \"undefined\" && db.getLastError ){\n" + "var e = db.getLastError();\n" + "if ( e != null )\n" + "print( e );}\n" + "return;}\n" + "if ( x == null ){\n" + "print( \"null\" );\n" + "return;}\n" + "if ( typeof x != \"object\" )\n" + "return print( x );\n" + "var p = x.shellPrint;\n" + "if ( typeof p == \"function\" )\n" + "return x.shellPrint();\n" + "var p = x.tojson;\n" + "if ( typeof p == \"function\" )\n" + "print( x.tojson() );\n" + "else\n" + "print( tojson( x ) );}\n" + "shellHelper = function( command , rest , shouldPrint ){\n" + "command = command.trim();\n" + "var args = rest.trim().replace(/;$/,\"\").split( \"\\s+\" );\n" + "if ( ! shellHelper[command] )\n" + "throw \"no command [\" + command + \"]\";\n" + "var res = shellHelper[command].apply( null , args );\n" + "if ( shouldPrint ){\n" + "shellPrintHelper( res );}\n" + "return res;}\n" + "help = shellHelper.help = function(){\n" + "print( \"HELP\" );\n" + "print( \"\\t\" + \"show dbs show database names\");\n" + "print( \"\\t\" + \"show collections show collections in current database\");\n" + "print( \"\\t\" + \"show users show users in current database\");\n" + "print( \"\\t\" + \"show profile show most recent system.profile entries with time >= 1ms\");\n" + "print( \"\\t\" + \"use <db name> set curent database to <db name>\" );\n" + "print( \"\\t\" + \"db.help() help on DB methods\");\n" + "print( \"\\t\" + \"db.foo.help() help on collection methods\");\n" + "print( \"\\t\" + \"db.foo.find() list objects in collection foo\" );\n" + "print( \"\\t\" + \"db.foo.find( { a : 1 } ) list objects in foo where a == 1\" );\n" + "print( \"\\t\" + \"it result of the last line evaluated; use to further iterate\");}\n" + "shellHelper.use = function( dbname ){\n" + "db = db.getMongo().getDB( dbname );\n" + "print( \"switched to db \" + db.getName() );}\n" + "shellHelper.it = function(){\n" + "if ( typeof( ___it___ ) == \"undefined\" || ___it___ == null ){\n" + "print( \"no cursor\" );\n" + "return;}\n" + "shellPrintHelper( ___it___ );}\n" + "shellHelper.show = function( what ){\n" + "assert( typeof what == \"string\" );\n" + "if( what == \"profile\" ) {\n" + "if( db.system.profile.count() == 0 ) {\n" + "print(\"db.system.profile is empty\");\n" + "print(\"Use db.setProfilingLevel(2) will enable profiling\");\n" + "print(\"Use db.system.profile.find() to show raw profile entries\");}\n" + "else {\n" + "print();\n" + "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\");} )}\n" + "return \"\";}\n" + "if ( what == \"users\" ){\n" + "db.system.users.find().forEach( printjson );\n" + "return \"\";}\n" + "if ( what == \"collections\" || what == \"tables\" ) {\n" + "db.getCollectionNames().forEach( function(x){print(x)} );\n" + "return \"\";}\n" + "if ( what == \"dbs\" ) {\n" + "db.getMongo().getDBNames().sort().forEach( function(x){print(x)} );\n" + "return \"\";}\n" + "throw \"don't know how to show [\" + what + \"]\";}\n" + "if ( typeof( Map ) == \"undefined\" ){\n" + "Map = function(){\n" + "this._data = {};}}\n" + "Map.hash = function( val ){\n" + "if ( ! val )\n" + "return val;\n" + "switch ( typeof( val ) ){\n" + "case 'string':\n" + "case 'number':\n" + "case 'date':\n" + "return val.toString();\n" + "case 'object':\n" + "case 'array':\n" + "var s = \"\";\n" + "for ( var k in val ){\n" + "s += k + val[k];}\n" + "return s;}\n" + "throw \"can't hash : \" + typeof( val );}\n" + "Map.prototype.put = function( key , value ){\n" + "var o = this._get( key );\n" + "var old = o.value;\n" + "o.value = value;\n" + "return old;}\n" + "Map.prototype.get = function( key ){\n" + "return this._get( key ).value;}\n" + "Map.prototype._get = function( key ){\n" + "var h = Map.hash( key );\n" + "var a = this._data[h];\n" + "if ( ! a ){\n" + "a = [];\n" + "this._data[h] = a;}\n" + "for ( var i=0; i<a.length; i++ ){\n" + "if ( friendlyEqual( key , a[i].key ) ){\n" + "return a[i];}}\n" + "var o = { key : key , value : null };\n" + "a.push( o );\n" + "return o;}\n" + "Map.prototype.values = function(){\n" + "var all = [];\n" + "for ( var k in this._data ){\n" + "this._data[k].forEach( function(z){ all.push( z.value ); } );}\n" + "return all;}\n" + "if ( typeof( gc ) == \"undefined\" ){\n" + "gc = function(){}}\n" + "Math.sigFig = function( x , N ){\n" + "if ( ! N ){\n" + "N = 3;}\n" + "var p = Math.pow( 10, N - Math.ceil( Math.log( Math.abs(x) ) / Math.log( 10 )) );\n" + "return Math.round(x*p)/p;}\n" + "Random = function() {}\n" + "Random.srand = function( s ) { _srand( s ); }\n" + "Random.rand = function() { return _rand(); }\n" + "Random.randInt = function( n ) { return Math.floor( Random.rand() * n ); }\n" + "Random.setRandomSeed = function( s ) {\n" + "s = s || new Date().getTime();\n" + "print( \"setting random seed: \" + s );\n" + "Random.srand( s );}\n" + "Random.genExp = function( mean ) {\n" + "return -Math.log( Random.rand() ) * mean;}\n" + "killWithUris = function( uris ) {\n" + "var inprog = db.currentOp().inprog;\n" + "for( var u in uris ) {\n" + "for ( var i in inprog ) {\n" + "if ( uris[ u ] == inprog[ i ].client ) {\n" + "db.killOp( inprog[ i ].opid );}}}}\n" "if ( typeof DB == \"undefined\" ){\n" "DB = function( mongo , name ){\n" "this._mongo = mongo;\n" - "this._name = name;\n" - "}\n" - "}\n" + "this._name = name;}}\n" "DB.prototype.getMongo = function(){\n" "assert( this._mongo , \"why no mongo!\" );\n" - "return this._mongo;\n" - "}\n" + "return this._mongo;}\n" "DB.prototype.getSisterDB = function( name ){\n" - "return this.getMongo().getDB( name );\n" - "}\n" + "return this.getMongo().getDB( name );}\n" "DB.prototype.getName = function(){\n" - "return this._name;\n" - "}\n" + "return this._name;}\n" + "DB.prototype.stats = function(){\n" + "return this.runCommand( { dbstats : 1 } );}\n" "DB.prototype.getCollection = function( name ){\n" - "return new DBCollection( this._mongo , this , name , this._name + \".\" + name );\n" - "}\n" + "return new DBCollection( this._mongo , this , name , this._name + \".\" + name );}\n" "DB.prototype.commandHelp = function( name ){\n" "var c = {};\n" "c[name] = 1;\n" "c.help = true;\n" - "return this.runCommand( c ).help;\n" - "}\n" + "return this.runCommand( c ).help;}\n" "DB.prototype.runCommand = function( obj ){\n" "if ( typeof( obj ) == \"string\" ){\n" "var n = {};\n" "n[obj] = 1;\n" - "obj = n;\n" - "}\n" - "return this.getCollection( \"$cmd\" ).findOne( obj );\n" - "}\n" + "obj = n;}\n" + "return this.getCollection( \"$cmd\" ).findOne( obj );}\n" "DB.prototype._dbCommand = DB.prototype.runCommand;\n" "DB.prototype._adminCommand = function( obj ){\n" "if ( this._name == \"admin\" )\n" "return this.runCommand( obj );\n" - "return this.getSisterDB( \"admin\" ).runCommand( obj );\n" - "}\n" - "DB.prototype.addUser = function( username , pass ){\n" + "return this.getSisterDB( \"admin\" ).runCommand( obj );}\n" + "DB.prototype.addUser = function( username , pass, readOnly ){\n" + "readOnly = readOnly || false;\n" "var c = this.getCollection( \"system.users\" );\n" "var u = c.findOne( { user : username } ) || { user : username };\n" + "u.readOnly = readOnly;\n" "u.pwd = hex_md5( username + \":mongo:\" + pass );\n" "print( tojson( u ) );\n" - "c.save( u );\n" - "}\n" + "c.save( u );}\n" "DB.prototype.removeUser = function( username ){\n" - "this.getCollection( \"system.users\" ).remove( { user : username } );\n" - "}\n" + "this.getCollection( \"system.users\" ).remove( { user : username } );}\n" + "DB.prototype.__pwHash = function( nonce, username, pass ) {\n" + "return hex_md5( nonce + username + hex_md5( username + \":mongo:\" + pass ) );}\n" "DB.prototype.auth = function( username , pass ){\n" "var n = this.runCommand( { getnonce : 1 } );\n" "var a = this.runCommand(\n" @@ -464,277 +618,127 @@ const char * jsconcatcode = "authenticate : 1 ,\n" "user : username ,\n" "nonce : n.nonce ,\n" - "key : hex_md5( n.nonce + username + hex_md5( username + \":mongo:\" + pass ) )\n" - "}\n" + "key : this.__pwHash( n.nonce, username, pass )}\n" ");\n" - "return a.ok;\n" - "}\n" - "/**\n" - "Create a new collection in the database. Normally, collection creation is automatic. You would\n" - "use this function if you wish to specify special options on creation.\n" - "If the collection already exists, no action occurs.\n" - "<p>Options:</p>\n" - "<ul>\n" - "<li>\n" - "size: desired initial extent size for the collection. Must be <= 1000000000.\n" - "for fixed size (capped) collections, this size is the total/max size of the\n" - "collection.\n" - "</li>\n" - "<li>\n" - "capped: if true, this is a capped collection (where old data rolls out).\n" - "</li>\n" - "<li> max: maximum number of objects if capped (optional).</li>\n" - "</ul>\n" - "<p>Example: </p>\n" - "<code>db.createCollection(\"movies\", { size: 10 * 1024 * 1024, capped:true } );</code>\n" - "* @param {String} name Name of new collection to create\n" - "* @param {Object} options Object with options for call. Options are listed above.\n" - "* @return SOMETHING_FIXME\n" - "*/\n" + "return a.ok;}\n" + "\n" "DB.prototype.createCollection = function(name, opt) {\n" "var options = opt || {};\n" "var cmd = { create: name, capped: options.capped, size: options.size, max: options.max };\n" "var res = this._dbCommand(cmd);\n" - "return res;\n" - "}\n" - "/**\n" - "* Returns the current profiling level of this database\n" - "* @return SOMETHING_FIXME or null on error\n" - "*/\n" + "return res;}\n" + "\n" "DB.prototype.getProfilingLevel = function() {\n" "var res = this._dbCommand( { profile: -1 } );\n" - "return res ? res.was : null;\n" - "}\n" - "/**\n" - "Erase the entire database. (!)\n" - "* @return Object returned has member ok set to true if operation succeeds, false otherwise.\n" - "*/\n" + "return res ? res.was : null;}\n" + "\n" "DB.prototype.dropDatabase = function() {\n" "if ( arguments.length )\n" "throw \"dropDatabase doesn't take arguments\";\n" - "return this._dbCommand( { dropDatabase: 1 } );\n" - "}\n" + "return this._dbCommand( { dropDatabase: 1 } );}\n" "DB.prototype.shutdownServer = function() {\n" "if( \"admin\" != this._name ){\n" - "return \"shutdown command only works with the admin database; try 'use admin'\";\n" - "}\n" + "return \"shutdown command only works with the admin database; try 'use admin'\";}\n" "try {\n" - "this._dbCommand(\"shutdown\");\n" - "throw \"shutdownServer failed\";\n" - "}\n" + "var res = this._dbCommand(\"shutdown\");\n" + "if( res )\n" + "throw \"shutdownServer failed: \" + res.errmsg;\n" + "throw \"shutdownServer failed\";}\n" "catch ( e ){\n" "assert( tojson( e ).indexOf( \"error doing query: failed\" ) >= 0 , \"unexpected error: \" + tojson( e ) );\n" - "print( \"server should be down...\" );\n" - "}\n" - "}\n" - "/**\n" - "Clone database on another server to here.\n" - "<p>\n" - "Generally, you should dropDatabase() first as otherwise the cloned information will MERGE\n" - "into whatever data is already present in this database. (That is however a valid way to use\n" - "clone if you are trying to do something intentionally, such as union three non-overlapping\n" - "databases into one.)\n" - "<p>\n" - "This is a low level administrative function will is not typically used.\n" - "* @param {String} from Where to clone from (dbhostname[:port]). May not be this database\n" - "(self) as you cannot clone to yourself.\n" - "* @return Object returned has member ok set to true if operation succeeds, false otherwise.\n" - "* See also: db.copyDatabase()\n" - "*/\n" + "print( \"server should be down...\" );}}\n" + "\n" "DB.prototype.cloneDatabase = function(from) {\n" "assert( isString(from) && from.length );\n" - "return this._dbCommand( { clone: from } );\n" - "}\n" - "/**\n" - "Clone collection on another server to here.\n" - "<p>\n" - "Generally, you should drop() first as otherwise the cloned information will MERGE\n" - "into whatever data is already present in this collection. (That is however a valid way to use\n" - "clone if you are trying to do something intentionally, such as union three non-overlapping\n" - "collections into one.)\n" - "<p>\n" - "This is a low level administrative function is not typically used.\n" - "* @param {String} from mongod instance from which to clnoe (dbhostname:port). May\n" - "not be this mongod instance, as clone from self is not allowed.\n" - "* @param {String} collection name of collection to clone.\n" - "* @param {Object} query query specifying which elements of collection are to be cloned.\n" - "* @return Object returned has member ok set to true if operation succeeds, false otherwise.\n" - "* See also: db.cloneDatabase()\n" - "*/\n" + "return this._dbCommand( { clone: from } );}\n" + "\n" "DB.prototype.cloneCollection = function(from, collection, query) {\n" "assert( isString(from) && from.length );\n" "assert( isString(collection) && collection.length );\n" "collection = this._name + \".\" + collection;\n" "query = query || {};\n" - "return this._dbCommand( { cloneCollection:collection, from:from, query:query } );\n" - "}\n" - "/**\n" - "Copy database from one server or name to another server or name.\n" - "Generally, you should dropDatabase() first as otherwise the copied information will MERGE\n" - "into whatever data is already present in this database (and you will get duplicate objects\n" - "in collections potentially.)\n" - "For security reasons this function only works when executed on the \"admin\" db. However,\n" - "if you have access to said db, you can copy any database from one place to another.\n" - "This method provides a way to \"rename\" a database by copying it to a new db name and\n" - "location. Additionally, it effectively provides a repair facility.\n" - "* @param {String} fromdb database name from which to copy.\n" - "* @param {String} todb database name to copy to.\n" - "* @param {String} fromhost hostname of the database (and optionally, \":port\") from which to\n" - "copy the data. default if unspecified is to copy from self.\n" - "* @return Object returned has member ok set to true if operation succeeds, false otherwise.\n" - "* See also: db.clone()\n" - "*/\n" - "DB.prototype.copyDatabase = function(fromdb, todb, fromhost) {\n" + "return this._dbCommand( { cloneCollection:collection, from:from, query:query } );}\n" + "\n" + "DB.prototype.copyDatabase = function(fromdb, todb, fromhost, username, password) {\n" "assert( isString(fromdb) && fromdb.length );\n" "assert( isString(todb) && todb.length );\n" "fromhost = fromhost || \"\";\n" - "return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb, todb:todb } );\n" - "}\n" - "/**\n" - "Repair database.\n" - "* @return Object returned has member ok set to true if operation succeeds, false otherwise.\n" - "*/\n" + "if ( username && password ) {\n" + "var n = this._adminCommand( { copydbgetnonce : 1, fromhost:fromhost } );\n" + "return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb, todb:todb, username:username, nonce:n.nonce, key:this.__pwHash( n.nonce, username, password ) } );\n" + "} else {\n" + "return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb, todb:todb } );}}\n" + "\n" "DB.prototype.repairDatabase = function() {\n" - "return this._dbCommand( { repairDatabase: 1 } );\n" - "}\n" + "return this._dbCommand( { repairDatabase: 1 } );}\n" "DB.prototype.help = function() {\n" "print(\"DB methods:\");\n" + "print(\"\\tdb.addUser(username, password[, readOnly=false])\");\n" "print(\"\\tdb.auth(username, password)\");\n" - "print(\"\\tdb.getMongo() get the server connection object\");\n" - "print(\"\\tdb.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair\");\n" - "print(\"\\tdb.getSisterDB(name) get the db at the same server as this onew\");\n" - "print(\"\\tdb.getName()\");\n" - "print(\"\\tdb.getCollection(cname) same as db['cname'] or db.cname\");\n" - "print(\"\\tdb.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 }\");\n" - "print(\"\\tdb.commandHelp(name) returns the help for the command\");\n" - "print(\"\\tdb.addUser(username, password)\");\n" - "print(\"\\tdb.removeUser(username)\");\n" - "print(\"\\tdb.createCollection(name, { size : ..., capped : ..., max : ... } )\");\n" - "print(\"\\tdb.getReplicationInfo()\");\n" - "print(\"\\tdb.printReplicationInfo()\");\n" - "print(\"\\tdb.printSlaveReplicationInfo()\");\n" - "print(\"\\tdb.getProfilingLevel()\");\n" - "print(\"\\tdb.setProfilingLevel(level) 0=off 1=slow 2=all\");\n" "print(\"\\tdb.cloneDatabase(fromhost)\");\n" + "print(\"\\tdb.commandHelp(name) returns the help for the command\");\n" "print(\"\\tdb.copyDatabase(fromdb, todb, fromhost)\");\n" - "print(\"\\tdb.shutdownServer()\");\n" + "print(\"\\tdb.createCollection(name, { size : ..., capped : ..., max : ... } )\");\n" + "print(\"\\tdb.currentOp() displays the current operation in the db\" );\n" "print(\"\\tdb.dropDatabase()\");\n" - "print(\"\\tdb.repairDatabase()\");\n" "print(\"\\tdb.eval(func, args) run code server-side\");\n" + "print(\"\\tdb.getCollection(cname) same as db['cname'] or db.cname\");\n" + "print(\"\\tdb.getCollectionNames()\");\n" "print(\"\\tdb.getLastError() - just returns the err msg string\");\n" "print(\"\\tdb.getLastErrorObj() - return full status object\");\n" + "print(\"\\tdb.getMongo() get the server connection object\");\n" + "print(\"\\tdb.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair\");\n" + "print(\"\\tdb.getName()\");\n" "print(\"\\tdb.getPrevError()\");\n" - "print(\"\\tdb.resetError()\");\n" - "print(\"\\tdb.getCollectionNames()\");\n" - "print(\"\\tdb.currentOp() displays the current operation in the db\" );\n" - "print(\"\\tdb.killOp() kills the current operation in the db\" );\n" + "print(\"\\tdb.getProfilingLevel()\");\n" + "print(\"\\tdb.getReplicationInfo()\");\n" + "print(\"\\tdb.getSisterDB(name) get the db at the same server as this onew\");\n" + "print(\"\\tdb.killOp(opid) kills the current operation in the db\" );\n" "print(\"\\tdb.printCollectionStats()\" );\n" - "print(\"\\tdb.version() current version of the server\" );\n" - "}\n" + "print(\"\\tdb.printReplicationInfo()\");\n" + "print(\"\\tdb.printSlaveReplicationInfo()\");\n" + "print(\"\\tdb.printShardingStatus()\");\n" + "print(\"\\tdb.removeUser(username)\");\n" + "print(\"\\tdb.repairDatabase()\");\n" + "print(\"\\tdb.resetError()\");\n" + "print(\"\\tdb.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 }\");\n" + "print(\"\\tdb.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all\");\n" + "print(\"\\tdb.shutdownServer()\");\n" + "print(\"\\tdb.stats()\");\n" + "print(\"\\tdb.version() current version of the server\" );}\n" "DB.prototype.printCollectionStats = function(){\n" + "var mydb = this;\n" "this.getCollectionNames().forEach(\n" "function(z){\n" "print( z );\n" - "printjson( db[z].stats() );\n" - "print( \"---\" );\n" - "}\n" - ");\n" - "}\n" - "/**\n" - "* <p> Set profiling level for your db. Profiling gathers stats on query performance. </p>\n" - "*\n" - "* <p>Default is off, and resets to off on a database restart -- so if you want it on,\n" - "* turn it on periodically. </p>\n" - "*\n" - "* <p>Levels :</p>\n" - "* <ul>\n" - "* <li>0=off</li>\n" - "* <li>1=log very slow (>100ms) operations</li>\n" - "* <li>2=log all</li>\n" - "* @param {String} level Desired level of profiling\n" - "* @return SOMETHING_FIXME or null on error\n" - "*/\n" - "DB.prototype.setProfilingLevel = function(level) {\n" + "printjson( mydb.getCollection(z).stats() );\n" + "print( \"---\" );}\n" + ");}\n" + "\n" + "DB.prototype.setProfilingLevel = function(level,slowms) {\n" "if (level < 0 || level > 2) {\n" - "throw { dbSetProfilingException : \"input level \" + level + \" is out of range [0..2]\" };\n" - "}\n" - "if (level) {\n" - "this.createCollection(\"system.profile\", { capped: true, size: 128 * 1024 } );\n" - "}\n" - "return this._dbCommand( { profile: level } );\n" - "}\n" - "/**\n" - "* <p> Evaluate a js expression at the database server.</p>\n" - "*\n" - "* <p>Useful if you need to touch a lot of data lightly; in such a scenario\n" - "* the network transfer of the data could be a bottleneck. A good example\n" - "* is \"select count(*)\" -- can be done server side via this mechanism.\n" - "* </p>\n" - "*\n" - "* <p>\n" - "* If the eval fails, an exception is thrown of the form:\n" - "* </p>\n" - "* <code>{ dbEvalException: { retval: functionReturnValue, ok: num [, errno: num] [, errmsg: str] } }</code>\n" - "*\n" - "* <p>Example: </p>\n" - "* <code>print( \"mycount: \" + db.eval( function(){db.mycoll.find({},{_id:ObjId()}).length();} );</code>\n" - "*\n" - "* @param {Function} jsfunction Javascript function to run on server. Note this it not a closure, but rather just \"code\".\n" - "* @return result of your function, or null if error\n" - "*\n" - "*/\n" + "throw { dbSetProfilingException : \"input level \" + level + \" is out of range [0..2]\" };}\n" + "var cmd = { profile: level };\n" + "if ( slowms )\n" + "cmd[\"slowms\"] = slowms;\n" + "return this._dbCommand( cmd );}\n" + "\n" "DB.prototype.eval = function(jsfunction) {\n" "var cmd = { $eval : jsfunction };\n" "if ( arguments.length > 1 ) {\n" - "cmd.args = argumentsToArray( arguments ).slice(1);\n" - "}\n" + "cmd.args = argumentsToArray( arguments ).slice(1);}\n" "var res = this._dbCommand( cmd );\n" "if (!res.ok)\n" "throw tojson( res );\n" - "return res.retval;\n" - "}\n" + "return res.retval;}\n" "DB.prototype.dbEval = DB.prototype.eval;\n" - "/**\n" - "*\n" - "* <p>\n" - "* Similar to SQL group by. For example: </p>\n" - "*\n" - "* <code>select a,b,sum(c) csum from coll where active=1 group by a,b</code>\n" - "*\n" - "* <p>\n" - "* corresponds to the following in 10gen:\n" - "* </p>\n" - "*\n" - "* <code>\n" - "db.group(\n" - "{\n" - "ns: \"coll\",\n" - "key: { a:true, b:true },\n" - "cond: { active:1 },\n" - "reduce: function(obj,prev) { prev.csum += obj.c; } ,\n" - "initial: { csum: 0 }\n" - "});\n" - "</code>\n" - "*\n" - "*\n" - "* <p>\n" - "* An array of grouped items is returned. The array must fit in RAM, thus this function is not\n" - "* suitable when the return set is extremely large.\n" - "* </p>\n" - "* <p>\n" - "* To order the grouped data, simply sort it client side upon return.\n" - "* <p>\n" - "Defaults\n" - "cond may be null if you want to run against all rows in the collection\n" - "keyf is a function which takes an object and returns the desired key. set either key or keyf (not both).\n" - "* </p>\n" - "*/\n" + "\n" "DB.prototype.groupeval = function(parmsObj) {\n" "var groupFunction = function() {\n" "var parms = args[0];\n" "var c = db[parms.ns].find(parms.cond||{});\n" "var map = new Map();\n" - "var pks = parms.key ? parms.key.keySet() : null;\n" + "var pks = parms.key ? Object.keySet( parms.key ) : null;\n" "var pkl = pks ? pks.length : 0;\n" "var key = {};\n" "while( c.hasNext() ) {\n" @@ -742,114 +746,82 @@ const char * jsconcatcode = "if ( pks ) {\n" "for( var i=0; i<pkl; i++ ){\n" "var k = pks[i];\n" - "key[k] = obj[k];\n" - "}\n" - "}\n" + "key[k] = obj[k];}}\n" "else {\n" - "key = parms.$keyf(obj);\n" - "}\n" + "key = parms.$keyf(obj);}\n" "var aggObj = map.get(key);\n" "if( aggObj == null ) {\n" "var newObj = Object.extend({}, key);\n" "aggObj = Object.extend(newObj, parms.initial)\n" - "map.put( key , aggObj );\n" - "}\n" - "parms.$reduce(obj, aggObj);\n" - "}\n" - "return map.values();\n" - "}\n" - "return this.eval(groupFunction, this._groupFixParms( parmsObj ));\n" - "}\n" + "map.put( key , aggObj );}\n" + "parms.$reduce(obj, aggObj);}\n" + "return map.values();}\n" + "return this.eval(groupFunction, this._groupFixParms( parmsObj ));}\n" "DB.prototype.groupcmd = function( parmsObj ){\n" "var ret = this.runCommand( { \"group\" : this._groupFixParms( parmsObj ) } );\n" "if ( ! ret.ok ){\n" - "throw \"group command failed: \" + tojson( ret );\n" - "}\n" - "return ret.retval;\n" - "}\n" + "throw \"group command failed: \" + tojson( ret );}\n" + "return ret.retval;}\n" "DB.prototype.group = DB.prototype.groupcmd;\n" "DB.prototype._groupFixParms = function( parmsObj ){\n" "var parms = Object.extend({}, parmsObj);\n" "if( parms.reduce ) {\n" "parms.$reduce = parms.reduce;\n" - "delete parms.reduce;\n" - "}\n" + "delete parms.reduce;}\n" "if( parms.keyf ) {\n" "parms.$keyf = parms.keyf;\n" - "delete parms.keyf;\n" - "}\n" - "return parms;\n" - "}\n" + "delete parms.keyf;}\n" + "return parms;}\n" "DB.prototype.resetError = function(){\n" - "return this.runCommand( { reseterror : 1 } );\n" - "}\n" + "return this.runCommand( { reseterror : 1 } );}\n" "DB.prototype.forceError = function(){\n" - "return this.runCommand( { forceerror : 1 } );\n" - "}\n" + "return this.runCommand( { forceerror : 1 } );}\n" "DB.prototype.getLastError = function(){\n" "var res = this.runCommand( { getlasterror : 1 } );\n" "if ( ! res.ok )\n" "throw \"getlasterror failed: \" + tojson( res );\n" - "return res.err;\n" - "}\n" + "return res.err;}\n" "DB.prototype.getLastErrorObj = function(){\n" "var res = this.runCommand( { getlasterror : 1 } );\n" "if ( ! res.ok )\n" "throw \"getlasterror failed: \" + tojson( res );\n" - "return res;\n" - "}\n" + "return res;}\n" + "DB.prototype.getLastErrorCmd = DB.prototype.getLastErrorObj;\n" "/* Return the last error which has occurred, even if not the very last error.\n" "Returns:\n" "{ err : <error message>, nPrev : <how_many_ops_back_occurred>, ok : 1 }\n" "result.err will be null if no error has occurred.\n" "*/\n" "DB.prototype.getPrevError = function(){\n" - "return this.runCommand( { getpreverror : 1 } );\n" - "}\n" + "return this.runCommand( { getpreverror : 1 } );}\n" "DB.prototype.getCollectionNames = function(){\n" "var all = [];\n" "var nsLength = this._name.length + 1;\n" "this.getCollection( \"system.namespaces\" ).find().sort({name:1}).forEach(\n" "function(z){\n" "var name = z.name;\n" - "if ( name.indexOf( \"$\" ) >= 0 )\n" + "if ( name.indexOf( \"$\" ) >= 0 && name != \"local.oplog.$main\" )\n" "return;\n" - "all.push( name.substring( nsLength ) );\n" - "}\n" + "all.push( name.substring( nsLength ) );}\n" ");\n" - "return all;\n" - "}\n" + "return all;}\n" "DB.prototype.tojson = function(){\n" - "return this._name;\n" - "}\n" + "return this._name;}\n" "DB.prototype.toString = function(){\n" - "return this._name;\n" - "}\n" + "return this._name;}\n" "DB.prototype.currentOp = function(){\n" - "return db.$cmd.sys.inprog.findOne();\n" - "}\n" + "return db.$cmd.sys.inprog.findOne();}\n" "DB.prototype.currentOP = DB.prototype.currentOp;\n" - "DB.prototype.killOp = function(){\n" - "return db.$cmd.sys.killop.findOne();\n" - "}\n" + "DB.prototype.killOp = function(op) {\n" + "if( !op )\n" + "throw \"no opNum to kill specified\";\n" + "return db.$cmd.sys.killop.findOne({'op':op});}\n" "DB.prototype.killOP = DB.prototype.killOp;\n" - "/**\n" - "Get a replication log information summary.\n" - "<p>\n" - "This command is for the database/cloud administer and not applicable to most databases.\n" - "It is only used with the local database. One might invoke from the JS shell:\n" - "<pre>\n" - "use local\n" - "db.getReplicationInfo();\n" - "</pre>\n" - "It is assumed that this database is a replication master -- the information returned is\n" - "about the operation log stored at local.oplog.$main on the replication master. (It also\n" - "works on a machine in a replica pair: for replica pairs, both machines are \"masters\" from\n" - "an internal database perspective.\n" - "<p>\n" - "* @return Object timeSpan: time span of the oplog from start to end if slave is more out\n" - "* of date than that, it can't recover without a complete resync\n" - "*/\n" + "DB.tsToSeconds = function(x){\n" + "if ( x.t && x.i )\n" + "return x.t / 1000;\n" + "return x / 4294967296;}\n" + "\n" "DB.prototype.getReplicationInfo = function() {\n" "var db = this.getSisterDB(\"local\");\n" "var result = { };\n" @@ -858,81 +830,66 @@ const char * jsconcatcode = "result.logSizeMB = ol.options.size / 1000 / 1000;\n" "} else {\n" "result.errmsg = \"local.oplog.$main, or its options, not found in system.namespaces collection (not --master?)\";\n" - "return result;\n" - "}\n" + "return result;}\n" "var firstc = db.oplog.$main.find().sort({$natural:1}).limit(1);\n" "var lastc = db.oplog.$main.find().sort({$natural:-1}).limit(1);\n" "if( !firstc.hasNext() || !lastc.hasNext() ) {\n" "result.errmsg = \"objects not found in local.oplog.$main -- is this a new and empty db instance?\";\n" "result.oplogMainRowCount = db.oplog.$main.count();\n" - "return result;\n" - "}\n" + "return result;}\n" "var first = firstc.next();\n" "var last = lastc.next();\n" "{\n" "var tfirst = first.ts;\n" "var tlast = last.ts;\n" "if( tfirst && tlast ) {\n" - "tfirst = tfirst / 4294967296;\n" - "tlast = tlast / 4294967296;\n" + "tfirst = DB.tsToSeconds( tfirst );\n" + "tlast = DB.tsToSeconds( tlast );\n" "result.timeDiff = tlast - tfirst;\n" "result.timeDiffHours = Math.round(result.timeDiff / 36)/100;\n" "result.tFirst = (new Date(tfirst*1000)).toString();\n" "result.tLast = (new Date(tlast*1000)).toString();\n" - "result.now = Date();\n" - "}\n" + "result.now = Date();}\n" "else {\n" - "result.errmsg = \"ts element not found in oplog objects\";\n" - "}\n" - "}\n" - "return result;\n" - "}\n" + "result.errmsg = \"ts element not found in oplog objects\";}}\n" + "return result;}\n" "DB.prototype.printReplicationInfo = function() {\n" "var result = this.getReplicationInfo();\n" "if( result.errmsg ) {\n" "print(tojson(result));\n" - "return;\n" - "}\n" + "return;}\n" "print(\"configured oplog size: \" + result.logSizeMB + \"MB\");\n" "print(\"log length start to end: \" + result.timeDiff + \"secs (\" + result.timeDiffHours + \"hrs)\");\n" "print(\"oplog first event time: \" + result.tFirst);\n" "print(\"oplog last event time: \" + result.tLast);\n" - "print(\"now: \" + result.now);\n" - "}\n" + "print(\"now: \" + result.now);}\n" "DB.prototype.printSlaveReplicationInfo = function() {\n" "function g(x) {\n" "print(\"source: \" + x.host);\n" - "var st = new Date(x.syncedTo/4294967296*1000);\n" + "var st = new Date( DB.tsToSeconds( x.syncedTo ) * 1000 );\n" "var now = new Date();\n" "print(\"syncedTo: \" + st.toString() );\n" "var ago = (now-st)/1000;\n" "var hrs = Math.round(ago/36)/100;\n" - "print(\" = \" + Math.round(ago) + \"secs ago (\" + hrs + \"hrs)\");\n" - "}\n" + "print(\" = \" + Math.round(ago) + \"secs ago (\" + hrs + \"hrs)\");}\n" "var L = this.getSisterDB(\"local\");\n" "if( L.sources.count() == 0 ) {\n" "print(\"local.sources is empty; is this db a --slave?\");\n" - "return;\n" - "}\n" - "L.sources.find().forEach(g);\n" - "}\n" + "return;}\n" + "L.sources.find().forEach(g);}\n" "DB.prototype.serverBuildInfo = function(){\n" - "return this._adminCommand( \"buildinfo\" );\n" - "}\n" + "return this._adminCommand( \"buildinfo\" );}\n" "DB.prototype.serverStatus = function(){\n" - "return this._adminCommand( \"serverStatus\" );\n" - "}\n" + "return this._adminCommand( \"serverStatus\" );}\n" "DB.prototype.version = function(){\n" - "return this.serverBuildInfo().version;\n" - "}\n" + "return this.serverBuildInfo().version;}\n" + "DB.prototype.printShardingStatus = function(){\n" + "printShardingStatus( this.getSisterDB( \"config\" ) );}\n" "if ( typeof Mongo == \"undefined\" ){\n" "Mongo = function( host ){\n" - "this.init( host );\n" - "}\n" - "}\n" + "this.init( host );}}\n" "if ( ! Mongo.prototype ){\n" - "throw \"Mongo.prototype not defined\";\n" - "}\n" + "throw \"Mongo.prototype not defined\";}\n" "if ( ! Mongo.prototype.find )\n" "Mongo.prototype.find = function( ns , query , fields , limit , skip ){ throw \"find not implemented\"; }\n" "if ( ! Mongo.prototype.insert )\n" @@ -942,31 +899,31 @@ const char * jsconcatcode = "if ( ! Mongo.prototype.update )\n" "Mongo.prototype.update = function( ns , query , obj , upsert ){ throw \"update not implemented;\" }\n" "if ( typeof mongoInject == \"function\" ){\n" - "mongoInject( Mongo.prototype );\n" - "}\n" + "mongoInject( Mongo.prototype );}\n" "Mongo.prototype.setSlaveOk = function() {\n" - "this.slaveOk = true;\n" - "}\n" + "this.slaveOk = true;}\n" "Mongo.prototype.getDB = function( name ){\n" - "return new DB( this , name );\n" - "}\n" + "return new DB( this , name );}\n" "Mongo.prototype.getDBs = function(){\n" "var res = this.getDB( \"admin\" ).runCommand( { \"listDatabases\" : 1 } );\n" - "assert( res.ok == 1 , \"listDatabases failed\" );\n" - "return res;\n" - "}\n" + "assert( res.ok == 1 , \"listDatabases failed:\" + tojson( res ) );\n" + "return res;}\n" "Mongo.prototype.getDBNames = function(){\n" "return this.getDBs().databases.map(\n" "function(z){\n" - "return z.name;\n" - "}\n" - ");\n" - "}\n" + "return z.name;}\n" + ");}\n" + "Mongo.prototype.getCollection = function(ns){\n" + "var idx = ns.indexOf( \".\" );\n" + "if ( idx < 0 )\n" + "throw \"need . in ns\";\n" + "var db = ns.substring( 0 , idx );\n" + "var c = ns.substring( idx + 1 );\n" + "return this.getDB( db ).getCollection( c );}\n" "Mongo.prototype.toString = function(){\n" - "return \"mongo connection to \" + this.host;\n" - "}\n" + "return \"mongo connection to \" + this.host;}\n" "connect = function( url , user , pass ){\n" - "print( \"connecting to: \" + url )\n" + "chatty( \"connecting to: \" + url )\n" "if ( user && ! pass )\n" "throw \"you specified a user and not a password. either you need a password, or you're using the old connect api\";\n" "var idx = url.indexOf( \"/\" );\n" @@ -977,33 +934,33 @@ const char * jsconcatcode = "db = new Mongo( url.substring( 0 , idx ) ).getDB( url.substring( idx + 1 ) );\n" "if ( user && pass ){\n" "if ( ! db.auth( user , pass ) ){\n" - "throw \"couldn't login\";\n" - "}\n" - "}\n" - "return db;\n" - "}\n" + "throw \"couldn't login\";}}\n" + "return db;}\n" "MR = {};\n" "MR.init = function(){\n" "$max = 0;\n" "$arr = [];\n" "emit = MR.emit;\n" - "gc();\n" - "}\n" + "$numEmits = 0;\n" + "$numReduces = 0;\n" + "$numReducesToDB = 0;\n" + "gc();}\n" "MR.cleanup = function(){\n" "MR.init();\n" - "gc();\n" - "}\n" + "gc();}\n" "MR.emit = function(k,v){\n" - "var num = get_num( k );\n" + "$numEmits++;\n" + "var num = nativeHelper.apply( get_num_ , [ k ] );\n" "var data = $arr[num];\n" "if ( ! data ){\n" - "data = { key : k , values : [] };\n" - "$arr[num] = data;\n" - "}\n" - "data.values.push( v );\n" - "$max = Math.max( $max , data.values.length );\n" - "}\n" + "data = { key : k , values : new Array(1000) , count : 0 };\n" + "$arr[num] = data;}\n" + "data.values[data.count++] = v;\n" + "$max = Math.max( $max , data.count );}\n" "MR.doReduce = function( useDB ){\n" + "$numReduces++;\n" + "if ( useDB )\n" + "$numReducesToDB++;\n" "$max = 0;\n" "for ( var i=0; i<$arr.length; i++){\n" "var data = $arr[i];\n" @@ -1012,44 +969,40 @@ const char * jsconcatcode = "if ( useDB ){\n" "var x = tempcoll.findOne( { _id : data.key } );\n" "if ( x ){\n" - "data.values.push( x.value );\n" - "}\n" - "}\n" - "var r = $reduce( data.key , data.values );\n" - "if ( r.length && r[0] ){\n" + "data.values[data.count++] = x.value;}}\n" + "var r = $reduce( data.key , data.values.slice( 0 , data.count ) );\n" + "if ( r && r.length && r[0] ){\n" "data.values = r;\n" - "}\n" + "data.count = r.length;}\n" "else{\n" - "data.values = [ r ];\n" - "}\n" - "$max = Math.max( $max , data.values.length );\n" + "data.values[0] = r;\n" + "data.count = 1;}\n" + "$max = Math.max( $max , data.count );\n" "if ( useDB ){\n" - "if ( data.values.length == 1 ){\n" - "tempcoll.save( { _id : data.key , value : data.values[0] } );\n" - "}\n" + "if ( data.count == 1 ){\n" + "tempcoll.save( { _id : data.key , value : data.values[0] } );}\n" "else {\n" - "tempcoll.save( { _id : data.key , value : data.values } );\n" - "}\n" - "}\n" - "}\n" - "}\n" + "tempcoll.save( { _id : data.key , value : data.values.slice( 0 , data.count ) } );}}}}\n" "MR.check = function(){\n" "if ( $max < 2000 && $arr.length < 1000 ){\n" - "return 0;\n" - "}\n" + "return 0;}\n" "MR.doReduce();\n" "if ( $max < 2000 && $arr.length < 1000 ){\n" - "return 1;\n" - "}\n" + "return 1;}\n" "MR.doReduce( true );\n" "$arr = [];\n" "$max = 0;\n" "reset_num();\n" "gc();\n" - "return 2;\n" - "}\n" + "return 2;}\n" + "MR.finalize = function(){\n" + "tempcoll.find().forEach(\n" + "function(z){\n" + "z.value = $finalize( z._id , z.value );\n" + "tempcoll.save( z );}\n" + ");}\n" "if ( typeof DBQuery == \"undefined\" ){\n" - "DBQuery = function( mongo , db , collection , ns , query , fields , limit , skip ){\n" + "DBQuery = function( mongo , db , collection , ns , query , fields , limit , skip , batchSize ){\n" "this._mongo = mongo;\n" "this._db = db;\n" "this._collection = collection;\n" @@ -1058,65 +1011,60 @@ const char * jsconcatcode = "this._fields = fields;\n" "this._limit = limit || 0;\n" "this._skip = skip || 0;\n" + "this._batchSize = batchSize || 0;\n" "this._cursor = null;\n" "this._numReturned = 0;\n" - "this._special = false;\n" - "}\n" - "print( \"DBQuery probably won't have array access \" );\n" - "}\n" + "this._special = false;}\n" + "print( \"DBQuery probably won't have array access \" );}\n" "DBQuery.prototype.help = function(){\n" "print( \"DBQuery help\" );\n" "print( \"\\t.sort( {...} )\" )\n" "print( \"\\t.limit( n )\" )\n" "print( \"\\t.skip( n )\" )\n" - "print( \"\\t.count()\" )\n" + "print( \"\\t.count() - total # of objects matching query, ignores skip,limit\" )\n" + "print( \"\\t.size() - total # of objects cursor would return skip,limit effect this\" )\n" "print( \"\\t.explain()\" )\n" "print( \"\\t.forEach( func )\" )\n" - "print( \"\\t.map( func )\" )\n" - "}\n" + "print( \"\\t.map( func )\" )}\n" "DBQuery.prototype.clone = function(){\n" "var q = new DBQuery( this._mongo , this._db , this._collection , this._ns ,\n" "this._query , this._fields ,\n" - "this._limit , this._skip );\n" + "this._limit , this._skip , this._batchSize );\n" "q._special = this._special;\n" - "return q;\n" - "}\n" + "return q;}\n" "DBQuery.prototype._ensureSpecial = function(){\n" "if ( this._special )\n" "return;\n" "var n = { query : this._query };\n" "this._query = n;\n" - "this._special = true;\n" - "}\n" + "this._special = true;}\n" "DBQuery.prototype._checkModify = function(){\n" "if ( this._cursor )\n" - "throw \"query already executed\";\n" - "}\n" + "throw \"query already executed\";}\n" "DBQuery.prototype._exec = function(){\n" "if ( ! this._cursor ){\n" "assert.eq( 0 , this._numReturned );\n" - "this._cursor = this._mongo.find( this._ns , this._query , this._fields , this._limit , this._skip );\n" - "this._cursorSeen = 0;\n" - "}\n" - "return this._cursor;\n" - "}\n" + "this._cursor = this._mongo.find( this._ns , this._query , this._fields , this._limit , this._skip , this._batchSize );\n" + "this._cursorSeen = 0;}\n" + "return this._cursor;}\n" "DBQuery.prototype.limit = function( limit ){\n" "this._checkModify();\n" "this._limit = limit;\n" - "return this;\n" - "}\n" + "return this;}\n" + "DBQuery.prototype.batchSize = function( batchSize ){\n" + "this._checkModify();\n" + "this._batchSize = batchSize;\n" + "return this;}\n" "DBQuery.prototype.skip = function( skip ){\n" "this._checkModify();\n" "this._skip = skip;\n" - "return this;\n" - "}\n" + "return this;}\n" "DBQuery.prototype.hasNext = function(){\n" "this._exec();\n" "if ( this._limit > 0 && this._cursorSeen >= this._limit )\n" "return false;\n" "var o = this._cursor.hasNext();\n" - "return o;\n" - "}\n" + "return o;}\n" "DBQuery.prototype.next = function(){\n" "this._exec();\n" "var o = this._cursor.hasNext();\n" @@ -1128,8 +1076,7 @@ const char * jsconcatcode = "if ( ret.$err && this._numReturned == 0 && ! this.hasNext() )\n" "throw \"error: \" + tojson( ret );\n" "this._numReturned++;\n" - "return ret;\n" - "}\n" + "return ret;}\n" "DBQuery.prototype.toArray = function(){\n" "if ( this._arr )\n" "return this._arr;\n" @@ -1137,886 +1084,446 @@ const char * jsconcatcode = "while ( this.hasNext() )\n" "a.push( this.next() );\n" "this._arr = a;\n" - "return a;\n" - "}\n" - "DBQuery.prototype.count = function(){\n" + "return a;}\n" + "DBQuery.prototype.count = function( applySkipLimit ){\n" "var cmd = { count: this._collection.getName() };\n" "if ( this._query ){\n" "if ( this._special )\n" "cmd.query = this._query.query;\n" "else\n" - "cmd.query = this._query;\n" - "}\n" + "cmd.query = this._query;}\n" "cmd.fields = this._fields || {};\n" + "if ( applySkipLimit ){\n" + "if ( this._limit )\n" + "cmd.limit = this._limit;\n" + "if ( this._skip )\n" + "cmd.skip = this._skip;}\n" "var res = this._db.runCommand( cmd );\n" "if( res && res.n != null ) return res.n;\n" - "throw \"count failed: \" + tojson( res );\n" - "}\n" + "throw \"count failed: \" + tojson( res );}\n" + "DBQuery.prototype.size = function(){\n" + "return this.count( true );}\n" "DBQuery.prototype.countReturn = function(){\n" "var c = this.count();\n" "if ( this._skip )\n" "c = c - this._skip;\n" "if ( this._limit > 0 && this._limit < c )\n" "return this._limit;\n" - "return c;\n" - "}\n" - "/**\n" - "* iterative count - only for testing\n" - "*/\n" + "return c;}\n" + "\n" "DBQuery.prototype.itcount = function(){\n" "var num = 0;\n" "while ( this.hasNext() ){\n" "num++;\n" - "this.next();\n" - "}\n" - "return num;\n" - "}\n" + "this.next();}\n" + "return num;}\n" "DBQuery.prototype.length = function(){\n" - "return this.toArray().length;\n" - "}\n" - "DBQuery.prototype.sort = function( sortBy ){\n" + "return this.toArray().length;}\n" + "DBQuery.prototype._addSpecial = function( name , value ){\n" "this._ensureSpecial();\n" - "this._query.orderby = sortBy;\n" - "return this;\n" - "}\n" + "this._query[name] = value;\n" + "return this;}\n" + "DBQuery.prototype.sort = function( sortBy ){\n" + "return this._addSpecial( \"orderby\" , sortBy );}\n" "DBQuery.prototype.hint = function( hint ){\n" - "this._ensureSpecial();\n" - "this._query[\"$hint\"] = hint;\n" - "return this;\n" - "}\n" + "return this._addSpecial( \"$hint\" , hint );}\n" "DBQuery.prototype.min = function( min ) {\n" - "this._ensureSpecial();\n" - "this._query[\"$min\"] = min;\n" - "return this;\n" - "}\n" + "return this._addSpecial( \"$min\" , min );}\n" "DBQuery.prototype.max = function( max ) {\n" - "this._ensureSpecial();\n" - "this._query[\"$max\"] = max;\n" - "return this;\n" - "}\n" + "return this._addSpecial( \"$max\" , max );}\n" "DBQuery.prototype.forEach = function( func ){\n" "while ( this.hasNext() )\n" - "func( this.next() );\n" - "}\n" + "func( this.next() );}\n" "DBQuery.prototype.map = function( func ){\n" "var a = [];\n" "while ( this.hasNext() )\n" "a.push( func( this.next() ) );\n" - "return a;\n" - "}\n" + "return a;}\n" "DBQuery.prototype.arrayAccess = function( idx ){\n" - "return this.toArray()[idx];\n" - "}\n" + "return this.toArray()[idx];}\n" "DBQuery.prototype.explain = function(){\n" "var n = this.clone();\n" "n._ensureSpecial();\n" "n._query.$explain = true;\n" "n._limit = n._limit * -1;\n" - "return n.next();\n" - "}\n" + "return n.next();}\n" "DBQuery.prototype.snapshot = function(){\n" "this._ensureSpecial();\n" "this._query.$snapshot = true;\n" - "return this;\n" - "}\n" + "return this;}\n" "DBQuery.prototype.shellPrint = function(){\n" "try {\n" "var n = 0;\n" "while ( this.hasNext() && n < 20 ){\n" - "var s = tojson( this.next() );\n" + "var s = tojson( this.next() , \"\" , true );\n" "print( s );\n" - "n++;\n" - "}\n" + "n++;}\n" "if ( this.hasNext() ){\n" "print( \"has more\" );\n" - "___it___ = this;\n" - "}\n" + "___it___ = this;}\n" "else {\n" - "___it___ = null;\n" - "}\n" - "}\n" + "___it___ = null;}}\n" "catch ( e ){\n" - "print( e );\n" - "}\n" - "}\n" + "print( e );}}\n" "DBQuery.prototype.toString = function(){\n" - "return \"DBQuery: \" + this._ns + \" -> \" + tojson( this.query );\n" - "}\n" - "_parsePath = function() {\n" - "var dbpath = \"\";\n" - "for( var i = 0; i < arguments.length; ++i )\n" - "if ( arguments[ i ] == \"--dbpath\" )\n" - "dbpath = arguments[ i + 1 ];\n" - "if ( dbpath == \"\" )\n" - "throw \"No dbpath specified\";\n" - "return dbpath;\n" - "}\n" - "_parsePort = function() {\n" - "var port = \"\";\n" - "for( var i = 0; i < arguments.length; ++i )\n" - "if ( arguments[ i ] == \"--port\" )\n" - "port = arguments[ i + 1 ];\n" - "if ( port == \"\" )\n" - "throw \"No port specified\";\n" - "return port;\n" - "}\n" - "createMongoArgs = function( binaryName , args ){\n" - "var fullArgs = [ binaryName ];\n" - "if ( args.length == 1 && isObject( args[0] ) ){\n" - "var o = args[0];\n" + "return \"DBQuery: \" + this._ns + \" -> \" + tojson( this.query );}\n" + "if ( ( typeof DBCollection ) == \"undefined\" ){\n" + "DBCollection = function( mongo , db , shortName , fullName ){\n" + "this._mongo = mongo;\n" + "this._db = db;\n" + "this._shortName = shortName;\n" + "this._fullName = fullName;\n" + "this.verify();}}\n" + "DBCollection.prototype.verify = function(){\n" + "assert( this._fullName , \"no fullName\" );\n" + "assert( this._shortName , \"no shortName\" );\n" + "assert( this._db , \"no db\" );\n" + "assert.eq( this._fullName , this._db._name + \".\" + this._shortName , \"name mismatch\" );\n" + "assert( this._mongo , \"no mongo in DBCollection\" );}\n" + "DBCollection.prototype.getName = function(){\n" + "return this._shortName;}\n" + "DBCollection.prototype.help = function() {\n" + "print(\"DBCollection help\");\n" + "print(\"\\tdb.foo.count()\");\n" + "print(\"\\tdb.foo.dataSize()\");\n" + "print(\"\\tdb.foo.distinct( key ) - eg. db.foo.distinct( 'x' )\");\n" + "print(\"\\tdb.foo.drop() drop the collection\");\n" + "print(\"\\tdb.foo.dropIndex(name)\");\n" + "print(\"\\tdb.foo.dropIndexes()\");\n" + "print(\"\\tdb.foo.ensureIndex(keypattern,options) - options should be an object with these possible fields: name, unique, dropDups\");\n" + "print(\"\\tdb.foo.reIndex()\");\n" + "print(\"\\tdb.foo.find( [query] , [fields]) - first parameter is an optional query filter. second parameter is optional set of fields to return.\");\n" + "print(\"\\t e.g. db.foo.find( { x : 77 } , { name : 1 , x : 1 } )\");\n" + "print(\"\\tdb.foo.find(...).count()\");\n" + "print(\"\\tdb.foo.find(...).limit(n)\");\n" + "print(\"\\tdb.foo.find(...).skip(n)\");\n" + "print(\"\\tdb.foo.find(...).sort(...)\");\n" + "print(\"\\tdb.foo.findOne([query])\");\n" + "print(\"\\tdb.foo.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } )\");\n" + "print(\"\\tdb.foo.getDB() get DB object associated with collection\");\n" + "print(\"\\tdb.foo.getIndexes()\");\n" + "print(\"\\tdb.foo.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } )\");\n" + "print(\"\\tdb.foo.mapReduce( mapFunction , reduceFunction , <optional params> )\");\n" + "print(\"\\tdb.foo.remove(query)\");\n" + "print(\"\\tdb.foo.renameCollection( newName , <dropTarget> ) renames the collection.\");\n" + "print(\"\\tdb.foo.runCommand( name , <options> ) runs a db command with the given name where the 1st param is the colleciton name\" );\n" + "print(\"\\tdb.foo.save(obj)\");\n" + "print(\"\\tdb.foo.stats()\");\n" + "print(\"\\tdb.foo.storageSize() - includes free space allocated to this collection\");\n" + "print(\"\\tdb.foo.totalIndexSize() - size in bytes of all the indexes\");\n" + "print(\"\\tdb.foo.totalSize() - storage allocated for all data and indexes\");\n" + "print(\"\\tdb.foo.update(query, object[, upsert_bool, multi_bool])\");\n" + "print(\"\\tdb.foo.validate() - SLOW\");\n" + "print(\"\\tdb.foo.getShardVersion() - only for use with sharding\");}\n" + "DBCollection.prototype.getFullName = function(){\n" + "return this._fullName;}\n" + "DBCollection.prototype.getDB = function(){\n" + "return this._db;}\n" + "DBCollection.prototype._dbCommand = function( cmd , params ){\n" + "if ( typeof( cmd ) == \"object\" )\n" + "return this._db._dbCommand( cmd );\n" + "var c = {};\n" + "c[cmd] = this.getName();\n" + "if ( params )\n" + "Object.extend( c , params );\n" + "return this._db._dbCommand( c );}\n" + "DBCollection.prototype.runCommand = DBCollection.prototype._dbCommand;\n" + "DBCollection.prototype._massageObject = function( q ){\n" + "if ( ! q )\n" + "return {};\n" + "var type = typeof q;\n" + "if ( type == \"function\" )\n" + "return { $where : q };\n" + "if ( q.isObjectId )\n" + "return { _id : q };\n" + "if ( type == \"object\" )\n" + "return q;\n" + "if ( type == \"string\" ){\n" + "if ( q.length == 24 )\n" + "return { _id : q };\n" + "return { $where : q };}\n" + "throw \"don't know how to massage : \" + type;}\n" + "DBCollection.prototype._validateObject = function( o ){\n" + "if ( o._ensureSpecial && o._checkModify )\n" + "throw \"can't save a DBQuery object\";}\n" + "DBCollection._allowedFields = { $id : 1 , $ref : 1 };\n" + "DBCollection.prototype._validateForStorage = function( o ){\n" + "this._validateObject( o );\n" "for ( var k in o ){\n" - "if ( k == \"v\" && isNumber( o[k] ) ){\n" - "var n = o[k];\n" - "if ( n > 0 ){\n" - "var temp = \"-\";\n" - "while ( n-- > 0 ) temp += \"v\";\n" - "fullArgs.push( temp );\n" - "}\n" - "}\n" - "else {\n" - "fullArgs.push( \"--\" + k );\n" - "if ( o[k] != \"\" )\n" - "fullArgs.push( \"\" + o[k] );\n" - "}\n" - "}\n" - "}\n" - "else {\n" - "for ( var i=0; i<args.length; i++ )\n" - "fullArgs.push( args[i] )\n" - "}\n" - "return fullArgs;\n" - "}\n" - "startMongod = function(){\n" - "var args = createMongoArgs( \"mongod\" , arguments );\n" - "var dbpath = _parsePath.apply( null, args );\n" - "resetDbpath( dbpath );\n" - "return startMongoProgram.apply( null, args );\n" - "}\n" - "startMongos = function(){\n" - "return startMongoProgram.apply( null, createMongoArgs( \"mongos\" , arguments ) );\n" - "}\n" - "startMongoProgram = function(){\n" - "var port = _parsePort.apply( null, arguments );\n" - "_startMongoProgram.apply( null, arguments );\n" - "var m;\n" - "assert.soon\n" - "( function() {\n" - "try {\n" - "m = new Mongo( \"127.0.0.1:\" + port );\n" - "return true;\n" - "} catch( e ) {\n" - "}\n" - "return false;\n" - "}, \"unable to connect to mongo program on port \" + port, 30000 );\n" - "return m;\n" - "}\n" - "startMongoProgramNoConnect = function() {\n" - "return _startMongoProgram.apply( null, arguments );\n" - "}\n" - "myPort = function() {\n" - "var m = db.getMongo();\n" - "if ( m.host.match( /:/ ) )\n" - "return m.host.match( /:(.*)/ )[ 1 ];\n" - "else\n" - "return 27017;\n" - "}\n" - "ShardingTest = function( testName , numServers , verboseLevel , numMongos ){\n" - "this._connections = [];\n" - "this._serverNames = [];\n" - "for ( var i=0; i<numServers; i++){\n" - "var conn = startMongod( { port : 30000 + i , dbpath : \"/data/db/\" + testName + i , noprealloc : \"\" } );\n" - "conn.name = \"localhost:\" + ( 30000 + i );\n" - "this._connections.push( conn );\n" - "this._serverNames.push( conn.name );\n" - "}\n" - "this._configDB = \"localhost:30000\";\n" - "this._mongos = [];\n" - "var startMongosPort = 39999;\n" - "for ( var i=0; i<(numMongos||1); i++ ){\n" - "var myPort = startMongosPort - i;\n" - "var conn = startMongos( { port : startMongosPort - i , v : verboseLevel || 0 , configdb : this._configDB } );\n" - "conn.name = \"localhost:\" + myPort;\n" - "this._mongos.push( conn );\n" - "if ( i == 0 )\n" - "this.s = conn;\n" - "}\n" - "var admin = this.admin = this.s.getDB( \"admin\" );\n" - "this.config = this.s.getDB( \"config\" );\n" - "this._serverNames.forEach(\n" - "function(z){\n" - "admin.runCommand( { addshard : z } );\n" - "}\n" - ");\n" - "}\n" - "ShardingTest.prototype.getDB = function( name ){\n" - "return this.s.getDB( name );\n" - "}\n" - "ShardingTest.prototype.getServerName = function( dbname ){\n" - "return this.config.databases.findOne( { name : dbname } ).primary;\n" - "}\n" - "ShardingTest.prototype.getServer = function( dbname ){\n" - "var name = this.getServerName( dbname );\n" - "for ( var i=0; i<this._serverNames.length; i++ ){\n" - "if ( name == this._serverNames[i] )\n" - "return this._connections[i];\n" - "}\n" - "throw \"can't find server for: \" + dbname + \" name:\" + name;\n" - "}\n" - "ShardingTest.prototype.getOther = function( one ){\n" - "if ( this._connections.length != 2 )\n" - "throw \"getOther only works with 2 servers\";\n" - "if ( this._connections[0] == one )\n" - "return this._connections[1];\n" - "return this._connections[0];\n" - "}\n" - "ShardingTest.prototype.stop = function(){\n" - "for ( var i=0; i<this._mongos.length; i++ ){\n" - "stopMongoProgram( 39999 - i );\n" - "}\n" - "for ( var i=0; i<this._connections.length; i++){\n" - "stopMongod( 30000 + i );\n" - "}\n" - "}\n" - "ShardingTest.prototype.adminCommand = function(cmd){\n" - "var res = this.admin.runCommand( cmd );\n" - "if ( res && res.ok == 1 )\n" - "return true;\n" - "throw \"command \" + tojson( cmd ) + \" failed: \" + tojson( res );\n" - "}\n" - "ShardingTest.prototype.getChunksString = function( ns ){\n" - "var q = {}\n" - "if ( ns )\n" - "q.ns = ns;\n" - "return Array.tojson( this.config.chunks.find( q ).toArray() , \"\\n\" );\n" - "}\n" - "ShardingTest.prototype.printChunks = function( ns ){\n" - "print( this.getChunksString( ns ) );\n" - "}\n" - "ShardingTest.prototype.sync = function(){\n" - "this.adminCommand( \"connpoolsync\" );\n" - "}\n" - "MongodRunner = function( port, dbpath, peer, arbiter, extraArgs ) {\n" - "this.port_ = port;\n" - "this.dbpath_ = dbpath;\n" - "this.peer_ = peer;\n" - "this.arbiter_ = arbiter;\n" - "this.extraArgs_ = extraArgs;\n" - "}\n" - "MongodRunner.prototype.start = function( reuseData ) {\n" - "var args = [];\n" - "if ( reuseData ) {\n" - "args.push( \"mongod\" );\n" - "}\n" - "args.push( \"--port\" );\n" - "args.push( this.port_ );\n" - "args.push( \"--dbpath\" );\n" - "args.push( this.dbpath_ );\n" - "if ( this.peer_ && this.arbiter_ ) {\n" - "args.push( \"--pairwith\" );\n" - "args.push( this.peer_ );\n" - "args.push( \"--arbiter\" );\n" - "args.push( this.arbiter_ );\n" - "args.push( \"--oplogSize\" );\n" - "args.push( \"1\" );\n" - "}\n" - "args.push( \"--nohttpinterface\" );\n" - "args.push( \"--noprealloc\" );\n" - "args.push( \"--bind_ip\" );\n" - "args.push( \"127.0.0.1\" );\n" - "if ( this.extraArgs_ ) {\n" - "args = args.concat( this.extraArgs_ );\n" - "}\n" - "if ( reuseData ) {\n" - "return startMongoProgram.apply( null, args );\n" - "} else {\n" - "return startMongod.apply( null, args );\n" - "}\n" - "}\n" - "MongodRunner.prototype.port = function() { return this.port_; }\n" - "MongodRunner.prototype.toString = function() { return [ this.port_, this.dbpath_, this.peer_, this.arbiter_ ].toString(); }\n" - "ReplPair = function( left, right, arbiter ) {\n" - "this.left_ = left;\n" - "this.leftC_ = null;\n" - "this.right_ = right;\n" - "this.rightC_ = null;\n" - "this.arbiter_ = arbiter;\n" - "this.arbiterC_ = null;\n" - "this.master_ = null;\n" - "this.slave_ = null;\n" - "}\n" - "ReplPair.prototype.start = function( reuseData ) {\n" - "if ( this.arbiterC_ == null ) {\n" - "this.arbiterC_ = this.arbiter_.start();\n" - "}\n" - "if ( this.leftC_ == null ) {\n" - "this.leftC_ = this.left_.start( reuseData );\n" - "}\n" - "if ( this.rightC_ == null ) {\n" - "this.rightC_ = this.right_.start( reuseData );\n" - "}\n" - "}\n" - "ReplPair.prototype.isMaster = function( mongo, debug ) {\n" - "var im = mongo.getDB( \"admin\" ).runCommand( { ismaster : 1 } );\n" - "assert( im && im.ok, \"command ismaster failed\" );\n" - "if ( debug ) {\n" - "printjson( im );\n" - "}\n" - "return im.ismaster;\n" - "}\n" - "ReplPair.prototype.isInitialSyncComplete = function( mongo, debug ) {\n" - "var isc = mongo.getDB( \"admin\" ).runCommand( { isinitialsynccomplete : 1 } );\n" - "assert( isc && isc.ok, \"command isinitialsynccomplete failed\" );\n" - "if ( debug ) {\n" - "printjson( isc );\n" - "}\n" - "return isc.initialsynccomplete;\n" - "}\n" - "ReplPair.prototype.checkSteadyState = function( state, expectedMasterHost, twoMasterOk, leftValues, rightValues, debug ) {\n" - "leftValues = leftValues || {};\n" - "rightValues = rightValues || {};\n" - "var lm = null;\n" - "var lisc = null;\n" - "if ( this.leftC_ != null ) {\n" - "lm = this.isMaster( this.leftC_, debug );\n" - "leftValues[ lm ] = true;\n" - "lisc = this.isInitialSyncComplete( this.leftC_, debug );\n" - "}\n" - "var rm = null;\n" - "var risc = null;\n" - "if ( this.rightC_ != null ) {\n" - "rm = this.isMaster( this.rightC_, debug );\n" - "rightValues[ rm ] = true;\n" - "risc = this.isInitialSyncComplete( this.rightC_, debug );\n" - "}\n" - "var stateSet = {}\n" - "state.forEach( function( i ) { stateSet[ i ] = true; } );\n" - "if ( !( 1 in stateSet ) || ( ( risc || risc == null ) && ( lisc || lisc == null ) ) ) {\n" - "if ( rm == 1 && lm != 1 ) {\n" - "assert( twoMasterOk || !( 1 in leftValues ) );\n" - "this.master_ = this.rightC_;\n" - "this.slave_ = this.leftC_;\n" - "} else if ( lm == 1 && rm != 1 ) {\n" - "assert( twoMasterOk || !( 1 in rightValues ) );\n" - "this.master_ = this.leftC_;\n" - "this.slave_ = this.rightC_;\n" - "}\n" - "if ( !twoMasterOk ) {\n" - "assert( lm != 1 || rm != 1, \"two masters\" );\n" - "}\n" - "if ( state.sort().toString() == [ lm, rm ].sort().toString() ) {\n" - "if ( expectedMasterHost != null ) {\n" - "if( expectedMasterHost == this.master_.host ) {\n" - "return true;\n" - "}\n" - "} else {\n" - "return true;\n" - "}\n" - "}\n" - "}\n" - "this.master_ = null;\n" - "this.slave_ = null;\n" - "return false;\n" - "}\n" - "ReplPair.prototype.waitForSteadyState = function( state, expectedMasterHost, twoMasterOk, debug ) {\n" - "state = state || [ 1, 0 ];\n" - "twoMasterOk = twoMasterOk || false;\n" - "var rp = this;\n" - "var leftValues = {};\n" - "var rightValues = {};\n" - "assert.soon( function() { return rp.checkSteadyState( state, expectedMasterHost, twoMasterOk, leftValues, rightValues, debug ); },\n" - "\"rp (\" + rp + \") failed to reach expected steady state (\" + state + \")\" );\n" - "}\n" - "ReplPair.prototype.master = function() { return this.master_; }\n" - "ReplPair.prototype.slave = function() { return this.slave_; }\n" - "ReplPair.prototype.right = function() { return this.rightC_; }\n" - "ReplPair.prototype.left = function() { return this.leftC_; }\n" - "ReplPair.prototype.killNode = function( mongo, signal ) {\n" - "signal = signal || 15;\n" - "if ( this.leftC_ != null && this.leftC_.host == mongo.host ) {\n" - "stopMongod( this.left_.port_ );\n" - "this.leftC_ = null;\n" - "}\n" - "if ( this.rightC_ != null && this.rightC_.host == mongo.host ) {\n" - "stopMongod( this.right_.port_ );\n" - "this.rightC_ = null;\n" - "}\n" - "}\n" - "ReplPair.prototype._annotatedNode = function( mongo ) {\n" - "var ret = \"\";\n" - "if ( mongo != null ) {\n" - "ret += \" (connected)\";\n" - "if ( this.master_ != null && mongo.host == this.master_.host ) {\n" - "ret += \"(master)\";\n" - "}\n" - "if ( this.slave_ != null && mongo.host == this.slave_.host ) {\n" - "ret += \"(slave)\";\n" - "}\n" - "}\n" - "return ret;\n" - "}\n" - "ReplPair.prototype.toString = function() {\n" - "var ret = \"\";\n" - "ret += \"left: \" + this.left_;\n" - "ret += \" \" + this._annotatedNode( this.leftC_ );\n" - "ret += \" right: \" + this.right_;\n" - "ret += \" \" + this._annotatedNode( this.rightC_ );\n" - "return ret;\n" - "}\n" - "friendlyEqual = function( a , b ){\n" - "if ( a == b )\n" - "return true;\n" - "if ( tojson( a ) == tojson( b ) )\n" - "return true;\n" - "return false;\n" - "}\n" - "doassert = function( msg ){\n" - "print( \"assert: \" + msg );\n" - "throw msg;\n" - "}\n" - "assert = function( b , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( b )\n" - "return;\n" - "doassert( \"assert failed : \" + msg );\n" - "}\n" - "assert._debug = false;\n" - "assert.eq = function( a , b , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( a == b )\n" - "return;\n" - "if ( ( a != null && b != null ) && friendlyEqual( a , b ) )\n" - "return;\n" - "doassert( \"[\" + tojson( a ) + \"] != [\" + tojson( b ) + \"] are not equal : \" + msg );\n" - "}\n" - "assert.neq = function( a , b , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( a != b )\n" - "return;\n" - "doassert( \"[\" + a + \"] != [\" + b + \"] are equal : \" + msg );\n" - "}\n" - "assert.soon = function( f, msg, timeout, interval ) {\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "var start = new Date();\n" - "timeout = timeout || 30000;\n" - "interval = interval || 200;\n" - "var last;\n" - "while( 1 ) {\n" - "if ( typeof( f ) == \"string\" ){\n" - "if ( eval( f ) )\n" - "return;\n" - "}\n" + "if ( k.indexOf( \".\" ) >= 0 ) {\n" + "throw \"can't have . in field names [\" + k + \"]\" ;}\n" + "if ( k.indexOf( \"$\" ) == 0 && ! DBCollection._allowedFields[k] ) {\n" + "throw \"field names cannot start with $ [\" + k + \"]\";}\n" + "if ( o[k] !== null && typeof( o[k] ) === \"object\" ) {\n" + "this._validateForStorage( o[k] );}}\n" + "};\n" + "DBCollection.prototype.find = function( query , fields , limit , skip ){\n" + "return new DBQuery( this._mongo , this._db , this ,\n" + "this._fullName , this._massageObject( query ) , fields , limit , skip );}\n" + "DBCollection.prototype.findOne = function( query , fields ){\n" + "var cursor = this._mongo.find( this._fullName , this._massageObject( query ) || {} , fields , -1 , 0 , 0 );\n" + "if ( ! cursor.hasNext() )\n" + "return null;\n" + "var ret = cursor.next();\n" + "if ( cursor.hasNext() ) throw \"findOne has more than 1 result!\";\n" + "if ( ret.$err )\n" + "throw \"error \" + tojson( ret );\n" + "return ret;}\n" + "DBCollection.prototype.insert = function( obj , _allow_dot ){\n" + "if ( ! obj )\n" + "throw \"no object passed to insert!\";\n" + "if ( ! _allow_dot ) {\n" + "this._validateForStorage( obj );}\n" + "if ( typeof( obj._id ) == \"undefined\" ){\n" + "var tmp = obj;\n" + "obj = {_id: new ObjectId()};\n" + "for (var key in tmp){\n" + "obj[key] = tmp[key];}}\n" + "this._mongo.insert( this._fullName , obj );\n" + "return obj._id;}\n" + "DBCollection.prototype.remove = function( t ){\n" + "this._mongo.remove( this._fullName , this._massageObject( t ) );}\n" + "DBCollection.prototype.update = function( query , obj , upsert , multi ){\n" + "assert( query , \"need a query\" );\n" + "assert( obj , \"need an object\" );\n" + "this._validateObject( obj );\n" + "this._mongo.update( this._fullName , query , obj , upsert ? true : false , multi ? true : false );}\n" + "DBCollection.prototype.save = function( obj ){\n" + "if ( obj == null || typeof( obj ) == \"undefined\" )\n" + "throw \"can't save a null\";\n" + "if ( typeof( obj._id ) == \"undefined\" ){\n" + "obj._id = new ObjectId();\n" + "return this.insert( obj );}\n" "else {\n" - "if ( f() )\n" - "return;\n" - "}\n" - "if ( ( new Date() ).getTime() - start.getTime() > timeout )\n" - "doassert( \"assert.soon failed: \" + f + \", msg:\" + msg );\n" - "sleep( interval );\n" - "}\n" - "}\n" - "assert.throws = function( func , params , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "try {\n" - "func.apply( null , params );\n" - "}\n" - "catch ( e ){\n" - "return e;\n" - "}\n" - "doassert( \"did not throw exception: \" + msg );\n" - "}\n" - "assert.commandWorked = function( res , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( res.ok == 1 )\n" - "return;\n" - "doassert( \"command failed: \" + tojson( res ) + \" : \" + msg );\n" - "}\n" - "assert.commandFailed = function( res , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( res.ok == 0 )\n" - "return;\n" - "doassert( \"command worked when it should have failed: \" + tojson( res ) + \" : \" + msg );\n" - "}\n" - "assert.isnull = function( what , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( what == null )\n" - "return;\n" - "doassert( \"supposed to null (\" + ( msg || \"\" ) + \") was: \" + tojson( what ) );\n" - "}\n" - "assert.lt = function( a , b , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( a < b )\n" - "return;\n" - "doassert( a + \" is not less than \" + b + \" : \" + msg );\n" - "}\n" - "assert.gt = function( a , b , msg ){\n" - "if ( assert._debug && msg ) print( \"in assert for: \" + msg );\n" - "if ( a > b )\n" - "return;\n" - "doassert( a + \" is not greater than \" + b + \" : \" + msg );\n" - "}\n" - "Object.extend = function( dst , src ){\n" - "for ( var k in src ){\n" - "dst[k] = src[k];\n" - "}\n" - "return dst;\n" - "}\n" - "argumentsToArray = function( a ){\n" - "var arr = [];\n" - "for ( var i=0; i<a.length; i++ )\n" - "arr[i] = a[i];\n" - "return arr;\n" - "}\n" - "isString = function( x ){\n" - "return typeof( x ) == \"string\";\n" - "}\n" - "isNumber = function(x){\n" - "return typeof( x ) == \"number\";\n" - "}\n" - "isObject = function( x ){\n" - "return typeof( x ) == \"object\";\n" - "}\n" - "String.prototype.trim = function() {\n" - "return this.replace(/^\\s+|\\s+$/g,\"\");\n" - "}\n" - "String.prototype.ltrim = function() {\n" - "return this.replace(/^\\s+/,\"\");\n" - "}\n" - "String.prototype.rtrim = function() {\n" - "return this.replace(/\\s+$/,\"\");\n" - "}\n" - "Date.timeFunc = function( theFunc , numTimes ){\n" - "var start = new Date();\n" - "numTimes = numTimes || 1;\n" - "for ( var i=0; i<numTimes; i++ ){\n" - "theFunc.apply( null , argumentsToArray( arguments ).slice( 2 ) );\n" - "}\n" - "return (new Date()).getTime() - start.getTime();\n" - "}\n" - "Date.prototype.tojson = function(){\n" - "return \"\\\"\" + this.toString() + \"\\\"\";\n" - "}\n" - "RegExp.prototype.tojson = RegExp.prototype.toString;\n" - "Array.contains = function( a , x ){\n" - "for ( var i=0; i<a.length; i++ ){\n" - "if ( a[i] == x )\n" - "return true;\n" - "}\n" - "return false;\n" - "}\n" - "Array.unique = function( a ){\n" - "var u = [];\n" - "for ( var i=0; i<a.length; i++){\n" - "var o = a[i];\n" - "if ( ! Array.contains( u , o ) ){\n" - "u.push( o );\n" - "}\n" - "}\n" - "return u;\n" - "}\n" - "Array.shuffle = function( arr ){\n" - "for ( var i=0; i<arr.length-1; i++ ){\n" - "var pos = i+Math.floor(Math.random()*(arr.length-i));\n" - "var save = arr[i];\n" - "arr[i] = arr[pos];\n" - "arr[pos] = save;\n" - "}\n" - "return arr;\n" - "}\n" - "Array.tojson = function( a , sepLines ){\n" - "var s = \"[\";\n" - "if ( sepLines ) s += \"\\n\";\n" - "for ( var i=0; i<a.length; i++){\n" - "if ( i > 0 ){\n" - "s += \",\";\n" - "if ( sepLines ) s += \"\\n\";\n" - "}\n" - "s += tojson( a[i] );\n" - "}\n" - "s += \"]\";\n" - "if ( sepLines ) s += \"\\n\";\n" - "return s;\n" - "}\n" - "Array.fetchRefs = function( arr , coll ){\n" - "var n = [];\n" - "for ( var i=0; i<arr.length; i ++){\n" - "var z = arr[i];\n" - "if ( coll && coll != z.getCollection() )\n" + "return this.update( { _id : obj._id } , obj , true );}}\n" + "DBCollection.prototype._genIndexName = function( keys ){\n" + "var name = \"\";\n" + "for ( var k in keys ){\n" + "var v = keys[k];\n" + "if ( typeof v == \"function\" )\n" "continue;\n" - "n.push( z.fetch() );\n" - "}\n" - "return n;\n" - "}\n" - "if ( ! ObjectId.prototype )\n" - "ObjectId.prototype = {}\n" - "ObjectId.prototype.toString = function(){\n" - "return this.str;\n" - "}\n" - "ObjectId.prototype.tojson = function(){\n" - "return \" ObjectId( \\\"\" + this.str + \"\\\") \";\n" - "}\n" - "ObjectId.prototype.isObjectId = true;\n" - "if ( typeof( DBPointer ) != \"undefined\" ){\n" - "DBPointer.prototype.fetch = function(){\n" - "assert( this.ns , \"need a ns\" );\n" - "assert( this.id , \"need an id\" );\n" - "return db[ this.ns ].findOne( { _id : this.id } );\n" - "}\n" - "DBPointer.prototype.tojson = function(){\n" - "return \"{ 'ns' : \\\"\" + this.ns + \"\\\" , 'id' : \\\"\" + this.id + \"\\\" } \";\n" - "}\n" - "DBPointer.prototype.getCollection = function(){\n" - "return this.ns;\n" - "}\n" - "DBPointer.prototype.toString = function(){\n" - "return \"DBPointer \" + this.ns + \":\" + this.id;\n" - "}\n" - "}\n" - "else {\n" - "print( \"warning: no DBPointer\" );\n" - "}\n" - "if ( typeof( DBRef ) != \"undefined\" ){\n" - "DBRef.prototype.fetch = function(){\n" - "assert( this.$ref , \"need a ns\" );\n" - "assert( this.$id , \"need an id\" );\n" - "return db[ this.$ref ].findOne( { _id : this.$id } );\n" - "}\n" - "DBRef.prototype.tojson = function(){\n" - "return \"{ '$ref' : \\\"\" + this.$ref + \"\\\" , '$id' : \\\"\" + this.$id + \"\\\" } \";\n" - "}\n" - "DBRef.prototype.getCollection = function(){\n" - "return this.$ref;\n" - "}\n" - "DBRef.prototype.toString = function(){\n" - "return this.tojson();\n" - "}\n" - "}\n" + "if ( name.length > 0 )\n" + "name += \"_\";\n" + "name += k + \"_\";\n" + "if ( typeof v == \"number\" )\n" + "name += v;}\n" + "return name;}\n" + "DBCollection.prototype._indexSpec = function( keys, options ) {\n" + "var ret = { ns : this._fullName , key : keys , name : this._genIndexName( keys ) };\n" + "if ( ! options ){}\n" + "else if ( typeof ( options ) == \"string\" )\n" + "ret.name = options;\n" + "else if ( typeof ( options ) == \"boolean\" )\n" + "ret.unique = true;\n" + "else if ( typeof ( options ) == \"object\" ){\n" + "if ( options.length ){\n" + "var nb = 0;\n" + "for ( var i=0; i<options.length; i++ ){\n" + "if ( typeof ( options[i] ) == \"string\" )\n" + "ret.name = options[i];\n" + "else if ( typeof( options[i] ) == \"boolean\" ){\n" + "if ( options[i] ){\n" + "if ( nb == 0 )\n" + "ret.unique = true;\n" + "if ( nb == 1 )\n" + "ret.dropDups = true;}\n" + "nb++;}}}\n" "else {\n" - "print( \"warning: no DBRef\" );\n" - "}\n" - "if ( typeof( BinData ) != \"undefined\" ){\n" - "BinData.prototype.tojson = function(){\n" - "return \"BinData type: \" + this.type + \" len: \" + this.len;\n" - "}\n" - "}\n" + "Object.extend( ret , options );}}\n" "else {\n" - "print( \"warning: no BinData\" );\n" - "}\n" - "tojson = function( x ){\n" - "if ( x == null )\n" - "return \"null\";\n" - "if ( x == undefined )\n" - "return \"\";\n" - "switch ( typeof x ){\n" - "case \"string\": {\n" - "var s = \"\\\"\";\n" - "for ( var i=0; i<x.length; i++ ){\n" - "if ( x[i] == '\"' ){\n" - "s += \"\\\\\\\"\";\n" - "}\n" - "else\n" - "s += x[i];\n" - "}\n" - "return s + \"\\\"\";\n" - "}\n" - "case \"number\":\n" - "case \"boolean\":\n" - "return \"\" + x;\n" - "case \"object\":\n" - "return tojsonObject( x );\n" - "case \"function\":\n" - "return x.toString();\n" - "default:\n" - "throw \"tojson can't handle type \" + ( typeof x );\n" - "}\n" - "}\n" - "tojsonObject = function( x ){\n" - "assert.eq( ( typeof x ) , \"object\" , \"tojsonObject needs object, not [\" + ( typeof x ) + \"]\" );\n" - "if ( typeof( x.tojson ) == \"function\" && x.tojson != tojson )\n" - "return x.tojson();\n" - "if ( typeof( x.constructor.tojson ) == \"function\" && x.constructor.tojson != tojson )\n" - "return x.constructor.tojson( x );\n" - "if ( x.toString() == \"[object MaxKey]\" )\n" - "return \"{ $maxKey : 1 }\";\n" - "if ( x.toString() == \"[object MinKey]\" )\n" - "return \"{ $minKey : 1 }\";\n" - "var s = \"{\";\n" - "var first = true;\n" - "for ( var k in x ){\n" - "var val = x[k];\n" - "if ( val == DB.prototype || val == DBCollection.prototype )\n" - "continue;\n" - "if ( first ) first = false;\n" - "else s += \" , \";\n" - "s += \"\\\"\" + k + \"\\\" : \" + tojson( val );\n" - "}\n" - "return s + \"}\";\n" - "}\n" - "shellPrint = function( x ){\n" - "it = x;\n" - "if ( x != undefined )\n" - "shellPrintHelper( x );\n" - "if ( db ){\n" - "var e = db.getPrevError();\n" - "if ( e.err ) {\n" - "if( e.nPrev <= 1 )\n" - "print( \"error on last call: \" + tojson( e.err ) );\n" - "else\n" - "print( \"an error \" + tojson(e.err) + \" occurred \" + e.nPrev + \" operations back in the command invocation\" );\n" - "}\n" - "db.resetError();\n" - "}\n" - "}\n" - "printjson = function(x){\n" - "print( tojson( x ) );\n" - "}\n" - "shellPrintHelper = function( x ){\n" - "if ( typeof( x ) == \"undefined\" ){\n" - "if ( typeof( db ) != \"undefined\" && db.getLastError ){\n" - "var e = db.getLastError();\n" - "if ( e != null )\n" - "print( e );\n" - "}\n" - "return;\n" - "}\n" - "if ( x == null ){\n" - "print( \"null\" );\n" - "return;\n" - "}\n" - "if ( typeof x != \"object\" )\n" - "return print( x );\n" - "var p = x.shellPrint;\n" - "if ( typeof p == \"function\" )\n" - "return x.shellPrint();\n" - "var p = x.tojson;\n" - "if ( typeof p == \"function\" )\n" - "print( x.tojson() );\n" - "else\n" - "print( tojson( x ) );\n" - "}\n" - "shellHelper = function( command , rest , shouldPrint ){\n" - "command = command.trim();\n" - "var args = rest.trim().replace(/;$/,\"\").split( \"\\s+\" );\n" - "if ( ! shellHelper[command] )\n" - "throw \"no command [\" + command + \"]\";\n" - "var res = shellHelper[command].apply( null , args );\n" - "if ( shouldPrint ){\n" - "shellPrintHelper( res );\n" - "}\n" + "throw \"can't handle: \" + typeof( options );}\n" + "/*\n" + "return ret;\n" + "var name;\n" + "var nTrue = 0;\n" + "if ( ! isObject( options ) ) {\n" + "options = [ options ];}\n" + "if ( options.length ){\n" + "for( var i = 0; i < options.length; ++i ) {\n" + "var o = options[ i ];\n" + "if ( isString( o ) ) {\n" + "ret.name = o;\n" + "} else if ( typeof( o ) == \"boolean\" ) {\n" + "if ( o ) {\n" + "++nTrue;}}}\n" + "if ( nTrue > 0 ) {\n" + "ret.unique = true;}\n" + "if ( nTrue > 1 ) {\n" + "ret.dropDups = true;}}\n" + "*/\n" + "return ret;}\n" + "DBCollection.prototype.createIndex = function( keys , options ){\n" + "var o = this._indexSpec( keys, options );\n" + "this._db.getCollection( \"system.indexes\" ).insert( o , true );}\n" + "DBCollection.prototype.ensureIndex = function( keys , options ){\n" + "var name = this._indexSpec( keys, options ).name;\n" + "this._indexCache = this._indexCache || {};\n" + "if ( this._indexCache[ name ] ){\n" + "return;}\n" + "this.createIndex( keys , options );\n" + "if ( this.getDB().getLastError() == \"\" ) {\n" + "this._indexCache[name] = true;}}\n" + "DBCollection.prototype.resetIndexCache = function(){\n" + "this._indexCache = {};}\n" + "DBCollection.prototype.reIndex = function() {\n" + "return this._db.runCommand({ reIndex: this.getName() });}\n" + "DBCollection.prototype.dropIndexes = function(){\n" + "this.resetIndexCache();\n" + "var res = this._db.runCommand( { deleteIndexes: this.getName(), index: \"*\" } );\n" + "assert( res , \"no result from dropIndex result\" );\n" + "if ( res.ok )\n" "return res;\n" - "}\n" - "help = shellHelper.help = function(){\n" - "print( \"HELP\" );\n" - "print( \"\\t\" + \"show dbs show database names\");\n" - "print( \"\\t\" + \"show collections show collections in current database\");\n" - "print( \"\\t\" + \"show users show users in current database\");\n" - "print( \"\\t\" + \"show profile show most recent system.profile entries with time >= 1ms\");\n" - "print( \"\\t\" + \"use <db name> set curent database to <db name>\" );\n" - "print( \"\\t\" + \"db.help() help on DB methods\");\n" - "print( \"\\t\" + \"db.foo.help() help on collection methods\");\n" - "print( \"\\t\" + \"db.foo.find() list objects in collection foo\" );\n" - "print( \"\\t\" + \"db.foo.find( { a : 1 } ) list objects in foo where a == 1\" );\n" - "print( \"\\t\" + \"it result of the last line evaluated; use to further iterate\");\n" - "}\n" - "shellHelper.use = function( dbname ){\n" - "db = db.getMongo().getDB( dbname );\n" - "print( \"switched to db \" + db.getName() );\n" - "}\n" - "shellHelper.it = function(){\n" - "if ( typeof( ___it___ ) == \"undefined\" || ___it___ == null ){\n" - "print( \"no cursor\" );\n" - "return;\n" - "}\n" - "shellPrintHelper( ___it___ );\n" - "}\n" - "shellHelper.show = function( what ){\n" - "assert( typeof what == \"string\" );\n" - "if( what == \"profile\" ) {\n" - "if( db.system.profile.count() == 0 ) {\n" - "print(\"db.system.profile is empty\");\n" - "print(\"Use db.setProfilingLevel(2) will enable profiling\");\n" - "print(\"Use db.system.profile.find() to show raw profile entries\");\n" - "}\n" - "else {\n" - "print();\n" - "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\");} )\n" - "}\n" - "return \"\";\n" - "}\n" - "if ( what == \"users\" ){\n" - "db.system.users.find().forEach( printjson );\n" - "return \"\";\n" - "}\n" - "if ( what == \"collections\" || what == \"tables\" ) {\n" - "db.getCollectionNames().forEach( function(x){print(x)} );\n" - "return \"\";\n" - "}\n" - "if ( what == \"dbs\" ) {\n" - "db.getMongo().getDBNames().sort().forEach( function(x){print(x)} );\n" - "return \"\";\n" - "}\n" - "throw \"don't know how to show [\" + what + \"]\";\n" - "}\n" - "if ( typeof( Map ) == \"undefined\" ){\n" - "Map = function(){\n" - "this._data = {};\n" - "}\n" - "}\n" - "Map.hash = function( val ){\n" - "if ( ! val )\n" - "return val;\n" - "switch ( typeof( val ) ){\n" - "case 'string':\n" - "case 'number':\n" - "case 'date':\n" - "return val.toString();\n" - "case 'object':\n" - "case 'array':\n" - "var s = \"\";\n" - "for ( var k in val ){\n" - "s += k + val[k];\n" - "}\n" - "return s;\n" - "}\n" - "throw \"can't hash : \" + typeof( val );\n" - "}\n" - "Map.prototype.put = function( key , value ){\n" - "var o = this._get( key );\n" - "var old = o.value;\n" - "o.value = value;\n" - "return old;\n" - "}\n" - "Map.prototype.get = function( key ){\n" - "return this._get( key ).value;\n" - "}\n" - "Map.prototype._get = function( key ){\n" - "var h = Map.hash( key );\n" - "var a = this._data[h];\n" - "if ( ! a ){\n" - "a = [];\n" - "this._data[h] = a;\n" - "}\n" - "for ( var i=0; i<a.length; i++ ){\n" - "if ( friendlyEqual( key , a[i].key ) ){\n" - "return a[i];\n" - "}\n" - "}\n" - "var o = { key : key , value : null };\n" - "a.push( o );\n" - "return o;\n" - "}\n" - "Map.prototype.values = function(){\n" - "var all = [];\n" - "for ( var k in this._data ){\n" - "this._data[k].forEach( function(z){ all.push( z.value ); } );\n" - "}\n" - "return all;\n" - "}\n" - "Math.sigFig = function( x , N ){\n" - "if ( ! N ){\n" - "N = 3;\n" - "}\n" - "var p = Math.pow( 10, N - Math.ceil( Math.log( Math.abs(x) ) / Math.log( 10 )) );\n" - "return Math.round(x*p)/p;\n" - "}\n" + "if ( res.errmsg.match( /not found/ ) )\n" + "return res;\n" + "throw \"error dropping indexes : \" + tojson( res );}\n" + "DBCollection.prototype.drop = function(){\n" + "this.resetIndexCache();\n" + "var ret = this._db.runCommand( { drop: this.getName() } );\n" + "if ( ! ret.ok ){\n" + "if ( ret.errmsg == \"ns not found\" )\n" + "return false;\n" + "throw \"drop failed: \" + tojson( ret );}\n" + "return true;}\n" + "DBCollection.prototype.findAndModify = function(args){\n" + "var cmd = { findandmodify: this.getName() };\n" + "for (var key in args){\n" + "cmd[key] = args[key];}\n" + "var ret = this._db.runCommand( cmd );\n" + "if ( ! ret.ok ){\n" + "if (ret.errmsg == \"No matching object found\"){\n" + "return {};}\n" + "throw \"findAndModifyFailed failed: \" + tojson( ret.errmsg );}\n" + "return ret.value;}\n" + "DBCollection.prototype.renameCollection = function( newName , dropTarget ){\n" + "return this._db._adminCommand( { renameCollection : this._fullName ,\n" + "to : this._db._name + \".\" + newName ,\n" + "dropTarget : dropTarget } )}\n" + "DBCollection.prototype.validate = function() {\n" + "var res = this._db.runCommand( { validate: this.getName() } );\n" + "res.valid = false;\n" + "if ( res.result ){\n" + "var str = \"-\" + tojson( res.result );\n" + "res.valid = ! ( str.match( /exception/ ) || str.match( /corrupt/ ) );\n" + "var p = /lastExtentSize:(\\d+)/;\n" + "var r = p.exec( str );\n" + "if ( r ){\n" + "res.lastExtentSize = Number( r[1] );}}\n" + "return res;}\n" + "DBCollection.prototype.getShardVersion = function(){\n" + "return this._db._adminCommand( { getShardVersion : this._fullName } );}\n" + "DBCollection.prototype.getIndexes = function(){\n" + "return this.getDB().getCollection( \"system.indexes\" ).find( { ns : this.getFullName() } ).toArray();}\n" + "DBCollection.prototype.getIndices = DBCollection.prototype.getIndexes;\n" + "DBCollection.prototype.getIndexSpecs = DBCollection.prototype.getIndexes;\n" + "DBCollection.prototype.getIndexKeys = function(){\n" + "return this.getIndexes().map(\n" + "function(i){\n" + "return i.key;}\n" + ");}\n" + "DBCollection.prototype.count = function( x ){\n" + "return this.find( x ).count();}\n" + "\n" + "DBCollection.prototype.clean = function() {\n" + "return this._dbCommand( { clean: this.getName() } );}\n" + "\n" + "DBCollection.prototype.dropIndex = function(index) {\n" + "assert(index , \"need to specify index to dropIndex\" );\n" + "if ( ! isString( index ) && isObject( index ) )\n" + "index = this._genIndexName( index );\n" + "var res = this._dbCommand( \"deleteIndexes\" ,{ index: index } );\n" + "this.resetIndexCache();\n" + "return res;}\n" + "DBCollection.prototype.copyTo = function( newName ){\n" + "return this.getDB().eval(\n" + "function( collName , newName ){\n" + "var from = db[collName];\n" + "var to = db[newName];\n" + "to.ensureIndex( { _id : 1 } );\n" + "var count = 0;\n" + "var cursor = from.find();\n" + "while ( cursor.hasNext() ){\n" + "var o = cursor.next();\n" + "count++;\n" + "to.save( o );}\n" + "return count;\n" + "} , this.getName() , newName\n" + ");}\n" + "DBCollection.prototype.getCollection = function( subName ){\n" + "return this._db.getCollection( this._shortName + \".\" + subName );}\n" + "DBCollection.prototype.stats = function( scale ){\n" + "return this._db.runCommand( { collstats : this._shortName , scale : scale } );}\n" + "DBCollection.prototype.dataSize = function(){\n" + "return this.stats().size;}\n" + "DBCollection.prototype.storageSize = function(){\n" + "return this.stats().storageSize;}\n" + "DBCollection.prototype.totalIndexSize = function( verbose ){\n" + "var stats = this.stats();\n" + "if (verbose){\n" + "for (var ns in stats.indexSizes){\n" + "print( ns + \"\\t\" + stats.indexSizes[ns] );}}\n" + "return stats.totalIndexSize;}\n" + "DBCollection.prototype.totalSize = function(){\n" + "var total = this.storageSize();\n" + "var mydb = this._db;\n" + "var shortName = this._shortName;\n" + "this.getIndexes().forEach(\n" + "function( spec ){\n" + "var coll = mydb.getCollection( shortName + \".$\" + spec.name );\n" + "var mysize = coll.storageSize();\n" + "total += coll.dataSize();}\n" + ");\n" + "return total;}\n" + "DBCollection.prototype.convertToCapped = function( bytes ){\n" + "if ( ! bytes )\n" + "throw \"have to specify # of bytes\";\n" + "return this._dbCommand( { convertToCapped : this._shortName , size : bytes } )}\n" + "DBCollection.prototype.exists = function(){\n" + "return this._db.system.namespaces.findOne( { name : this._fullName } );}\n" + "DBCollection.prototype.isCapped = function(){\n" + "var e = this.exists();\n" + "return ( e && e.options && e.options.capped ) ? true : false;}\n" + "DBCollection.prototype.distinct = function( keyString , query ){\n" + "var res = this._dbCommand( { distinct : this._shortName , key : keyString , query : query || {} } );\n" + "if ( ! res.ok )\n" + "throw \"distinct failed: \" + tojson( res );\n" + "return res.values;}\n" + "DBCollection.prototype.group = function( params ){\n" + "params.ns = this._shortName;\n" + "return this._db.group( params );}\n" + "DBCollection.prototype.groupcmd = function( params ){\n" + "params.ns = this._shortName;\n" + "return this._db.groupcmd( params );}\n" + "MapReduceResult = function( db , o ){\n" + "Object.extend( this , o );\n" + "this._o = o;\n" + "this._keys = Object.keySet( o );\n" + "this._db = db;\n" + "this._coll = this._db.getCollection( this.result );}\n" + "MapReduceResult.prototype._simpleKeys = function(){\n" + "return this._o;}\n" + "MapReduceResult.prototype.find = function(){\n" + "return DBCollection.prototype.find.apply( this._coll , arguments );}\n" + "MapReduceResult.prototype.drop = function(){\n" + "return this._coll.drop();}\n" + "\n" + "MapReduceResult.prototype.convertToSingleObject = function(){\n" + "var z = {};\n" + "this._coll.find().forEach( function(a){ z[a._id] = a.value; } );\n" + "return z;}\n" + "\n" + "DBCollection.prototype.mapReduce = function( map , reduce , optional ){\n" + "var c = { mapreduce : this._shortName , map : map , reduce : reduce };\n" + "if ( optional )\n" + "Object.extend( c , optional );\n" + "var raw = this._db.runCommand( c );\n" + "if ( ! raw.ok )\n" + "throw \"map reduce failed: \" + tojson( raw );\n" + "return new MapReduceResult( this._db , raw );}\n" + "DBCollection.prototype.toString = function(){\n" + "return this.getFullName();}\n" + "DBCollection.prototype.toString = function(){\n" + "return this.getFullName();}\n" + "DBCollection.prototype.tojson = DBCollection.prototype.toString;\n" + "DBCollection.prototype.shellPrint = DBCollection.prototype.toString;\n" ; |