/*- * See the file LICENSE for redistribution information. * * Copyright (c) 2002, 2015 Oracle and/or its affiliates. All rights reserved. * */ package com.sleepycat.persist; import java.util.Map; import java.util.SortedMap; import com.sleepycat.bind.EntryBinding; import com.sleepycat.collections.StoredSortedMap; import com.sleepycat.db.Database; import com.sleepycat.db.DatabaseEntry; import com.sleepycat.db.DatabaseException; import com.sleepycat.db.LockMode; import com.sleepycat.db.OperationStatus; import com.sleepycat.db.Transaction; /** * The EntityIndex returned by SecondaryIndex.keysIndex(). This index maps * secondary key to primary key. In Berkeley DB internal terms, this is a * secondary database that is opened without associating it with a primary. * * @author Mark Hayes */ class KeysIndex<SK, PK> extends BasicIndex<SK, PK> { private EntryBinding pkeyBinding; private SortedMap<SK, PK> map; KeysIndex(Database db, Class<SK> keyClass, EntryBinding keyBinding, Class<PK> pkeyClass, EntryBinding pkeyBinding) throws DatabaseException { super(db, keyClass, keyBinding, new DataValueAdapter<PK>(pkeyClass, pkeyBinding)); this.pkeyBinding = pkeyBinding; } /* * Of the EntityIndex methods only get()/map()/sortedMap() are implemented * here. All other methods are implemented by BasicIndex. */ public PK get(SK key) throws DatabaseException { return get(null, key, null); } public PK get(Transaction txn, SK key, LockMode lockMode) throws DatabaseException { DatabaseEntry keyEntry = new DatabaseEntry(); DatabaseEntry pkeyEntry = new DatabaseEntry(); keyBinding.objectToEntry(key, keyEntry); OperationStatus status = db.get(txn, keyEntry, pkeyEntry, lockMode); if (status == OperationStatus.SUCCESS) { return (PK) pkeyBinding.entryToObject(pkeyEntry); } else { return null; } } public Map<SK, PK> map() { return sortedMap(); } public synchronized SortedMap<SK, PK> sortedMap() { if (map == null) { map = new StoredSortedMap(db, keyBinding, pkeyBinding, false); } return map; } boolean isUpdateAllowed() { return false; } }