/*
* @(#) ColumnFamilyObserver.java
* Created Jun 6, 2011 by oleg
* (C) ONE, SIA
*/
package org.apache.cassandra.db;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.cassandra.io.IColumnNameObserver;
import org.apache.cassandra.io.ICompactSerializer2;
import org.apache.cassandra.io.IndexHelper;
/**
* This deserializes binary stream and feeds columnnames directly to {@link IColumnNameObserver}
* without creating a lot of temporary objects, which deserializing to ColumnFamily will result in.
*
* @author Oleg Anastasyev<oa@hq.one.lv>
* @see ColumnFamilySerializer
*
*/
public class ObservingColumnFamilyDeserializer
{
private final IColumnNameObserver columnNameObserver;
/**
* @param columnNameObserver
*/
public ObservingColumnFamilyDeserializer(IColumnNameObserver columnNameObserver)
{
this.columnNameObserver = columnNameObserver;
}
public void deserialize(DecoratedKey<?> key, DataInput dis) throws IOException
{
IndexHelper.skipBloomFilter(dis);
IndexHelper.skipIndex(dis);
dis.readInt(); dis.readLong(); // skip over CF delete timestamps
int size = dis.readInt();
for (int i = 0; i < size; ++i)
{
deserializeColumn(key,dis);
}
}
/**
* @param dis
* @throws IOException
* @see ColumnSerializer#deserialize(DataInput)
*/
private void deserializeColumn(DecoratedKey<?> key, DataInput dis) throws IOException
{
byte[] name = ColumnSerializer.readName(dis);
boolean delete = dis.readBoolean();
long ts = dis.readLong();
int length = dis.readInt();
if (length < 0)
{
throw new IOException("Corrupt (negative) value length encountered");
}
if (length > 0)
{
dis.skipBytes(length); // we are not interested in value
}
columnNameObserver.add(key, name);
}
}