}
public void testGet()
throws DatabaseException {
SecondaryDatabase secDb = initDb();
Database priDb = secDb.getPrimaryDatabase();
DatabaseEntry data = new DatabaseEntry();
DatabaseEntry key = new DatabaseEntry();
DatabaseEntry secKey = new DatabaseEntry();
OperationStatus status;
Transaction txn = txnBegin();
/*
* For parameters that do not require initialization with a non-null
* data array, we set them to null to make sure this works. [#12121]
*/
/* Add one record for each key with one data/duplicate. */
for (int i = 0; i < NUM_RECS; i += 1) {
status = priDb.put(txn, entry(i), entry(i));
assertSame(OperationStatus.SUCCESS, status);
}
/* SecondaryDatabase.get() */
for (int i = 0; i < NUM_RECS; i += 1) {
data.setData(null);
status = secDb.get(txn, entry(i + KEY_OFFSET), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), key);
assertDataEquals(entry(i), data);
}
data.setData(null);
status = secDb.get(txn, entry(NUM_RECS + KEY_OFFSET), key,
data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* SecondaryDatabase.getSearchBoth() */
for (int i = 0; i < NUM_RECS; i += 1) {
data.setData(null);
status = secDb.getSearchBoth(txn, entry(i + KEY_OFFSET), entry(i),
data, LockMode.DEFAULT);
assertSame(OperationStatus.SUCCESS, status);
assertDataEquals(entry(i), data);
}
data.setData(null);
status = secDb.getSearchBoth(txn, entry(NUM_RECS + KEY_OFFSET),
entry(NUM_RECS), data, LockMode.DEFAULT);
assertSame(OperationStatus.NOTFOUND, status);
/* 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();
}