diff options
author | Mathias Stearn <mathias@10gen.com> | 2013-07-08 23:19:53 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2013-07-10 17:43:58 -0400 |
commit | a51f2688fa05672d999c997170847a3ee29a223b (patch) | |
tree | 87ba82c0a3a0c0ef1ef8c8853b3e4aae775aacf0 /src/mongo/scripting | |
parent | 0f43cfcbe063c1f4615ce362e751155218224bec (diff) | |
download | mongo-a51f2688fa05672d999c997170847a3ee29a223b.tar.gz |
SERVER-5932 Aggregation returning a cursor
related tickets:
SERVER-8261 System for commands to return cursors
SERVER-10165 aggregate() helper should return cursor
Diffstat (limited to 'src/mongo/scripting')
-rw-r--r-- | src/mongo/scripting/v8_db.cpp | 22 | ||||
-rw-r--r-- | src/mongo/scripting/v8_db.h | 1 |
2 files changed, 23 insertions, 0 deletions
diff --git a/src/mongo/scripting/v8_db.cpp b/src/mongo/scripting/v8_db.cpp index e18e9f7d807..c2063ce3d05 100644 --- a/src/mongo/scripting/v8_db.cpp +++ b/src/mongo/scripting/v8_db.cpp @@ -100,6 +100,7 @@ namespace mongo { scope->injectV8Method("update", mongoUpdate, proto); scope->injectV8Method("auth", mongoAuth, proto); scope->injectV8Method("logout", mongoLogout, proto); + scope->injectV8Method("cursorFromId", mongoCursorFromId, proto); fassert(16468, _mongoPrototypeManipulatorsFrozen); for (size_t i = 0; i < _mongoPrototypeManipulators.size(); ++i) @@ -209,6 +210,27 @@ namespace mongo { return c; } + v8::Handle<v8::Value> mongoCursorFromId(V8Scope* scope, const v8::Arguments& args) { + argumentCheck(args.Length() == 2 || args.Length() == 3, "cursorFromId needs 2 or 3 args") + argumentCheck(scope->NumberLongFT()->HasInstance(args[1]), "2nd arg must be a NumberLong") + argumentCheck(args[2]->IsUndefined() || args[2]->IsNumber(), "3rd arg must be a js Number") + + DBClientBase* conn = getConnection(scope, args); + const string ns = toSTLString(args[0]); + long long cursorId = numberLongVal(scope, args[1]->ToObject()); + + auto_ptr<mongo::DBClientCursor> cursor(new DBClientCursor(conn, ns, cursorId, 0, 0)); + + if (!args[2]->IsUndefined()) + cursor->setBatchSize(args[2]->Int32Value()); + + v8::Handle<v8::Function> cons = scope->InternalCursorFT()->GetFunction(); + v8::Persistent<v8::Object> c = v8::Persistent<v8::Object>::New(cons->NewInstance()); + c->SetInternalField(0, v8::External::New(cursor.get())); + scope->dbClientCursorTracker.track(c, cursor.release()); + return c; + } + v8::Handle<v8::Value> mongoInsert(V8Scope* scope, const v8::Arguments& args) { argumentCheck(args.Length() == 3 ,"insert needs 3 args") argumentCheck(args[1]->IsObject() ,"attempted to insert a non-object") diff --git a/src/mongo/scripting/v8_db.h b/src/mongo/scripting/v8_db.h index 445ab783681..7bb0f046c0b 100644 --- a/src/mongo/scripting/v8_db.h +++ b/src/mongo/scripting/v8_db.h @@ -46,6 +46,7 @@ namespace mongo { v8::Handle<v8::Value> mongoUpdate(V8Scope* scope, const v8::Arguments& args); v8::Handle<v8::Value> mongoAuth(V8Scope* scope, const v8::Arguments& args); v8::Handle<v8::Value> mongoLogout(V8Scope* scope, const v8::Arguments& args); + v8::Handle<v8::Value> mongoCursorFromId(V8Scope* scope, const v8::Arguments& args); // Cursor object v8::Handle<v8::Value> internalCursorCons(V8Scope* scope, const v8::Arguments& args); |