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

import java.io.EOFException;
import java.io.IOException;

/**
 * 固定長レコードに対してアクセスするためのインターフェース
 * @author satoshi akabane@logical-paradox.org
 * @version $Revision: 1.1 $
 */
public interface RecordAccessor {
	/**
	 * 指定名称のデータソースに接続する．
	 * @param name データソース名
	 * @throws IOException 接続に失敗した
	 */
	public void open(String name) throws IOException;
	/**
	 * 現在接続しているデータソースとの接続を閉じる．
	 * @throws IOException 接続クローズ処理に失敗した
	 */
	public void close() throws IOException;
	/**
	 * データソースとの接続がクローズされているかどうかを返す．
	 * @return true:既にクローズされている / false:まだ接続している
	 */
	public boolean isClosed();
	/**
	 * 指定レコード番号からデータを取得する．
	 * @param recordBegin 開始レコード番号
	 * @param b 取得したデータを格納する配列(同時に読み込みサイズもかねる)
	 * @return 実際に読み込まれたデータサイズ
	 * @throws IOException 読み込み処理中に発生した例外
	 * @throws EOFException 開始レコードがデータソースの終端を越えている
	 */
	public int read(long recordBegin, byte[] b) throws IOException, EOFException;
	/**
	 * 指定レコード番号からデータを書き込む．
	 * 開始レコードがストレージの外にあるか、あるいは自動拡張をサポートしていないストレージで
	 * ストレージの範囲を超えて書き込みをしようとした場合、EOFExceptionが発生する．
	 * @param recordBegin 開始レコード番号
	 * @param b 書き込むデータ
	 * @throws IOException 書き込み処理中に発生した例外
	 * @throws EOFException 書き込み範囲がストレージのサイズをオーバーした
	 */
	public void write(long recordBegin, byte[] b) throws IOException, EOFException;
}
