static bool _mongoc_cursor_transform_next (mongoc_cursor_t *cursor, const bson_t **bson) { mongoc_cursor_transform_t *transform; ENTRY; transform = cursor->iface_data; for (;; ) { if (!_mongoc_cursor_next (cursor, bson)) { RETURN (false); } switch (transform->filter (*bson, transform->ctx)) { case MONGO_CURSOR_TRANSFORM_DROP: break; case MONGO_CURSOR_TRANSFORM_PASS: RETURN (true); break; case MONGO_CURSOR_TRANSFORM_MUTATE: bson_reinit (&transform->tmp); transform->mutate (*bson, &transform->tmp, transform->ctx); *bson = &transform->tmp; RETURN (true); break; default: abort (); break; } } }
bool _mongoc_cursor_array_prime (mongoc_cursor_t *cursor) { bool ret = true; mongoc_cursor_array_t *arr; bson_iter_t iter; ENTRY; arr = (mongoc_cursor_array_t *)cursor->iface_data; if (!arr->has_array) { arr->has_array = true; ret = _mongoc_cursor_next (cursor, &arr->result); if (!(ret && bson_iter_init_find (&iter, arr->result, arr->field_name) && BSON_ITER_HOLDS_ARRAY (&iter) && bson_iter_recurse (&iter, &arr->iter))) { ret = false; } } return ret; }
bool mongoc_cursor_next (mongoc_cursor_t *cursor, const bson_t **bson) { bool ret; ENTRY; BSON_ASSERT(cursor); BSON_ASSERT(bson); TRACE ("cursor_id(%"PRId64")", cursor->rpc.reply.cursor_id); if (bson) { *bson = NULL; } if (cursor->failed) { return false; } if (cursor->iface.next) { ret = cursor->iface.next(cursor, bson); } else { ret = _mongoc_cursor_next(cursor, bson); } cursor->current = *bson; cursor->count++; RETURN(ret); }
bson_bool_t _mongoc_cursor_cursorid_next (mongoc_cursor_t *cursor, const bson_t **bson) { bson_bool_t ret; mongoc_cursor_cursorid_t *cid; bson_iter_t iter; bson_iter_t child; const char *ns; ENTRY; cid = cursor->interface_data; ret = _mongoc_cursor_next (cursor, bson); if (!cid->has_cursor) { cid->has_cursor = TRUE; if (ret && bson_iter_init_find (&iter, *bson, "cursor") && BSON_ITER_HOLDS_DOCUMENT (&iter) && bson_iter_recurse (&iter, &child)) { while (bson_iter_next (&child)) { if (strcmp (bson_iter_key (&child), "id") == 0) { cursor->rpc.reply.cursor_id = bson_iter_int64 (&child); } else if (strcmp (bson_iter_key (&child), "ns") == 0) { ns = bson_iter_utf8 (&child, &cursor->nslen); strncpy (cursor->ns, ns, sizeof cursor->ns - 1); } } cursor->is_command = FALSE; ret = _mongoc_cursor_next (cursor, bson); } } RETURN (ret); }
bson_bool_t mongoc_cursor_next (mongoc_cursor_t *cursor, const bson_t **bson) { bson_bool_t ret; BSON_ASSERT(cursor); BSON_ASSERT(bson); if (cursor->interface.next) { ret = cursor->interface.next(cursor, bson); } else { ret = _mongoc_cursor_next(cursor, bson); } RETURN(ret); }
bool mongoc_cursor_next (mongoc_cursor_t *cursor, const bson_t **bson) { bool ret; BSON_ASSERT(cursor); BSON_ASSERT(bson); if (cursor->iface.next) { ret = cursor->iface.next(cursor, bson); } else { ret = _mongoc_cursor_next(cursor, bson); } cursor->count++; RETURN(ret); }
bool _mongoc_cursor_array_next (mongoc_cursor_t *cursor, const bson_t **bson) { bool ret = true; mongoc_cursor_array_t *arr; bson_iter_t iter; ENTRY; arr = cursor->iface_data; *bson = NULL; if (!arr->has_array) { arr->has_array = true; ret = _mongoc_cursor_next (cursor, &arr->result); if (!(ret && bson_iter_init_find (&iter, arr->result, "result") && BSON_ITER_HOLDS_ARRAY (&iter) && bson_iter_recurse (&iter, &arr->iter) && bson_iter_next (&arr->iter))) { ret = false; } } else { ret = bson_iter_next (&arr->iter); } if (ret) { bson_iter_document (&arr->iter, &arr->document_len, &arr->document); bson_init_static (&arr->bson, arr->document, arr->document_len); *bson = &arr->bson; } RETURN (ret); }