org.kwis.msp.db
Class DataBase

java.lang.Object
  |
  +--org.kwis.msp.db.DataBase

public class DataBase
extends Object

영속적인 데이터를 저장하고, 찾으며, 관리하기 위한 메카니즘을 제공합니다.

Jlet에서 간단한 데이터베이스를 구현하기 위한 클래스입니다. 데이터베이스에는 여러개의 레코드(데이터)들이 저장되고 또 읽혀질 수 있습니다.

실제 레코드는 플랫폼의 영속적인 영역에 저장되어 Jlet이 수행이 종료 되거나, 플랫폼이 다운되더라도 이미 저장된 레코드의 최소한의(예를 들어 레코드를 저장하는 중에 플랫폼이 다운 되었다면 해당 레코드의 무결성은 보장할 수 없습니다) 무결성은 보장됩니다

레코드는 바이트 어레이의 형태로 저장됩니다. 저장되는 데이터의 의미는 무시됩니다. 저장된 데이터의 논리적인 의미를 파악하는 것은 사용자의 몫입니다. 레코드의 크기는 처음 해당 데이터베이스를 생성할 때 지정한 크기를 초과할 수는 없습니다.

각각의 레코드는 데이터베이스 상에서 레코드 ID라는 Integer 값으로 표현됩니다. 레코드 ID는 0부터 시작하며 레코드의 삭제가 없는 한 레코드 ID는 레코드를 하나 저장할 때 마다 1씩 증가합니다. 레코드가 중간에 삭제되면 다음 레코드를 저장할 때는 삭제된 레코드 ID를 재사용합니다.

레코드의 빈번한 추가/삭제로 데이터베이스에 저장된 레코드의 개수와 데이터베이스가 실제 플랫폼의 파일시스템에 차지하는 용량이 차이가 날 수 있습니다. QTP는 이런 빈 공간을 없애는 메카니즘(compaction)은 제공하지 않습니다.

하나의 Jlet은 여러개의 데이터베이스를 생성할 수 있으며 한 Jlet은 자신의 Jlet이 생성한 데이터베이스 모두에 접근이 가능합니다. 하지만 대부분의 경우 다른 Jlet이 생성한 데이터베이스에 접근할 수는 없습니다.

데이터베이스는 공유 디렉토리에 생성시키는 방법으로 여러 Jlet이 공유할 수도 있으며, 시스템 어플리케이션이 사용하는 데이터베이스에 접근할 수도 있습니다. 이는 데이터베이스를 오픈할 때 플래그를 줌으로써 이루어집니다.

Jlet이 플랫폼 상에서 지워지면 데이터베이스도 삭제되며, 해당 데이터베이스가 플랫폼의 물리적인 영역에 생성한 자원들(주로 파일)도 동시에 삭제됩니다.

데이터베이스를 정렬하기 위해서 DataFilter 인터페이스와 DataComparator 인터페이스를 구현해야 합니다. 전자는 정렬에 필요한 레코드를 골라내는 역할을 하며, 후자는 정렬을 위해 레코드 두개를 비교하는 역할을 합니다.


Method Summary
 void closeDataBase()
          데이터베이스를 닫습니다.
static void deleteDataBase(String dataBaseName)
          데이터베이스를 삭제합니다.
static void deleteDataBase(String dataBaseName, int flag)
          데이터베이스를 삭제합니다.
 void deleteRecord(int recordId)
          레코드를 데이터베이스에서 삭제합니다.
static int getAccessMode(String dbName)
          데이터베이스의 접근 권한을 돌려줍니다.
 String getDataBaseName()
          데이터베이스의 이름을 돌려줍니다.
 int getDataBaseSize()
          데이터베이스의 크기를 돌려줍니다.
 long getLastModified()
          데이터베이스가 가장 최근에 갱신된 시간을 돌려줍니다.
 int getNumberOfRecords()
          데이터베이스에 저장된 레코드의 개수를 돌려줍니다.
 int getRecordSize()
          데이터베이스의 하나의 레코드 크기를 돌려 줍니다.
 int getSizeAvailable()
          앞으로 저장할 수 있는 남은 용량의 크기를 돌려줍니다.
 int insertRecord(byte[] data)
          새로운 레코드를 데이터베이스에 추가합니다.
 int insertRecord(byte[] data, int offset, int numBytes)
          새로운 레코드를 데이터베이스에 추가합니다.
static String[] listDataBases()
          데이터베이스의 이름의 어레이를 돌려줍니다.
static DataBase openDataBase(String dataBaseName, int recordSize, boolean create)
          데이터베이스를 엽니다.
static DataBase openDataBase(String dataBaseName, int recordSize, boolean create, int flag)
          데이터베이스를 엽니다.
 byte[] selectRecord(int recordId)
          특정 레코드 ID에 저장된 데이터를 돌려줍니다.
 void selectRecord(int recordId, byte[] buffer, int offset)
          특정 레코드 ID에 저장된 데이터를 돌려줍니다.
 int[] sortRecord(DataFilter filter, DataComparator comparator)
          레코드를 정의한 비교 방법과 제한 조건으로 정렬합니다.
 void updateRecord(int recordId, byte[] newData)
          특정 레코드의 데이터의 내용을 바꿉니다.
 void updateRecord(int recordId, byte[] newData, int offset, int numBytes)
          특정 레코드의 데이터의 내용을 바꿉니다.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

openDataBase

public static DataBase openDataBase(String dataBaseName,
                                    int recordSize,
                                    boolean create)
                             throws DataBaseException,
                                    IllegalArgumentException
데이터베이스를 엽니다. 이 데이터베이스는 현재의 Jlet만 접근할 수 있습니다. 데이터베이스는 FileSystem.PRIVATE_ACCESS 모드로 열립니다.
Parameters:
dataBaseName - 데이터베이스 이름
recordSize - 생성할 데이터베이스의 레코드 하나의 크기(byte단위). 데이터베이스가 이미 존재하는 경우 지정된 recordSize는 무시되고 기존의 레코드 크기가 적용됨
create - 만약 데이터베이스가 존재하지 않으면 새로 만들 것인지 여부
Returns:
연 데이터베이스
Throws:
DataBaseException - createfalse인데 데이터베이스가 없거나 데이터베이스에 사용되는 파일을 열수 없거나 데이터베이스가 깨어진 경우
IllegalArgumentException - createtrue인데, recordSize가 0이거나 음수인 경우

openDataBase

public static DataBase openDataBase(String dataBaseName,
                                    int recordSize,
                                    boolean create,
                                    int flag)
                             throws DataBaseException,
                                    IllegalArgumentException
데이터베이스를 엽니다. 현재의 Jlet만 접근할 수 있게 할 것인지, 다른 Jlet과 공유되는 데이터베이스를 열 것인지, 시스템이 제공하는 데이터베이스를 사용할 것인지 flag를 통해 지정할 수 있습니다.
Parameters:
dataBaseName - 데이터베이스 이름
recordSize - 생성할 데이터베이스의 레코드 하나의 크기(byte단위). 데이터베이스가 이미 존재하는 경우 지정된 recordSize는 무시되고 기존의 레코드 크기가 적용됨
create - 만약 데이터베이스가 존재하지 않으면 새로 만들 것인지 여부
flag - 데이터베이스의 공유 방법을 지정, FileSystem.PRIVATE_ACCESS, FileSystem.SHARED_ACCESS, FileSystem.SYSTEM_ACCESS 가능
Returns:
연 데이터베이스
Throws:
DataBaseException - createfalse인데 데이터베이스가 없거나 데이터베이스에 사용되는 파일을 열수 없거나 데이터베이스가 깨어진 경우
IllegalArgumentException - createtrue인데, recordSize가 0이거나 음수인 경우

closeDataBase

public void closeDataBase()
                   throws DataBaseException
데이터베이스를 닫습니다.
Throws:
DataBaseException - 데이터베이스 관리 정보를 저장할 수 없거나 파일을 닫을 수 없는 경우

deleteDataBase

public static void deleteDataBase(String dataBaseName)
                           throws DataBaseException
데이터베이스를 삭제합니다. 해당 Jlet이 FileSystem.PRIVATE_ACCESS로 생성한 데이터베이스만 삭제할 수 있습니다.
Parameters:
dataBaseName - 삭제할 데이터베이스 이름
Throws:
DataBaseException - 삭제할 데이터베이스가 없거나 지우지 못한 경우

deleteDataBase

public static void deleteDataBase(String dataBaseName,
                                  int flag)
                           throws DataBaseException
데이터베이스를 삭제합니다. 해당 Jlet이 flag로 접근 가능한 데이터베이스만 삭제 가능합니다.
Parameters:
dataBaseName - 삭제할 데이터베이스 이름
flag - 어떤 접근권한에 있는 데이터베이스를 지울 것인지를 나타냄, FileSystem.PRIVATE_ACCESS, FileSystem.SHARED_ACCESS, FileSystem.SYSTEM_ACCESS 가능.
Throws:
DataBaseException - 삭제할 데이터베이스가 없거나 지우지 못한 경우

insertRecord

public int insertRecord(byte[] data,
                        int offset,
                        int numBytes)
                 throws DataBaseRecordException,
                        DataBaseException,
                        IllegalArgumentException
새로운 레코드를 데이터베이스에 추가합니다. 바이트 어레이에 저장된 데이터를 하나의 레코드로 데이터베이스에 저장합니다. 데이터는 리턴되기 전에 플랫폼의 물리적 영역에 쓰여집니다. 저장할 바이트 어레이의 길이가 데이터베이스를 생성할 때 지정한 레코드 크기보다 작으면, 남는 영역에 쓰레기값(garbage)이 저장되어 있을 수 있습니다. selectRecord는 레코드 크기 단위로 읽어오기 때문에, 저장한 후에 다시 읽어들인 바이트 어레이에서 실제 데이터와 쓰레기값(garbage)를 구별하는 것은 사용자 몫입니다.
Parameters:
data - 저장할 데이터가 들어있는 버퍼
offset - 버퍼에서 저장할 데이터가 시작되는 첫번째 바이트 오프셋
numBytes - 저장할 바이트 수
Returns:
저장된 레코드의 레코드 ID
Throws:
DataBaseRecordException - 데이터가 데이터베이스 생성시에 지정한 레코드 크기보다 큰 경우
DataBaseException - 레코드를 저장할 수 없는 경우
IllegalArgumentException - data의 길이에서 offset을 뺀 값이 numBytes 보다 작은 경우

insertRecord

public int insertRecord(byte[] data)
                 throws DataBaseRecordException,
                        DataBaseException
새로운 레코드를 데이터베이스에 추가합니다. 바이트 어레이에 저장된 데이터를 하나의 레코드로 데이터베이스에 저장합니다. 데이터는 리턴되기 전에 플랫폼의 물리적 영역에 쓰여집니다. 저장할 바이트 어레이의 길이가 데이터베이스를 생성할 때 지정한 레코드 크기보다 작으면, 남는 영역에 쓰레기값(garbage)이 저장되어 있을 수 있습니다. selectRecord는 레코드 크기 단위로 읽어오기 때문에, 저장한 후에 다시 읽어들인 바이트 어레이에서 실제 데이터와 쓰레기값(garbage)를 구별하는 것은 사용자 몫입니다.
Parameters:
data - 저장할 데이터가 들어있는 버퍼
Returns:
저장된 레코드의 레코드 ID
Throws:
DataBaseRecordException - 데이터가 데이터베이스 생성시에 지정한 레코드 크기보다 큰 경우
DataBaseException - 레코드를 저장할 수 없는 경우

deleteRecord

public void deleteRecord(int recordId)
                  throws DataBaseException,
                         DataBaseRecordException
레코드를 데이터베이스에서 삭제합니다. 파라미터로 받은 레코드 ID에 해당하는 레코드를 지웁니다.
Parameters:
recordId - 지울 레코드의 ID
Throws:
DataBaseException - 레코드를 지울 수 없는 경우
DataBaseRecordException - 레코드 ID가 없는 경우

selectRecord

public byte[] selectRecord(int recordId)
                    throws DataBaseException,
                           DataBaseRecordException
특정 레코드 ID에 저장된 데이터를 돌려줍니다.
Parameters:
recordId - 레코드 ID
Returns:
해당 레코드 ID에 저장된 데이터
Throws:
DataBaseException - 레코드를 읽을 수 없는 경우
DataBaseRecordException - 레코드 ID가 존재하지 않는 경우

selectRecord

public void selectRecord(int recordId,
                         byte[] buffer,
                         int offset)
                  throws DataBaseException,
                         DataBaseRecordException,
                         IllegalArgumentException
특정 레코드 ID에 저장된 데이터를 돌려줍니다. 읽어들인 데이터는 버퍼에 복사되어 돌려집니다. 뒤에 버퍼의 내용을 바꾸더라도 데이터베이스에 저장된 레코드는 변하지 않습니다. 버퍼는 하나의 레코드가 들어갈 수 있을 만큼 충분히 커야 합니다. 데이터베이스의 하나의 레코드의 크기는 getRecordSize 메쏘드를 통해 알아올 수 있습니다.
Parameters:
recordId - 레코드 ID
buffer - 읽어들인 데이터를 복사하여 저장할 버퍼
offset - 버퍼에서 복사를 시작할 첫번째 바이트 오프셋
Throws:
IllegalArgumentException - 버퍼가 레코드 크기보다 작은 경우
DataBaseException - 레코드를 읽을 수 없는 경우
DataBaseRecordException - 레코드 ID가 존재하지 않는 경우

updateRecord

public void updateRecord(int recordId,
                         byte[] newData,
                         int offset,
                         int numBytes)
                  throws DataBaseRecordException,
                         DataBaseException,
                         IllegalArgumentException
특정 레코드의 데이터의 내용을 바꿉니다. 해당 레코드 ID에 저장되어 있던 내용을 새로운 내용으로 바꿉니다.
Parameters:
recordId - 데이터 내용을 변경시킬 레코드 ID
newData - 새로이 저장할 데이터가 들어있는 버퍼
offset - 버퍼에서 저장할 데이터가 시작되는 첫번째 바이트 오프셋
numBytes - 저장할 바이트 수
Throws:
DataBaseException HREF="../../../../org/kwis/msp/db/DataBaseException.html">DataBaseException, DataBaseRecordException, IllegalArgumentException