static Handle<Value> s_close(const Arguments& args) {
HandleScope scope;
NodeEJDB *njb = ObjectWrap::Unwrap< NodeEJDB > (args.This());
- assert(njb);
if (!njb->close()) {
return scope.Close(ThrowException(Exception::Error(String::New(njb->_jb_error_msg()))));
}
cmdata->ref = oid;
NodeEJDB *njb = ObjectWrap::Unwrap< NodeEJDB > (args.This());
- assert(njb);
BSONCmdTask *task = new BSONCmdTask(cb, njb, cmdLoad, cmdata, BSONCmdTask::delete_val);
uv_queue_work(uv_default_loop(), &task->uv_work, s_exec_cmd_eio, s_exec_cmd_eio_after);
return scope.Close(args.This());
cmdata->bsons.push_back(bs);
}
NodeEJDB *njb = ObjectWrap::Unwrap< NodeEJDB > (args.This());
- assert(njb);
BSONCmdTask *task = new BSONCmdTask(cb, njb, cmdSave, cmdata, BSONCmdTask::delete_val);
uv_queue_work(uv_default_loop(), &task->uv_work, s_exec_cmd_eio, s_exec_cmd_eio_after);
return scope.Close(args.This());
cmdata->bsons.push_back(bs);
}
NodeEJDB *njb = ObjectWrap::Unwrap< NodeEJDB > (args.This());
- assert(njb);
BSONQCmdTask *task = new BSONQCmdTask(cb, njb, cmdQuery, cmdata, BSONQCmdTask::delete_val);
uv_queue_work(uv_default_loop(), &task->uv_work, s_exec_cmd_eio, s_exec_cmd_eio_after);
return scope.Close(args.This());
NodeEJDB *m_nejdb;
TCLIST *m_rs; //result set bsons
int m_pos; //current cursor position
+ bool m_no_next; //no next() was called
static Handle<Value> s_new_object(const Arguments& args) {
HandleScope scope;
static Handle<Value> s_close(const Arguments& args) {
HandleScope scope;
NodeEJDBCursor *c = ObjectWrap::Unwrap< NodeEJDBCursor > (args.This());
- assert(c);
c->close();
return scope.Close(args.This());
}
+ static Handle<Value> s_reset(const Arguments& args) {
+ HandleScope scope;
+ NodeEJDBCursor *c = ObjectWrap::Unwrap< NodeEJDBCursor > (args.This());
+ c->m_pos = 0;
+ c->m_no_next = true;
+ return scope.Close(args.This());
+ }
+
static Handle<Value> s_has_next(const Arguments& args) {
HandleScope scope;
NodeEJDBCursor *c = ObjectWrap::Unwrap< NodeEJDBCursor > (args.This());
- assert(c);
- return scope.Close(Boolean::New(c->m_rs && c->m_pos < TCLISTNUM(c->m_rs)));
+ if (!c->m_rs) {
+ return ThrowException(Exception::Error(String::New("Cursor closed")));
+ }
+ int rsz = TCLISTNUM(c->m_rs);
+ return scope.Close(Boolean::New(c->m_rs && ((c->m_no_next && rsz > 0) || (c->m_pos + 1 < rsz))));
+ }
+
+ static Handle<Value> s_next(const Arguments& args) {
+ HandleScope scope;
+ NodeEJDBCursor *c = ObjectWrap::Unwrap< NodeEJDBCursor > (args.This());
+ if (!c->m_rs) {
+ return ThrowException(Exception::Error(String::New("Cursor closed")));
+ }
+ int rsz = TCLISTNUM(c->m_rs);
+ if (c->m_no_next) {
+ c->m_no_next = false;
+ return scope.Close(Boolean::New(rsz > 0));
+ } else if (c->m_pos + 1 < rsz) {
+ c->m_pos++;
+ return scope.Close(Boolean::New(true));
+ } else {
+ return scope.Close(Boolean::New(false));
+ }
}
static Handle<Value> s_get_length(Local<String> property, const AccessorInfo &info) {
HandleScope scope;
NodeEJDBCursor *c = ObjectWrap::Unwrap<NodeEJDBCursor > (info.This());
- assert(c);
if (!c->m_rs) {
return ThrowException(Exception::Error(String::New("Cursor closed")));
}
static Handle<Value> s_get_pos(Local<String> property, const AccessorInfo &info) {
HandleScope scope;
NodeEJDBCursor *c = ObjectWrap::Unwrap<NodeEJDBCursor > (info.This());
- assert(c);
if (!c->m_rs) {
return ThrowException(Exception::Error(String::New("Cursor closed")));
}
return;
}
NodeEJDBCursor *c = ObjectWrap::Unwrap<NodeEJDBCursor > (info.This());
- assert(c);
if (!c->m_rs) {
return;
}
nval = 0;
}
c->m_pos = nval;
+ c->m_no_next = false;
}
static Handle<Value> s_field(const Arguments& args) {
REQ_ARGS(1);
REQ_STR_ARG(0, fpath);
NodeEJDBCursor *c = ObjectWrap::Unwrap<NodeEJDBCursor > (args.This());
- assert(c);
if (!c->m_rs) {
return scope.Close(ThrowException(Exception::Error(String::New("Cursor closed"))));
}
static Handle<Value> s_object(const Arguments& args) {
HandleScope scope;
NodeEJDBCursor *c = ObjectWrap::Unwrap<NodeEJDBCursor > (args.This());
- assert(c);
if (!c->m_rs) {
return scope.Close(ThrowException(Exception::Error(String::New("Cursor closed"))));
}
}
}
- NodeEJDBCursor(NodeEJDB *_nejedb, TCLIST *_rs) : m_nejdb(_nejedb), m_rs(_rs), m_pos(0) {
+ NodeEJDBCursor(NodeEJDB *_nejedb, TCLIST *_rs) : m_nejdb(_nejedb), m_rs(_rs), m_pos(0), m_no_next(true) {
assert(m_rs && m_nejdb);
this->m_nejdb->Ref();
}
NODE_SET_PROTOTYPE_METHOD(constructor_template, "close", s_close);
+ NODE_SET_PROTOTYPE_METHOD(constructor_template, "reset", s_reset);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "hasNext", s_has_next);
+ NODE_SET_PROTOTYPE_METHOD(constructor_template, "next", s_next);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "field", s_field);
NODE_SET_PROTOTYPE_METHOD(constructor_template, "object", s_object);
}