blob: f3a7b28d892831a3f8eba3980230dce6d3b340fb [file] [log] [blame]
/*-
* Copyright (C) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
*
* This file was distributed by Oracle as part of a version of Oracle Berkeley
* DB Java Edition made available at:
*
* http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html
*
* Please see the LICENSE file included in the top-level directory of the
* appropriate version of Oracle Berkeley DB Java Edition for a copy of the
* license and additional information.
*/
package com.sleepycat.persist.raw;
import java.io.Closeable;
import com.sleepycat.compat.DbCompat;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.Environment;
import com.sleepycat.persist.PrimaryIndex;
import com.sleepycat.persist.SecondaryIndex;
import com.sleepycat.persist.StoreConfig;
import com.sleepycat.persist.StoreExistsException;
import com.sleepycat.persist.StoreNotFoundException;
import com.sleepycat.persist.evolve.IncompatibleClassException;
import com.sleepycat.persist.evolve.Mutations;
import com.sleepycat.persist.impl.Store;
import com.sleepycat.persist.model.EntityModel;
/**
* Provides access to the raw data in a store for use by general purpose tools.
* A <code>RawStore</code> provides access to stored entities without using
* entity classes or key classes. Keys are represented as simple type objects
* or, for composite keys, as {@link RawObject} instances, and entities are
* represented as {@link RawObject} instances.
*
* <p>{@code RawStore} objects are thread-safe. Multiple threads may safely
* call the methods of a shared {@code RawStore} object.</p>
*
* <p>When using a {@code RawStore}, the current persistent class definitions
* are not used. Instead, the previously stored metadata and class definitions
* are used. This has several implications:</p>
* <ol>
* <li>An {@code EntityModel} may not be specified using {@link
* StoreConfig#setModel}. In other words, the configured model must be
* null (the default).</li>
* <li>When storing entities, their format will not automatically be evolved
* to the current class definition, even if the current class definition has
* changed.</li>
* </ol>
*
* @author Mark Hayes
*/
public class RawStore
/* <!-- begin JE only --> */
implements Closeable
/* <!-- end JE only --> */
{
private Store store;
/**
* Opens an entity store for raw data access.
*
* @param env an open Berkeley DB environment.
*
* @param storeName the name of the entity store within the given
* environment.
*
* @param config the store configuration, or null to use default
* configuration properties.
*
* @throws StoreNotFoundException when the {@link
* StoreConfig#setAllowCreate AllowCreate} configuration parameter is false
* and the store's internal catalog database does not exist.
*
* @throws IllegalArgumentException if the <code>Environment</code> is
* read-only and the <code>config ReadOnly</code> property is false.
*
* @throws DatabaseException the base class for all BDB exceptions.
*/
public RawStore(Environment env, String storeName, StoreConfig config)
throws StoreNotFoundException, DatabaseException {
try {
store = new Store(env, storeName, config, true /*rawAccess*/);
} catch (StoreExistsException e) {
/* Should never happen, ExclusiveCreate not used. */
throw DbCompat.unexpectedException(e);
} catch (IncompatibleClassException e) {
/* Should never happen, evolution is not performed. */
throw DbCompat.unexpectedException(e);
}
}
/**
* Opens the primary index for a given entity class.
*
* @param entityClass the name of the entity class.
*
* @return the PrimaryIndex.
*
* @throws DatabaseException the base class for all BDB exceptions.
*/
public PrimaryIndex<Object, RawObject> getPrimaryIndex(String entityClass)
throws DatabaseException {
return store.getPrimaryIndex
(Object.class, null, RawObject.class, entityClass);
}
/**
* Opens the secondary index for a given entity class and secondary key
* name.
*
* @param entityClass the name of the entity class.
*
* @param keyName the secondary key name.
*
* @return the SecondaryIndex.
*
* @throws DatabaseException the base class for all BDB exceptions.
*/
public SecondaryIndex<Object, Object, RawObject>
getSecondaryIndex(String entityClass, String keyName)
throws DatabaseException {
return store.getSecondaryIndex
(getPrimaryIndex(entityClass), RawObject.class, entityClass,
Object.class, null, keyName);
}
/**
* Returns the environment associated with this store.
*
* @return the Environment.
*/
public Environment getEnvironment() {
return store.getEnvironment();
}
/**
* Returns a copy of the entity store configuration.
*
* @return the StoreConfig.
*/
public StoreConfig getConfig() {
return store.getConfig();
}
/**
* Returns the name of this store.
*
* @return the store name.
*/
public String getStoreName() {
return store.getStoreName();
}
/**
* Returns the last configured and stored entity model for this store.
*
* @return the EntityModel.
*/
public EntityModel getModel() {
return store.getModel();
}
/**
* Returns the set of mutations that were configured and stored previously.
*
* @return the Mutations.
*/
public Mutations getMutations() {
return store.getMutations();
}
/**
* Closes all databases and sequences that were opened by this model. No
* databases opened via this store may be in use.
*
* <p>WARNING: To guard against memory leaks, the application should
* discard all references to the closed handle. While BDB makes an effort
* to discard references from closed objects to the allocated memory for an
* environment, this behavior is not guaranteed. The safe course of action
* for an application is to discard all references to closed BDB
* objects.</p>
*
* @throws DatabaseException the base class for all BDB exceptions.
*/
public void close()
throws DatabaseException {
store.close();
}
}