001: /*-
002: * See the file LICENSE for redistribution information.
003: *
004: * Copyright (c) 2000,2008 Oracle. All rights reserved.
005: *
006: * $Id: TupleTupleKeyCreator.java,v 1.28.2.2 2008/01/07 15:14:06 cwl Exp $
007: */
008:
009: package com.sleepycat.bind.tuple;
010:
011: import com.sleepycat.je.DatabaseEntry;
012: import com.sleepycat.je.DatabaseException;
013: import com.sleepycat.je.ForeignKeyNullifier;
014: import com.sleepycat.je.SecondaryDatabase;
015: import com.sleepycat.je.SecondaryKeyCreator;
016:
017: /**
018: * An abstract key creator that uses a tuple key and a tuple data entry. This
019: * class takes care of converting the key and data entry to/from {@link
020: * TupleInput} and {@link TupleOutput} objects.
021: * The following abstract method must be implemented by a concrete subclass
022: * to create the index key using these objects
023: * <ul>
024: * <li> {@link #createSecondaryKey(TupleInput,TupleInput,TupleOutput)} </li>
025: * </ul>
026: * <!-- begin JE only -->
027: * <p>If {@link com.sleepycat.je.ForeignKeyDeleteAction#NULLIFY} was
028: * specified when opening the secondary database, the following method must be
029: * overridden to nullify the foreign index key. If NULLIFY was not specified,
030: * this method need not be overridden.</p>
031: * <ul>
032: * <li> {@link #nullifyForeignKey(TupleInput,TupleOutput)} </li>
033: * </ul>
034: * <p>If {@link com.sleepycat.je.ForeignKeyDeleteAction#NULLIFY} was
035: * specified when creating the secondary, this method is called when the
036: * entity for this foreign key is deleted. If NULLIFY was not specified,
037: * this method will not be called and may always return false.</p>
038: * <!-- end JE only -->
039: *
040: * @author Mark Hayes
041: */
042: public abstract class TupleTupleKeyCreator extends TupleBase implements
043: SecondaryKeyCreator, ForeignKeyNullifier {
044:
045: /**
046: * Creates a tuple-tuple key creator.
047: */
048: public TupleTupleKeyCreator() {
049: }
050:
051: // javadoc is inherited
052: public boolean createSecondaryKey(SecondaryDatabase db,
053: DatabaseEntry primaryKeyEntry, DatabaseEntry dataEntry,
054: DatabaseEntry indexKeyEntry) throws DatabaseException {
055:
056: TupleOutput output = getTupleOutput(null);
057: TupleInput primaryKeyInput = entryToInput(primaryKeyEntry);
058: TupleInput dataInput = entryToInput(dataEntry);
059: if (createSecondaryKey(primaryKeyInput, dataInput, output)) {
060: outputToEntry(output, indexKeyEntry);
061: return true;
062: } else {
063: return false;
064: }
065: }
066:
067: // javadoc is inherited
068: public boolean nullifyForeignKey(SecondaryDatabase db,
069: DatabaseEntry dataEntry) throws DatabaseException {
070:
071: TupleOutput output = getTupleOutput(null);
072: if (nullifyForeignKey(entryToInput(dataEntry), output)) {
073: outputToEntry(output, dataEntry);
074: return true;
075: } else {
076: return false;
077: }
078: }
079:
080: /**
081: * Creates the index key from primary key tuple and data tuple.
082: *
083: * @param primaryKeyInput is the {@link TupleInput} for the primary key
084: * entry.
085: *
086: * @param dataInput is the {@link TupleInput} for the data entry.
087: *
088: * @param indexKeyOutput is the destination index key tuple.
089: *
090: * @return true if a key was created, or false to indicate that the key is
091: * not present.
092: */
093: public abstract boolean createSecondaryKey(
094: TupleInput primaryKeyInput, TupleInput dataInput,
095: TupleOutput indexKeyOutput);
096:
097: /**
098: * Clears the index key in the tuple data entry. The dataInput should be
099: * read and then written to the dataOutput, clearing the index key in the
100: * process.
101: *
102: * <p>The secondary key should be output or removed by this method such
103: * that {@link #createSecondaryKey} will return false. Other fields in the
104: * data object should remain unchanged.</p>
105: *
106: * @param dataInput is the {@link TupleInput} for the data entry.
107: *
108: * @param dataOutput is the destination {@link TupleOutput}.
109: *
110: * @return true if the key was cleared, or false to indicate that the key
111: * is not present and no change is necessary.
112: */
113: public boolean nullifyForeignKey(TupleInput dataInput,
114: TupleOutput dataOutput) {
115:
116: return false;
117: }
118: }
|