/* Get a cursor txn. */
txnCommit(txn);
txn = txnBeginCursor();
SecondaryCursor cursor = secDb.openSecondaryCursor(txn, null);
try {
/* SecondaryCursor.getFirst()/getNext() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getFirst(secKey, key, data, LockMode.DEFAULT);
for (int i = 0; i < NUM_RECS; i += 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getNext(secKey, key, data, LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getCurrent() (last) */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getCurrent(secKey, key, data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(NUM_RECS - 1 + KEY_OFFSET), secKey);
assertDataEquals(entry(NUM_RECS - 1), key);
assertDataEquals(entry(NUM_RECS - 1), data);
/* SecondaryCursor.getLast()/getPrev() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getLast(secKey, key, data, LockMode.DEFAULT);
for (int i = NUM_RECS - 1; i >= 0; i -= 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getPrev(secKey, key, data, LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getCurrent() (first) */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getCurrent(secKey, key, data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(0 + KEY_OFFSET), secKey);
assertDataEquals(entry(0), key);
assertDataEquals(entry(0), data);
/* SecondaryCursor.getSearchKey() */
key.setData(null);
data.setData(null);
status = cursor.getSearchKey(entry(KEY_OFFSET - 1), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
for (int i = 0; i < NUM_RECS; i += 1) {
key.setData(null);
data.setData(null);
status = cursor.getSearchKey(entry(i + KEY_OFFSET), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
}
key.setData(null);
data.setData(null);
status = cursor.getSearchKey(entry(NUM_RECS + KEY_OFFSET), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getSearchBoth() */
data.setData(null);
status = cursor.getSearchKey(entry(KEY_OFFSET - 1), entry(0),
data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
for (int i = 0; i < NUM_RECS; i += 1) {
data.setData(null);
status = cursor.getSearchBoth(entry(i + KEY_OFFSET), entry(i),
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), data);
}
data.setData(null);
status = cursor.getSearchBoth(entry(NUM_RECS + KEY_OFFSET),
entry(NUM_RECS), data,
LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getSearchKeyRange() */
key.setData(null);
data.setData(null);
status = cursor.getSearchKeyRange(entry(KEY_OFFSET - 1), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(0), key);
assertDataEquals(entry(0), data);
for (int i = 0; i < NUM_RECS; i += 1) {
key.setData(null);
data.setData(null);
status = cursor.getSearchKeyRange(entry(i + KEY_OFFSET), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
}
key.setData(null);
data.setData(null);
status = cursor.getSearchKeyRange(entry(NUM_RECS + KEY_OFFSET),
key, data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getSearchBothRange() */
data.setData(null);
status = cursor.getSearchBothRange(entry(1 + KEY_OFFSET), entry(1),
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(1), data);
for (int i = 0; i < NUM_RECS; i += 1) {
data.setData(null);
status = cursor.getSearchBothRange(entry(i + KEY_OFFSET),
entry(i), data,
LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), data);
}
data.setData(null);
status = cursor.getSearchBothRange(entry(NUM_RECS + KEY_OFFSET),
entry(NUM_RECS), data,
LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* Add one duplicate for each key. */
Cursor priCursor = priDb.openCursor(txn, null);
try {
for (int i = 0; i < NUM_RECS; i += 1) {
status = priCursor.put(entry(i + KEY_OFFSET), entry(i));
assertSame(OperationStatus.SUCCESS, status);
}
} finally {
priCursor.close();
}
/* SecondaryCursor.getNextDup() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getFirst(secKey, key, data, LockMode.DEFAULT);
for (int i = 0; i < NUM_RECS; i += 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getNextDup(secKey, key, data,
LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i + KEY_OFFSET), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getNextDup(secKey, key, data,
LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getNext(secKey, key, data, LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getNextNoDup() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getFirst(secKey, key, data, LockMode.DEFAULT);
for (int i = 0; i < NUM_RECS; i += 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getNextNoDup(secKey, key, data,
LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getPrevDup() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getLast(secKey, key, data, LockMode.DEFAULT);
for (int i = NUM_RECS - 1; i >= 0; i -= 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i + KEY_OFFSET), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getPrevDup(secKey, key, data,
LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getPrevDup(secKey, key, data,
LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getPrev(secKey, key, data, LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryCursor.getPrevNoDup() */
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getLast(secKey, key, data, LockMode.DEFAULT);
for (int i = NUM_RECS - 1; i >= 0; i -= 1) {
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i + KEY_OFFSET), secKey);
assertDataEquals(entry(i + KEY_OFFSET), key);
assertDataEquals(entry(i), data);
secKey.setData(null);
key.setData(null);
data.setData(null);
status = cursor.getPrevNoDup(secKey, key, data,
LockMode.DEFAULT);
}
assertSame(OperationStatus.NOTFOUND, status);
} finally {
cursor.close();
}
txnCommit(txn);
secDb.close();
priDb.close();