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 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