/*
 * LOGICAL-PARADOX.ORG
 * Copyright (C)2005 satoshi akabane(akabane@logical-paradox.org)
 * $Id: DbRecord.java,v 1.2 2005/09/07 13:38:06 rampil Exp $
 */
package org.logical_paradox.vsan.node.dbr;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
 * データファイル中の1レコードを表現する抽象レコードオブジェクト
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.2 $
 */
public class DbRecord {
	/** レコードサイズ */
	private int recordSize;
	/** レコード番号 */
	private long recordNo;
	/** このレコードのデータ */
	private byte[] data;
	/** このレコードの有効データサイズ */
	private int datasize;

	/**
	 * コンストラクタ
	 * @param recordNo_ レコード番号
	 * @param recordSize_ レコードサイズ
	 */
	public DbRecord(long recordNo_, int recordSize_) {
		recordNo = recordNo_;
		recordSize = recordSize_;
	}
	/**
	 * コンストラクタ
	 * インスタンス生成時に，データを復元する
	 * @param recordNo_ レコード番号
	 * @param recordSize_ レコードサイズ
	 * @param data バイト列
	 */
	public DbRecord(long recordNo_, int recordSize_, byte[] data, int ds) {
		this(recordNo_, recordSize_);
		setData(data, ds);
	}
	/**
	 * 指定されたバイト列からレコードを復元する
	 * @param data バイト列
	 * @param ds 有効データサイズ
	 */
	public void setData(byte[] data_, int ds) {
		data = data_;
		datasize = ds;
	}
	/**
	 * このレコードのデータ本体を返す
	 * @return データ本体
	 */
	public byte[] getData() {
		return data;
	}
	/**
	 * レコード番号を返す
	 * @return レコード番号
	 */
	public long getRecordNo() {
		return recordNo;
	}
	/**
	 * レコードサイズを返す
	 * @return レコードサイズ
	 */
	public int getRecordSize() {
		return recordSize;
	}
	/**
	 * このレコードに格納されているデータのサイズを返す
	 * @return 実際に有効なデータのサイズ
	 */
	public int getDatasize() {
		return datasize;
	}
	/**
	 * このレコードをバイト列に変換する
	 * @return 変換されたバイト列
	 */
	public byte[] toByteStream() {
		// バイトストリームのサイズを計算する
		// レコードサイズ(4bytes) + レコード番号(8bytes) + 実データサイズ(4bytes) + 実際のデータ
		int streamSize = 4 + 8 + 4 + datasize;
		byte[] b = new byte[streamSize];
		ByteBuffer bb = ByteBuffer.allocate(b.length).order(ByteOrder.BIG_ENDIAN);

		// レコードサイズ
		bb.putInt(recordSize);
		// レコード番号
		bb.putLong(recordNo);
		// 実データサイズ
		bb.putInt(datasize);
		// データ
		bb.put(data, 0, datasize);

		bb.rewind();
		return bb.array();
	}
}
