/* * Copyright (c) 2008 - 2011, Jan Stender, Bjoern Kolbeck, Mikael Hoegqvist, * Felix Hupfeld, Zuse Institute Berlin * * Licensed under the BSD License, see LICENSE file for details. * */ package de.mxro.thrd.babudb05.lsmdb; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import de.mxro.thrd.xstreemfs.foundation.buffer.ReusableBuffer; /** * * @author bjko */ public class InsertRecordGroup { public final static int DB_ID_UNKNOWN = -1; private final List<InsertRecord> records = new LinkedList<InsertRecord>(); private int databaseId = DB_ID_UNKNOWN; public InsertRecordGroup() {} public InsertRecordGroup(int databaseId) { this.databaseId = databaseId; } public void addInsert(int indexId, byte[] key, byte[] value) { records.add(new InsertRecord(indexId, key, value)); } public List<InsertRecord> getInserts() { return records; } public void setDatabaseId(int id) { this.databaseId = id; } public int getDatabaseId() { return databaseId; } protected void addInsertRecord(InsertRecord rec) { assert (rec != null); records.add(rec); } public int getSize() { int size = Integer.SIZE / 8; for (InsertRecord ir : records) size += ir.getSize(); return size; } public void serialize(ReusableBuffer buffer) { buffer.putInt(databaseId); for (InsertRecord ir : records) ir.serialize(buffer); } public static InsertRecordGroup deserialize(ReusableBuffer buffer) { int dbId = buffer.getInt(); InsertRecordGroup ai = new InsertRecordGroup(dbId); while (buffer.hasRemaining()) { InsertRecord ir = InsertRecord.deserialize(buffer); ai.addInsertRecord(ir); } return ai; } public static class InsertRecord { private final byte indexId; private final byte[] key; private final byte[] value; public InsertRecord(int indexId, byte[] key, byte[] value) { this.indexId = (byte) indexId; this.key = key; this.value = value; } public int getIndexId() { return 0x00FF & indexId; } public byte[] getKey() { return key; } public byte[] getValue() { return value; } public int getSize() { if (value != null) return Byte.SIZE / 8 + Integer.SIZE / 8 * 2 + key.length + value.length; else return Byte.SIZE / 8 + Integer.SIZE / 8 * 2 + key.length; } public void serialize(ReusableBuffer buffer) { buffer.put(indexId); buffer.putInt(key.length); buffer.put(key); if (value != null) { buffer.putInt(value.length); buffer.put(value); } else { buffer.putInt(0); } } public static InsertRecord deserialize(ReusableBuffer buffer) { byte tmp = buffer.get(); int indexId = 0x00FF & tmp; int size = buffer.getInt(); byte[] key = new byte[size]; buffer.get(key); size = buffer.getInt(); byte[] value = null; if (size > 0) { value = new byte[size]; buffer.get(value); } return new InsertRecord(indexId, key, value); } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("index: " + indexId); sb.append(", key: " + (key == null ? null : Arrays.toString(key))); sb.append(", value: " + (value == null ? null : Arrays.toString(value))); return sb.toString(); } } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getClass().getName() + "\n"); sb.append("database: " + databaseId + "\n"); for (InsertRecord record : records) sb.append(record + "\n"); return sb.toString(); } }