package org.wonderdb.serialize.metadata; import java.util.ArrayList; import java.util.List; import org.jboss.netty.buffer.ChannelBuffer; import org.wonderdb.serialize.Serializer; import org.wonderdb.serialize.SerializerManager; import org.wonderdb.serialize.TypeSerializer; import org.wonderdb.types.BlockPtr; import org.wonderdb.types.DBType; import org.wonderdb.types.IndexNameMeta; import org.wonderdb.types.StringType; import org.wonderdb.types.TypeMetadata; public class IndexNameMetaSerializer implements TypeSerializer { private static final IndexNameMetaSerializer instance = new IndexNameMetaSerializer(); private IndexNameMetaSerializer() { } public static final IndexNameMetaSerializer getInstance() { return instance; } @Override public DBType unmarshal(int type, ChannelBuffer buffer, TypeMetadata meta) { int id = buffer.readInt(); String indexName = ((StringType) Serializer.getInstance().getObject(SerializerManager.STRING, buffer, meta)).get(); String collectionName = ((StringType) Serializer.getInstance().getObject(SerializerManager.STRING, buffer, meta)).get(); int size = buffer.readInt(); List<Integer> columnIdList = new ArrayList<Integer>(size); for (int i = 0; i < size; i++) { int t = buffer.readInt(); columnIdList.add(t); } BlockPtr head = (BlockPtr) Serializer.getInstance().getObject(SerializerManager.BLOCK_PTR, buffer, meta); byte b = buffer.readByte(); byte b1 = buffer.readByte(); byte b2 = buffer.readByte(); IndexNameMeta inm = new IndexNameMeta(); inm.setCollectionName(collectionName); inm.setColumnIdList(columnIdList); inm.setHead(head); inm.setId(id); inm.setIndexName(indexName); inm.setUnique(b > 0 ? true : false); inm.setAscending(b1 > 0 ? true : false); inm.setIndexType(b2); return inm; } @Override public void toBytes(DBType object, ChannelBuffer buffer, TypeMetadata meta) { IndexNameMeta inm = (IndexNameMeta) object; buffer.writeInt(inm.getId()); Serializer.getInstance().serialize(SerializerManager.STRING, new StringType(inm.getIndexName()), buffer, meta); Serializer.getInstance().serialize(SerializerManager.STRING, new StringType(inm.getCollectionName()), buffer, meta); buffer.writeInt(inm.getColumnIdList().size()); for (int i = 0; i < inm.getColumnIdList().size(); i++) { int type = inm.getColumnIdList().get(i); buffer.writeInt(type); } Serializer.getInstance().serialize(SerializerManager.BLOCK_PTR, inm.getHead(), buffer, meta); buffer.writeByte(inm.isUnique() ? (byte) 1 : (byte) 0); buffer.writeByte(inm.isAscending() ? 1 : 0); buffer.writeByte(inm.getIndexType()); } @Override public int getSize(DBType object, TypeMetadata meta) { IndexNameMeta inm = (IndexNameMeta) object; int size = Integer.SIZE/8; size = size + Serializer.getInstance().getObjectSize(SerializerManager.STRING, new StringType(inm.getCollectionName()), meta); size = size + Serializer.getInstance().getObjectSize(SerializerManager.STRING, new StringType(inm.getIndexName()), meta); size = size + Integer.SIZE/8; size = size + inm.getColumnIdList().size()*Integer.SIZE/8; size = size + Serializer.getInstance().getObjectSize(SerializerManager.BLOCK_PTR, inm.getHead(), meta); size = size + 1; size = size + 1; size = size + 1; return size; } @Override public boolean isNull(int type, DBType object) { return false; } @Override public DBType getNull(int type) { return null; } @Override public int getSQLType(int type) { throw new RuntimeException("Method not supported"); } @Override public DBType convert(int type, StringType st) { throw new RuntimeException("Method not supported"); } }