rejiggering file pointers

This commit is contained in:
evilchili 2025-10-18 17:18:16 -07:00
parent 7ddc9531bb
commit ee886fe5e2

View File

@ -295,13 +295,28 @@ class BinaryFilePointer(Field):
def relpath(self, record): def relpath(self, record):
return Path(record._metadata.table) / record[record._metadata.primary_key] / f"{self.name}{self.extension}" return Path(record._metadata.table) / record[record._metadata.primary_key] / f"{self.name}{self.extension}"
def reference(self, record):
return f"/::{self.relpath(record)}"
def dereference(self, reference, db):
relpath = reference.replace("/::", "", 1)
try:
return (db.path / relpath).read_bytes()
except FileNotFoundError:
return None
def serialize(self, value: value_type | str, record: Record | None = None) -> str:
return self.reference(record)
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type: def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
if not value: if not value:
return None return None
_, relpath = value.split("::") return self.dereference(value, db)
return self.value_type((db.path / relpath).read_bytes())
def prepare(self, data: value_type): def prepare(self, data: value_type):
"""
Return bytes to be written to disk
"""
if not data: if not data:
return return
if not isinstance(data, self.value_type): if not isinstance(data, self.value_type):
@ -315,7 +330,6 @@ class BinaryFilePointer(Field):
path = db.path / relpath path = db.path / relpath
path.parent.mkdir(parents=True, exist_ok=True) path.parent.mkdir(parents=True, exist_ok=True)
path.write_bytes(self.prepare(value)) path.write_bytes(self.prepare(value))
record[self.name] = f"File::{self.relpath(record)}"
@dataclass @dataclass
@ -335,8 +349,8 @@ class TextFilePointer(BinaryFilePointer):
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type: def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
if not value: if not value:
return None return None
_, relpath = value.split("::") buf = super().deserialize(value, db)
return (db.path / relpath).read_text() return buf.decode() if buf else None
@dataclass @dataclass