63 lines
1.6 KiB
Python
63 lines
1.6 KiB
Python
"""
|
|
Adapters for the UUID type.
|
|
"""
|
|
|
|
# Copyright (C) 2020 The Psycopg Team
|
|
|
|
from typing import Callable, Optional, TYPE_CHECKING
|
|
|
|
from .. import postgres
|
|
from ..pq import Format
|
|
from ..abc import AdaptContext
|
|
from ..adapt import Buffer, Dumper, Loader
|
|
|
|
if TYPE_CHECKING:
|
|
import uuid
|
|
|
|
# Importing the uuid module is slow, so import it only on request.
|
|
UUID: Callable[..., "uuid.UUID"] = None # type: ignore[assignment]
|
|
|
|
|
|
class UUIDDumper(Dumper):
|
|
oid = postgres.types["uuid"].oid
|
|
|
|
def dump(self, obj: "uuid.UUID") -> bytes:
|
|
return obj.hex.encode()
|
|
|
|
|
|
class UUIDBinaryDumper(UUIDDumper):
|
|
format = Format.BINARY
|
|
|
|
def dump(self, obj: "uuid.UUID") -> bytes:
|
|
return obj.bytes
|
|
|
|
|
|
class UUIDLoader(Loader):
|
|
def __init__(self, oid: int, context: Optional[AdaptContext] = None):
|
|
super().__init__(oid, context)
|
|
global UUID
|
|
if UUID is None:
|
|
from uuid import UUID
|
|
|
|
def load(self, data: Buffer) -> "uuid.UUID":
|
|
if isinstance(data, memoryview):
|
|
data = bytes(data)
|
|
return UUID(data.decode())
|
|
|
|
|
|
class UUIDBinaryLoader(UUIDLoader):
|
|
format = Format.BINARY
|
|
|
|
def load(self, data: Buffer) -> "uuid.UUID":
|
|
if isinstance(data, memoryview):
|
|
data = bytes(data)
|
|
return UUID(bytes=data)
|
|
|
|
|
|
def register_default_adapters(context: AdaptContext) -> None:
|
|
adapters = context.adapters
|
|
adapters.register_dumper("uuid.UUID", UUIDDumper)
|
|
adapters.register_dumper("uuid.UUID", UUIDBinaryDumper)
|
|
adapters.register_loader("uuid", UUIDLoader)
|
|
adapters.register_loader("uuid", UUIDBinaryLoader)
|