}
bool librados::ObjectIterator::operator==(const librados::ObjectIterator& rhs) const {
- return (ctx.get() == rhs.ctx.get());
+ if (ctx.get() == NULL)
+ return rhs.ctx.get() == NULL || rhs.ctx->lc->at_end();
+ if (rhs.ctx.get() == NULL)
+ return ctx.get() == NULL || ctx->lc->at_end();
+ return ctx.get() == rhs.ctx.get();
}
bool librados::ObjectIterator::operator!=(const librados::ObjectIterator& rhs) const {
- return (ctx.get() != rhs.ctx.get());
+ return !(*this == rhs);
}
const pair<std::string, std::string>& librados::ObjectIterator::operator*() const {
void librados::ObjectIterator::get_next()
{
const char *entry, *key;
+ if (ctx->lc->at_end())
+ return;
int ret = rados_objects_list_next(ctx.get(), &entry, &key);
if (ret == -ENOENT) {
- ctx.reset();
- *this = __EndObjectIterator;
return;
}
else if (ret) {
ASSERT_TRUE(foundit);
}
+TEST_F(LibRadosListPP, ListObjectsTwicePP) {
+ char buf[128];
+ memset(buf, 0xcc, sizeof(buf));
+ bufferlist bl1;
+ bl1.append(buf, sizeof(buf));
+ ASSERT_EQ((int)sizeof(buf), ioctx.write("foo", bl1, sizeof(buf), 0));
+ ObjectIterator iter(ioctx.objects_begin());
+ bool foundit = false;
+ while (iter != ioctx.objects_end()) {
+ foundit = true;
+ ASSERT_EQ((*iter).first, "foo");
+ ++iter;
+ }
+ ASSERT_TRUE(foundit);
+ ++iter;
+ ASSERT_TRUE(iter == ioctx.objects_end());
+ foundit = false;
+ iter.seek(0);
+ while (iter != ioctx.objects_end()) {
+ foundit = true;
+ ASSERT_EQ((*iter).first, "foo");
+ ++iter;
+ }
+ ASSERT_TRUE(foundit);
+}
+
static void check_list(std::set<std::string>& myset, rados_list_ctx_t& ctx)
{
const char *entry;