nextObject method
Implementation
Future<Map<String, dynamic>?> nextObject() {
if (state == State.init) {
var qm = generateQueryMessage();
return db.queryMessage(qm).then((replyMessage) {
state = State.open;
getCursorData(replyMessage);
if (items.isNotEmpty) {
return Future.value(_getNextItem());
} else {
return Future.value(null);
}
});
} else if (state == State.open && limit > 0 && _returnedCount == limit) {
return close();
} else if (state == State.open && items.isNotEmpty) {
return Future.value(_getNextItem());
} else if (state == State.open && cursorId > 0) {
var qm = generateGetMoreMessage();
return db.queryMessage(qm).then((replyMessage) {
state = State.open;
getCursorData(replyMessage);
var isDead = (replyMessage.responseFlags ==
MongoReplyMessage.flagsCursorNotFound) &&
(cursorId == 0);
if (items.isNotEmpty) {
return Future.value(_getNextItem());
} else if (tailable && !isDead && awaitData) {
return Future.value(null);
} else if (tailable && !isDead) {
var completer = Completer<Map<String, dynamic>?>();
Timer(Duration(milliseconds: tailableRetryInterval),
() => completer.complete(null));
return completer.future;
} else {
state = State.closed;
return Future.value(null);
}
});
} else {
state = State.closed;
return Future.value(null);
}
}