package com.sleepycat.bind.tuple;
import com.sleepycat.je.DatabaseEntry;
import com.sleepycat.util.UtfOps;
import de.ovgu.cide.jakutil.*;
/**
* A concrete <code>TupleBinding</code> for a simple <code>String</code>
* value.
* <p>
* There are two ways to use this class:
* </p>
* <ol>
* <li>When using the {@link com.sleepycat.je} package directly, the static
* methods in this class can be used to convert between primitive values and{@link DatabaseEntry} objects.</li>
* <li>When using the {@link com.sleepycat.collections} package, an instance of
* this class can be used with any stored collection. The easiest way to obtain
* a binding instance is with the {@link TupleBinding#getPrimitiveBinding}method.</li>
* </ol>
*/
public class StringBinding extends TupleBinding {
public Object entryToObject( TupleInput input){
return input.readString();
}
public void objectToEntry( Object object, TupleOutput output){
output.writeString((String)object);
}
protected TupleOutput getTupleOutput( Object object){
return sizedOutput((String)object);
}
/**
* Converts an entry buffer into a simple <code>String</code> value.
* @param entryis the source entry buffer.
* @return the resulting value.
*/
public static String entryToString( DatabaseEntry entry){
return entryToInput(entry).readString();
}
/**
* Converts a simple <code>String</code> value into an entry buffer.
* @param valis the source value.
* @param entryis the destination entry buffer.
*/
public static void stringToEntry( String val, DatabaseEntry entry){
outputToEntry(sizedOutput(val).writeString(val),entry);
}
/**
* Returns a tuple output object of the exact size needed, to avoid wasting
* space when a single primitive is output.
*/
private static TupleOutput sizedOutput( String val){
int stringLength=(val == null) ? 1 : UtfOps.getByteLength(val.toCharArray());
stringLength++;
return new TupleOutput(new byte[stringLength]);
}
}