// getResult(id, objectWrapper):  IMMEDIATE
void queryGetResult(const Arguments & args) {
  REQUIRE_ARGS_LENGTH(2);
  v8::Isolate * isolate = args.GetIsolate();

  QueryOperation * op = unwrapPointer<QueryOperation *>(args.Holder());
  size_t id = args[0]->Uint32Value();
  Handle<Object> wrapper = args[1]->ToObject();

  QueryResultHeader * header = op->getResult(id);

  if(header) {
    if(header->data) {
      wrapper->Set(GET_KEY(K_data),
        LOCAL_BUFFER(node::Buffer::New(isolate, header->data,
                                       op->getResultRowSize(header->depth),
                                       doNotFreeQueryResultAtGC, 0)));
    } else {
      wrapper->Set(GET_KEY(K_data), Null(isolate));
    }
    wrapper->Set(GET_KEY(K_level), v8::Uint32::New(isolate, header->depth));
    wrapper->Set(GET_KEY(K_tag),   v8::Uint32::New(isolate, header->tag));
    args.GetReturnValue().Set(true);
  } else {
    args.GetReturnValue().Set(false);
  }
}
// getResult(id, objectWrapper):  IMMEDIATE
Handle<Value> queryGetResult(const Arguments & args) {
  REQUIRE_ARGS_LENGTH(2);

  QueryOperation * op = unwrapPointer<QueryOperation *>(args.Holder());
  size_t id = args[0]->Uint32Value();
  Handle<Object> wrapper = args[1]->ToObject();

  QueryResultHeader * header = op->getResult(id);

  if(header) {
    if(header->data) {
      node::Buffer *buff = node::Buffer::New(header->data,
                                            op->getResultRowSize(header->depth),
                                            doNotFreeQueryResultAtGC, 0);
      wrapper->Set(K_data, Persistent<Object>(buff->handle_));
    } else {
      wrapper->Set(K_data, Null());
    }
    wrapper->Set(K_level, Persistent<Value>(v8::Uint32::New(header->depth)));
    wrapper->Set(K_tag,   Persistent<Value>(v8::Uint32::New(header->tag)));
    return True();
  }
  return False();
}