package com.sleepycat.bind.tuple;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.je.DatabaseException;
import com.sleepycat.je.ForeignKeyNullifier;
import com.sleepycat.je.SecondaryDatabase;
import com.sleepycat.je.SecondaryKeyCreator;
import de.ovgu.cide.jakutil.*;
/**
* An abstract key creator that uses a tuple key and a tuple data entry. This
* class takes care of converting the key and data entry to/from {@link TupleInput} and {@link TupleOutput} objects. The following abstract method
* must be implemented by a concrete subclass to create the index key using
* these objects
* <ul>
* <li> {@link #createSecondaryKey(TupleInput,TupleInput,TupleOutput)} </li>
* </ul>
* <!-- begin JE only -->
* <p>
* If {@link com.sleepycat.je.ForeignKeyDeleteAction#NULLIFY} was specified when
* opening the secondary database, the following method must be overridden to
* nullify the foreign index key. If NULLIFY was not specified, this method need
* not be overridden.
* </p>
* <ul>
* <li> {@link #nullifyForeignKey(TupleInput,TupleOutput)} </li>
* </ul>
* <p>
* If {@link com.sleepycat.je.ForeignKeyDeleteAction#NULLIFY} was specified when
* creating the secondary, this method is called when the entity for this
* foreign key is deleted. If NULLIFY was not specified, this method will not be
* called and may always return false.
* </p>
* <!-- end JE only -->
* @author Mark Hayes
*/
public abstract class TupleTupleKeyCreator extends TupleBase implements SecondaryKeyCreator, ForeignKeyNullifier {
/**
* Creates a tuple-tuple key creator.
*/
public TupleTupleKeyCreator(){
}
public boolean createSecondaryKey( SecondaryDatabase db, DatabaseEntry primaryKeyEntry, DatabaseEntry dataEntry, DatabaseEntry indexKeyEntry) throws DatabaseException {
TupleOutput output=getTupleOutput(null);
TupleInput primaryKeyInput=entryToInput(primaryKeyEntry);
TupleInput dataInput=entryToInput(dataEntry);
if (createSecondaryKey(primaryKeyInput,dataInput,output)) {
outputToEntry(output,indexKeyEntry);
return true;
}
else {
return false;
}
}
public boolean nullifyForeignKey( SecondaryDatabase db, DatabaseEntry dataEntry) throws DatabaseException {
TupleOutput output=getTupleOutput(null);
if (nullifyForeignKey(entryToInput(dataEntry),output)) {
outputToEntry(output,dataEntry);
return true;
}
else {
return false;
}
}
/**
* Creates the index key from primary key tuple and data tuple.
* @param primaryKeyInputis the {@link TupleInput} for the primary key entry.
* @param dataInputis the {@link TupleInput} for the data entry.
* @param indexKeyOutputis the destination index key tuple.
* @return true if a key was created, or false to indicate that the key is
* not present.
*/
public abstract boolean createSecondaryKey( TupleInput primaryKeyInput, TupleInput dataInput, TupleOutput indexKeyOutput);
/**
* Clears the index key in the tuple data entry. The dataInput should be
* read and then written to the dataOutput, clearing the index key in the
* process.
* <p>
* The secondary key should be output or removed by this method such that{@link #createSecondaryKey} will return false. Other fields in the data
* object should remain unchanged.
* </p>
* @param dataInputis the {@link TupleInput} for the data entry.
* @param dataOutputis the destination {@link TupleOutput}.
* @return true if the key was cleared, or false to indicate that the key is
* not present and no change is necessary.
*/
public boolean nullifyForeignKey( TupleInput dataInput, TupleOutput dataOutput){
return false;
}
}