from typing import (
BinaryIO,
TYPE_CHECKING,
)
if TYPE_CHECKING:
from .buffer import (
PfBufferManager,
)
from pathlib import (
Path,
)
from .error import (
PfInvalidPidError,
PfNoNextAllocatedPageFoundError,
PfDisposingPinnedPageError,
PfAlreadyDisposedPageError,
)
from .layout import (
PfLayoutField,
PfLayoutView,
)
from .page import (
PfPageId,
PfPageHeader,
PfPage,
)
__all__ = (
'PfFileId',
'PfFileHeader',
'PfFile',
)
[문서]
class PfFileId(int):
"""
file의 ID를 나타내는 클래스입니다.
"""
pass
[문서]
class PfFile:
"""
file을 나타내는 클래스입니다.
Attributes:
fid (PfFileId):
file의 ID.
path (Path):
file의 경로.
stream (BinaryIO):
file의 I/O stream.
_buffer_manager (PfBufferManager):
이 파일을 관리하는 buffer manager.
"""
[문서]
def __init__(self,
fid: PfFileId,
path: Path,
stream: BinaryIO,
buffer_manager: 'PfBufferManager',
) -> None:
"""
file을 초기화합니다.
Args:
fid (PfFileId):
file의 ID.
path (Path):
file의 경로.
stream (BinaryIO):
file의 I/O stream.
buffer_manager (PfBufferManager):
이 파일을 관리하는 buffer manager.
"""
self.fid = fid
self.path = path
self.stream = stream
self._buffer_manager = buffer_manager
[문서]
def get_page(self, pid: PfPageId) -> PfPage:
"""
page를 가져옵니다.
free page도 가져올 수 있습니다.
buffer manager 의 `fetch_page` 메서드를 사용합니다.
Args:
pid (PfPageId):
대상 page의 ID.
Returns:
PfPage:
가져온 page.
Raises:
PfInvalidPidError:
`pid` 가 유효하지 않은 경우.
"""
raise NotImplementedError
[문서]
def find_next_allocated_page(self, pid: PfPageId) -> PfPage:
"""
file에 있는, `pid` 다음의 allocate된 page를 찾습니다.
free page는 건너뜁니다.
Args:
pid (PfPageId):
대상 page의 ID.
Returns:
PfPage:
`pid` 다음에 있는 allocate된 page.
Raises:
PfInvalidPidError:
`pid` 가 유효하지 않은 경우.
PfNoNextAllocatedPageFoundError:
`pid` 다음에 있는 allocate된 page를 찾을 수 없는 경우.
"""
raise NotImplementedError
[문서]
def allocate_page(self) -> PfPage:
"""
page를 allocate합니다.
free page가 없으면, 새로운 page를 allocate합니다.
buffer manager 의 `allocate_page` 메서드를 사용하며,
file header의 `page_count` 를 증가시킵니다.
free page가 있으면, 해당 page를 재활용 합니다.
buffer manager 의 `fetch_page` 메서드를 사용하며,
file header의 `first_free_pid` 를 재활용할 page header의 `next_free_pid` 로 업데이트 하고,
page header의 `next_free_pid` 를 `NOT_IN_FREE_PAGE_LIST` 로 업데이트 합니다.
page data는 page의 `clear_content` 메서드를 사용하여 초기화합니다.
Returns:
PfPage:
allocate된 page.
"""
raise NotImplementedError
[문서]
def dispose_page(self, pid: PfPageId) -> None:
"""
page를 해제하여 free page로 만듭니다.
page header의 `next_free_pid` 를 file header의 `first_free_pid` 로 업데이트 하고,
file header의 `first_free_pid` 를 해제할 page의 ID로 업데이트 합니다.
Args:
pid (PfPageId):
대상 page의 ID.
Raises:
PfInvalidPidError:
`pid` 가 file header page의 ID거나 유효하지 않은 경우.
PfDisposingPinnedPageError:
page가 pin 되어있어서 해제할 수 없는 경우.
PfAlreadyDisposedPageError:
page가 이미 해제된 상태인 경우.
"""
raise NotImplementedError
[문서]
def flush(self) -> int:
"""
file을 flush 합니다.
buffer manager 의 `flush` 메서드를 사용합니다.
Returns:
int:
write가 발생한 page의 수.
Raises:
PfFlushingPinnedPageError:
page가 pin 되어있어서 flush할 수 없는 경우.
"""
raise NotImplementedError