rm.file의 소스 코드
from bluebase.pf import (
PfNoNextAllocatedPageFoundError,
PfLayoutField,
PfLayoutView,
PfPageHeader,
PfPageId,
PfPage,
PfFileHeader,
PfFile,
)
from .error import (
RmInvalidPidError,
RmNoNextPageFoundError,
)
from .record import (
RmRecordKey,
RmRecordData,
RmRecord,
)
from .page import (
RmPageId,
RmPageHeader,
RmPage,
)
__all__ = (
'RmFileHeader',
'RmFile',
)
[문서]
class RmFileHeader(PfLayoutView):
"""
file의 header를 나타내는 클래스입니다.
file header는 1번째 페이지에 저장됩니다.
page content의 첫 8바이트를 사용하는 layout view입니다.
layout view의 property를 사용 할 때는 항상 해당 page가 pin 되어있어야 합니다.
Attributes:
record_size (int):
record의 크기.
first_available_pid (RmPageId):
file에 있는 가장 첫번째 available page의 ID.
`NO_AVAILABLE_PAGE` 인 경우는 file에 available page가 없다는 뜻입니다.
"""
PID = PfPageId(int(PfFileHeader.PID) + 1)
"""
file header가 들어있는 page의 ID.
"""
NO_AVAILABLE_PAGE = RmPageId(-1)
"""
file에 available page가 없다는 뜻을 나타내는 상수.
"""
_fields = (
PfLayoutField('record_size', '<i'),
PfLayoutField('first_available_pid', '<i'),
)
@property
def record_size(self) -> int:
return int(self.get('record_size'))
@record_size.setter
def record_size(self, size: int) -> None:
self.set('record_size', int(size))
@property
def first_available_pid(self) -> RmPageId:
return RmPageId(self.get('first_available_pid'))
@first_available_pid.setter
def first_available_pid(self, pid: RmPageId) -> None:
self.set('first_available_pid', int(pid))
[문서]
class RmFile:
"""
file을 나타내는 클래스입니다.
Attributes:
_pf_file (PfFile):
PF component의 file.
record_size (int):
record의 크기.
"""
[문서]
def __init__(self,
pf_file: PfFile,
record_size: int,
) -> None:
"""
file을 초기화합니다.
Args:
pf_file (PfFile):
PF component의 file.
record_size (int):
record의 크기.
"""
self._pf_file = pf_file
self.record_size = record_size
[문서]
def get_page(self, pid: RmPageId) -> RmPage:
"""
TODO: 설명
Args:
pid (RmPageId):
대상 page의 ID.
Returns:
RmPage:
가져온 page.
Raises:
RmInvalidPidError:
`pid` 가 유효하지 않은 경우.
"""
raise NotImplementedError
[문서]
def find_next_page(self, pid: RmPageId) -> RmPage:
"""
TODO: 설명
Args:
pid (RmPageId):
대상 page의 ID.
Returns:
RmPage:
`pid` 다음에 있는 page.
Raises:
RmNoNextPageFoundError:
`pid` 다음에 있는 page를 찾을 수 없는 경우.
"""
raise NotImplementedError
[문서]
def get_record(self, key: RmRecordKey) -> RmRecord:
"""
TODO: 설명
Args:
key (RmRecordKey):
대상 record의 key.
Returns:
RmRecord:
가져온 record.
Raises:
RmInvalidSidError:
`key.sid` 가 유효하지 않은 경우.
RmUnoccupiedSlotError:
`key.sid` 가 비어있는 경우.
"""
raise NotImplementedError
[문서]
def insert_record(self, data: RmRecordData) -> RmRecordKey:
"""
TODO: 설명
Args:
data (RmRecordData):
삽입할 record data.
Returns:
RmRecordKey:
생성된 record의 key.
Raises:
RmInvalidRecordDataSizeError:
`data` 의 크기가 유효하지 않은 경우.
"""
raise NotImplementedError
[문서]
def delete_record(self, key: RmRecordKey) -> None:
"""
TODO: 설명
Args:
key (RmRecordKey):
대상 record의 key.
Raises:
RmInvalidSidError:
`key.sid` 가 유효하지 않은 경우.
RmUnoccupiedSlotError:
`key.sid` 가 비어있는 경우.
"""
raise NotImplementedError
[문서]
def update_record(self, key: RmRecordKey, data: RmRecordData) -> None:
"""
TODO: 설명
Args:
key (RmRecordKey):
대상 record의 key.
data (RmRecordData):
갱신할 record data.
Raises:
RmInvalidSidError:
`key.sid` 가 유효하지 않은 경우.
RmUnoccupiedSlotError:
`key.sid` 가 비어있는 경우.
RmInvalidRecordDataSizeError:
`data` 의 크기가 유효하지 않은 경우.
"""
raise NotImplementedError