pf.page의 소스 코드

from typing import (
    TYPE_CHECKING,
)
if TYPE_CHECKING:
    from .buffer import (
        PfBufferManager,
    )
    from .file import (
        PfFile,
    )

from contextlib import (
    contextmanager,
)

from .error import (
    PfUnpinnedPageManipulationError,
)
from .layout import (
    PfLayoutField,
    PfLayoutView,
)


__all__ = (
    'PfPageId',
    'PfPageHeader',
    'PfPageData',
    'PfPage',
)


[문서] class PfPageId(int): """ page의 ID를 나타내는 클래스입니다. """ pass
[문서] class PfPageHeader(PfLayoutView): """ page의 header를 나타내는 클래스입니다. page data의 첫 4바이트를 사용하는 layout view입니다. layout view의 property를 사용 할 때는 항상 해당 page가 pin 되어있어야 합니다. Attributes: next_free_pid (PfPageId): 다음 free page의 ID. """ NO_NEXT_FREE_PAGE = PfPageId(-1) """ 다음 free page가 없다는 뜻을 나타내는 상수. """ NOT_IN_FREE_PAGE_LIST = PfPageId(-2) """ page가 free page list에 없다는 뜻을 나타내는 상수. """ _fields = ( PfLayoutField('next_free_pid', '<i'), ) @property def next_free_pid(self) -> PfPageId: return PfPageId(self.get('next_free_pid')) @next_free_pid.setter def next_free_pid(self, pid: PfPageId) -> None: self.set('next_free_pid', int(pid))
[문서] class PfPageData(bytearray): """ page의 data를 나타내는 클래스입니다. """ pass
[문서] class PfPage: """ page를 나타내는 클래스입니다. Attributes: file (PfFile): page가 속한 file. pid (PfPageId): page의 ID. size (int): page의 크기. data (PfPageData): page의 data. _buffer_manager (PfBufferManager): page가 속한 file을 관리하는 buffer manager. _dirty (bool): page의 dirty 상태 여부. _pin_count (int): page가 pin 되어있는 횟수. header (PfPageHeader): page의 header. """
[문서] def __init__(self, file: 'PfFile', pid: PfPageId, size: int, data: PfPageData, buffer_manager: 'PfBufferManager', ) -> None: """ page를 초기화합니다. Args: file (PfFile): page가 속한 file. pid (PfPageId): page의 ID. size (int): page의 크기. data (PfPageData): page의 data. buffer_manager (PfBufferManager): page가 속한 file을 관리하는 buffer manager. """ self.file = file self.pid = pid self.size = size self.data = data self._buffer_manager = buffer_manager self._dirty = False self._pin_count = 0 self.header = PfPageHeader( page=self, offset=0, limit=PfPageHeader.SIZE, )
[문서] @contextmanager def pinned(self): """ page를 pin 상태로 사용할 수 있는 context를 생성합니다. page가 pin 될 때, 그리고 마지막으로 unpin 될 때, buffer manager 의 `touch_page` 메서드를 호출합니다. Examples: >>> with page.pinned(): ... ... """ raise NotImplementedError
[문서] def get_content(self, offset: int, size: int) -> PfPageData: """ page의 content의 일부를 가져옵니다. page content는 page data 중 page header 이후의 부분을 의미합니다. Args: offset (int): content 중 가져올 부분의 오프셋. size (int): content 중 가져올 부분의 크기. Returns: PfPageData: page의 content. Raises: PfUnpinnedPageManipulationError: page가 pin 되어있지 않은 경우. """ raise NotImplementedError
[문서] def set_content(self, offset: int, data: PfPageData) -> None: """ page의 content의 일부를 갱신하고, page를 dirty 상태로 만듭니다. page content는 page data 중 page header 이후의 부분을 의미합니다. Args: offset (int): content 중 갱신할 부분의 오프셋. data (PfPageData): 갱신할 데이터의 내용. Raises: PfUnpinnedPageManipulationError: page가 pin 되어있지 않은 경우. """ raise NotImplementedError
[문서] def clear_content(self) -> None: """ page의 content를 0으로 초기화하고, page를 dirty 상태로 만듭니다. page content는 page data 중 page header 이후의 부분을 의미합니다. Raises: PfUnpinnedPageManipulationError: page가 pin 되어있지 않은 경우. """ raise NotImplementedError
[문서] def persist(self) -> bool: """ page를 file에 즉시 write합니다. buffer manager의 `persist_page` 메서드를 사용합니다. Returns: bool: write가 발생했는지 여부. """ raise NotImplementedError
[문서] def mark_dirty(self) -> None: """ page를 dirty 상태로 만들고, page를 가장 최근에 접근한 것으로 표시합니다. buffer manager 의 `touch_page` 메서드를 사용합니다. """ raise NotImplementedError
[문서] def clear_dirty(self) -> None: """ page의 dirty 상태를 해제합니다. """ raise NotImplementedError
[문서] def is_dirty(self) -> bool: """ page의 dirty 상태를 반환합니다. """ raise NotImplementedError
[문서] def is_pinned(self) -> bool: """ page가 pin 되어있는지 여부를 반환합니다. """ raise NotImplementedError
[문서] def is_free(self) -> bool: """ page가 free page인지 여부를 반환합니다. Raises: PfUnpinnedPageManipulationError: page가 pin 되어있지 않은 경우. """ raise NotImplementedError