/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.collections.test;
import java.util.ArrayList;
import java.util.List;
import com.sleepycat.bind.EntityBinding;
import com.sleepycat.bind.EntryBinding;
import com.sleepycat.bind.RecordNumberBinding;
import com.sleepycat.collections.CurrentTransaction;
import com.sleepycat.compat.DbCompat;
import com.sleepycat.db.Database;
import com.sleepycat.db.DatabaseException;
import com.sleepycat.db.Environment;
import com.sleepycat.db.SecondaryConfig;
/**
* @author Mark Hayes
*/
class TestStore {
static final TestKeyCreator BYTE_EXTRACTOR = new TestKeyCreator(false);
static final TestKeyCreator RECNO_EXTRACTOR = new TestKeyCreator(true);
static final EntryBinding VALUE_BINDING = new TestDataBinding();
static final EntryBinding BYTE_KEY_BINDING = VALUE_BINDING;
static final EntryBinding RECNO_KEY_BINDING = new RecordNumberBinding();
static final EntityBinding BYTE_ENTITY_BINDING =
new TestEntityBinding(false);
static final EntityBinding RECNO_ENTITY_BINDING =
new TestEntityBinding(true);
static final TestKeyAssigner BYTE_KEY_ASSIGNER =
new TestKeyAssigner(false);
static final TestKeyAssigner RECNO_KEY_ASSIGNER =
new TestKeyAssigner(true);
static final TestStore BTREE_UNIQ;
static final TestStore BTREE_DUP;
static final TestStore BTREE_DUPSORT;
static final TestStore BTREE_RECNUM;
static final TestStore HASH_UNIQ;
static final TestStore HASH_DUP;
static final TestStore HASH_DUPSORT;
static final TestStore QUEUE;
static final TestStore RECNO;
static final TestStore RECNO_RENUM;
static final TestStore[] ALL;
static {
List list = new ArrayList();
SecondaryConfig config;
config = new SecondaryConfig();
DbCompat.setTypeBtree(config);
BTREE_UNIQ = new TestStore("btree-uniq", config);
BTREE_UNIQ.indexOf = BTREE_UNIQ;
list.add(BTREE_UNIQ);
if (DbCompat.INSERTION_ORDERED_DUPLICATES) {
config = new SecondaryConfig();
DbCompat.setTypeBtree(config);
DbCompat.setUnsortedDuplicates(config, true);
BTREE_DUP = new TestStore("btree-dup", config);
BTREE_DUP.indexOf = null; // indexes must use sorted dups
list.add(BTREE_DUP);
} else {
BTREE_DUP = null;
}
config = new SecondaryConfig();
DbCompat.setTypeBtree(config);
DbCompat.setSortedDuplicates(config, true);
BTREE_DUPSORT = new TestStore("btree-dupsort", config);
BTREE_DUPSORT.indexOf = BTREE_UNIQ;
list.add(BTREE_DUPSORT);
if (DbCompat.BTREE_RECNUM_METHOD) {
config = new SecondaryConfig();
DbCompat.setTypeBtree(config);
DbCompat.setBtreeRecordNumbers(config, true);
BTREE_RECNUM = new TestStore("btree-recnum", config);
BTREE_RECNUM.indexOf = BTREE_RECNUM;
list.add(BTREE_RECNUM);
} else {
BTREE_RECNUM = null;
}
if (DbCompat.HASH_METHOD) {
config = new SecondaryConfig();
DbCompat.setTypeHash(config);
HASH_UNIQ = new TestStore("hash-uniq", config);
HASH_UNIQ.indexOf = HASH_UNIQ;
list.add(HASH_UNIQ);
if (DbCompat.INSERTION_ORDERED_DUPLICATES) {
config = new SecondaryConfig();
DbCompat.setTypeHash(config);
DbCompat.setUnsortedDuplicates(config, true);
HASH_DUP = new TestStore("hash-dup", config);
HASH_DUP.indexOf = null; // indexes must use sorted dups
list.add(HASH_DUP);
} else {
HASH_DUP = null;
}
config = new SecondaryConfig();
DbCompat.setTypeHash(config);
DbCompat.setSortedDuplicates(config, true);
HASH_DUPSORT = new TestStore("hash-dupsort", config);
HASH_DUPSORT.indexOf = HASH_UNIQ;
list.add(HASH_DUPSORT);
} else {
HASH_UNIQ = null;
HASH_DUP = null;
HASH_DUPSORT = null;
}
if (DbCompat.QUEUE_METHOD) {
config = new SecondaryConfig();
DbCompat.setTypeQueue(config);
QUEUE = new TestStore("queue", config);
QUEUE.indexOf = QUEUE;
list.add(QUEUE);
} else {
QUEUE = null;
}
if (DbCompat.RECNO_METHOD) {
config = new SecondaryConfig();
DbCompat.setTypeRecno(config);
RECNO = new TestStore("recno", config);
RECNO.indexOf = RECNO;
list.add(RECNO);
config = new SecondaryConfig();
DbCompat.setTypeRecno(config);
DbCompat.setRenumbering(config, true);
RECNO_RENUM = new TestStore("recno-renum", config);
RECNO_RENUM.indexOf = null; // indexes must have stable keys
list.add(RECNO_RENUM);
} else {
RECNO = null;
RECNO_RENUM = null;
}
ALL = new TestStore[list.size()];
list.toArray(ALL);
}
private String name;
private SecondaryConfig config;
private TestStore indexOf;
private boolean isRecNumFormat;
private TestStore(String name, SecondaryConfig config) {
this.name = name;
this.config = config;
isRecNumFormat = isQueueOrRecno() ||
(DbCompat.isTypeBtree(config) &&
DbCompat.getBtreeRecordNumbers(config));
}
EntryBinding getValueBinding() {
return VALUE_BINDING;
}
EntryBinding getKeyBinding() {
return isRecNumFormat ? RECNO_KEY_BINDING : BYTE_KEY_BINDING;
}
EntityBinding getEntityBinding() {
return isRecNumFormat ? RECNO_ENTITY_BINDING : BYTE_ENTITY_BINDING;
}
TestKeyAssigner getKeyAssigner() {
if (isQueueOrRecno()) {
return null;
} else {
if (isRecNumFormat) {
return RECNO_KEY_ASSIGNER;
} else {
return BYTE_KEY_ASSIGNER;
}
}
}
String getName() {
return name;
}
boolean isOrdered() {
return !DbCompat.isTypeHash(config);
}
boolean isQueueOrRecno() {
return DbCompat.isTypeQueue(config) || DbCompat.isTypeRecno(config);
}
boolean areKeyRangesAllowed() {
return isOrdered() && !isQueueOrRecno();
}
boolean areDuplicatesAllowed() {
return DbCompat.getSortedDuplicates(config) ||
DbCompat.getUnsortedDuplicates(config);
}
boolean hasRecNumAccess() {
return isRecNumFormat;
}
boolean areKeysRenumbered() {
return hasRecNumAccess() &&
(DbCompat.isTypeBtree(config) ||
DbCompat.getRenumbering(config));
}
TestStore getIndexOf() {
return DbCompat.SECONDARIES ? indexOf : null;
}
Database open(Environment env, String fileName)
throws DatabaseException {
int fixedLen = (isQueueOrRecno() ? 1 : 0);
return openDb(env, fileName, fixedLen, null);
}
Database openIndex(Database primary, String fileName)
throws DatabaseException {
int fixedLen = (isQueueOrRecno() ? 4 : 0);
config.setKeyCreator(isRecNumFormat ? RECNO_EXTRACTOR
: BYTE_EXTRACTOR);
Environment env = primary.getEnvironment();
return openDb(env, fileName, fixedLen, primary);
}
private Database openDb(Environment env, String fileName, int fixedLen,
Database primary)
throws DatabaseException {
if (fixedLen > 0) {
DbCompat.setRecordLength(config, fixedLen);
DbCompat.setRecordPad(config, 0);
} else {
DbCompat.setRecordLength(config, 0);
}
config.setAllowCreate(true);
DbCompat.setReadUncommitted(config, true);
config.setTransactional(CurrentTransaction.getInstance(env) != null);
if (primary != null) {
return DbCompat.testOpenSecondaryDatabase
(env, null, fileName, null, primary, config);
} else {
return DbCompat.testOpenDatabase
(env, null, fileName, null, config);
}
}
}