docker setup
This commit is contained in:
		
							
								
								
									
										133
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,133 @@ | ||||
| """ | ||||
| psycopg libpq wrapper | ||||
|  | ||||
| This package exposes the libpq functionalities as Python objects and functions. | ||||
|  | ||||
| The real implementation (the binding to the C library) is | ||||
| implementation-dependant but all the implementations share the same interface. | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2020 The Psycopg Team | ||||
|  | ||||
| import os | ||||
| import logging | ||||
| from typing import Callable, List, Type | ||||
|  | ||||
| from . import abc | ||||
| from .misc import ConninfoOption, PGnotify, PGresAttDesc | ||||
| from .misc import error_message | ||||
| from ._enums import ConnStatus, DiagnosticField, ExecStatus, Format, Trace | ||||
| from ._enums import Ping, PipelineStatus, PollingStatus, TransactionStatus | ||||
|  | ||||
| logger = logging.getLogger(__name__) | ||||
|  | ||||
| __impl__: str | ||||
| """The currently loaded implementation of the `!psycopg.pq` package. | ||||
|  | ||||
| Possible values include ``python``, ``c``, ``binary``. | ||||
| """ | ||||
|  | ||||
| __build_version__: int | ||||
| """The libpq version the C package was built with. | ||||
|  | ||||
| A number in the same format of `~psycopg.ConnectionInfo.server_version` | ||||
| representing the libpq used to build the speedup module (``c``, ``binary``) if | ||||
| available. | ||||
|  | ||||
| Certain features might not be available if the built version is too old. | ||||
| """ | ||||
|  | ||||
| version: Callable[[], int] | ||||
| PGconn: Type[abc.PGconn] | ||||
| PGresult: Type[abc.PGresult] | ||||
| Conninfo: Type[abc.Conninfo] | ||||
| Escaping: Type[abc.Escaping] | ||||
| PGcancel: Type[abc.PGcancel] | ||||
|  | ||||
|  | ||||
| def import_from_libpq() -> None: | ||||
|     """ | ||||
|     Import pq objects implementation from the best libpq wrapper available. | ||||
|  | ||||
|     If an implementation is requested try to import only it, otherwise | ||||
|     try to import the best implementation available. | ||||
|     """ | ||||
|     # import these names into the module on success as side effect | ||||
|     global __impl__, version, __build_version__ | ||||
|     global PGconn, PGresult, Conninfo, Escaping, PGcancel | ||||
|  | ||||
|     impl = os.environ.get("PSYCOPG_IMPL", "").lower() | ||||
|     module = None | ||||
|     attempts: List[str] = [] | ||||
|  | ||||
|     def handle_error(name: str, e: Exception) -> None: | ||||
|         if not impl: | ||||
|             msg = f"couldn't import psycopg '{name}' implementation: {e}" | ||||
|             logger.debug(msg) | ||||
|             attempts.append(msg) | ||||
|         else: | ||||
|             msg = f"couldn't import requested psycopg '{name}' implementation: {e}" | ||||
|             raise ImportError(msg) from e | ||||
|  | ||||
|     # The best implementation: fast but requires the system libpq installed | ||||
|     if not impl or impl == "c": | ||||
|         try: | ||||
|             from psycopg_c import pq as module  # type: ignore | ||||
|         except Exception as e: | ||||
|             handle_error("c", e) | ||||
|  | ||||
|     # Second best implementation: fast and stand-alone | ||||
|     if not module and (not impl or impl == "binary"): | ||||
|         try: | ||||
|             from psycopg_binary import pq as module  # type: ignore | ||||
|         except Exception as e: | ||||
|             handle_error("binary", e) | ||||
|  | ||||
|     # Pure Python implementation, slow and requires the system libpq installed. | ||||
|     if not module and (not impl or impl == "python"): | ||||
|         try: | ||||
|             from . import pq_ctypes as module  # type: ignore[assignment] | ||||
|         except Exception as e: | ||||
|             handle_error("python", e) | ||||
|  | ||||
|     if module: | ||||
|         __impl__ = module.__impl__ | ||||
|         version = module.version | ||||
|         PGconn = module.PGconn | ||||
|         PGresult = module.PGresult | ||||
|         Conninfo = module.Conninfo | ||||
|         Escaping = module.Escaping | ||||
|         PGcancel = module.PGcancel | ||||
|         __build_version__ = module.__build_version__ | ||||
|     elif impl: | ||||
|         raise ImportError(f"requested psycopg implementation '{impl}' unknown") | ||||
|     else: | ||||
|         sattempts = "\n".join(f"- {attempt}" for attempt in attempts) | ||||
|         raise ImportError( | ||||
|             f"""\ | ||||
| no pq wrapper available. | ||||
| Attempts made: | ||||
| {sattempts}""" | ||||
|         ) | ||||
|  | ||||
|  | ||||
| import_from_libpq() | ||||
|  | ||||
| __all__ = ( | ||||
|     "ConnStatus", | ||||
|     "PipelineStatus", | ||||
|     "PollingStatus", | ||||
|     "TransactionStatus", | ||||
|     "ExecStatus", | ||||
|     "Ping", | ||||
|     "DiagnosticField", | ||||
|     "Format", | ||||
|     "Trace", | ||||
|     "PGconn", | ||||
|     "PGnotify", | ||||
|     "Conninfo", | ||||
|     "PGresAttDesc", | ||||
|     "error_message", | ||||
|     "ConninfoOption", | ||||
|     "version", | ||||
| ) | ||||
							
								
								
									
										106
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_debug.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_debug.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,106 @@ | ||||
| """ | ||||
| libpq debugging tools | ||||
|  | ||||
| These functionalities are exposed here for convenience, but are not part of | ||||
| the public interface and are subject to change at any moment. | ||||
|  | ||||
| Suggested usage:: | ||||
|  | ||||
|     import logging | ||||
|     import psycopg | ||||
|     from psycopg import pq | ||||
|     from psycopg.pq._debug import PGconnDebug | ||||
|  | ||||
|     logging.basicConfig(level=logging.INFO, format="%(message)s") | ||||
|     logger = logging.getLogger("psycopg.debug") | ||||
|     logger.setLevel(logging.INFO) | ||||
|  | ||||
|     assert pq.__impl__ == "python" | ||||
|     pq.PGconn = PGconnDebug | ||||
|  | ||||
|     with psycopg.connect("") as conn: | ||||
|         conn.pgconn.trace(2) | ||||
|         conn.pgconn.set_trace_flags( | ||||
|             pq.Trace.SUPPRESS_TIMESTAMPS | pq.Trace.REGRESS_MODE) | ||||
|         ... | ||||
|  | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2022 The Psycopg Team | ||||
|  | ||||
| import inspect | ||||
| import logging | ||||
| from typing import Any, Callable, Type, TypeVar, TYPE_CHECKING | ||||
| from functools import wraps | ||||
|  | ||||
| from . import PGconn | ||||
| from .misc import connection_summary | ||||
|  | ||||
| if TYPE_CHECKING: | ||||
|     from . import abc | ||||
|  | ||||
| Func = TypeVar("Func", bound=Callable[..., Any]) | ||||
|  | ||||
| logger = logging.getLogger("psycopg.debug") | ||||
|  | ||||
|  | ||||
| class PGconnDebug: | ||||
|     """Wrapper for a PQconn logging all its access.""" | ||||
|  | ||||
|     _Self = TypeVar("_Self", bound="PGconnDebug") | ||||
|     _pgconn: "abc.PGconn" | ||||
|  | ||||
|     def __init__(self, pgconn: "abc.PGconn"): | ||||
|         super().__setattr__("_pgconn", pgconn) | ||||
|  | ||||
|     def __repr__(self) -> str: | ||||
|         cls = f"{self.__class__.__module__}.{self.__class__.__qualname__}" | ||||
|         info = connection_summary(self._pgconn) | ||||
|         return f"<{cls} {info} at 0x{id(self):x}>" | ||||
|  | ||||
|     def __getattr__(self, attr: str) -> Any: | ||||
|         value = getattr(self._pgconn, attr) | ||||
|         if callable(value): | ||||
|             return debugging(value) | ||||
|         else: | ||||
|             logger.info("PGconn.%s -> %s", attr, value) | ||||
|             return value | ||||
|  | ||||
|     def __setattr__(self, attr: str, value: Any) -> None: | ||||
|         setattr(self._pgconn, attr, value) | ||||
|         logger.info("PGconn.%s <- %s", attr, value) | ||||
|  | ||||
|     @classmethod | ||||
|     def connect(cls: Type[_Self], conninfo: bytes) -> _Self: | ||||
|         return cls(debugging(PGconn.connect)(conninfo)) | ||||
|  | ||||
|     @classmethod | ||||
|     def connect_start(cls: Type[_Self], conninfo: bytes) -> _Self: | ||||
|         return cls(debugging(PGconn.connect_start)(conninfo)) | ||||
|  | ||||
|     @classmethod | ||||
|     def ping(self, conninfo: bytes) -> int: | ||||
|         return debugging(PGconn.ping)(conninfo) | ||||
|  | ||||
|  | ||||
| def debugging(f: Func) -> Func: | ||||
|     """Wrap a function in order to log its arguments and return value on call.""" | ||||
|  | ||||
|     @wraps(f) | ||||
|     def debugging_(*args: Any, **kwargs: Any) -> Any: | ||||
|         reprs = [] | ||||
|         for arg in args: | ||||
|             reprs.append(f"{arg!r}") | ||||
|         for k, v in kwargs.items(): | ||||
|             reprs.append(f"{k}={v!r}") | ||||
|  | ||||
|         logger.info("PGconn.%s(%s)", f.__name__, ", ".join(reprs)) | ||||
|         rv = f(*args, **kwargs) | ||||
|         # Display the return value only if the function is declared to return | ||||
|         # something else than None. | ||||
|         ra = inspect.signature(f).return_annotation | ||||
|         if ra is not None or rv is not None: | ||||
|             logger.info("    <- %r", rv) | ||||
|         return rv | ||||
|  | ||||
|     return debugging_  # type: ignore | ||||
							
								
								
									
										249
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_enums.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										249
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_enums.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,249 @@ | ||||
| """ | ||||
| libpq enum definitions for psycopg | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2020 The Psycopg Team | ||||
|  | ||||
| from enum import IntEnum, IntFlag, auto | ||||
|  | ||||
|  | ||||
| class ConnStatus(IntEnum): | ||||
|     """ | ||||
|     Current status of the connection. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     OK = 0 | ||||
|     """The connection is in a working state.""" | ||||
|     BAD = auto() | ||||
|     """The connection is closed.""" | ||||
|  | ||||
|     STARTED = auto() | ||||
|     MADE = auto() | ||||
|     AWAITING_RESPONSE = auto() | ||||
|     AUTH_OK = auto() | ||||
|     SETENV = auto() | ||||
|     SSL_STARTUP = auto() | ||||
|     NEEDED = auto() | ||||
|     CHECK_WRITABLE = auto() | ||||
|     CONSUME = auto() | ||||
|     GSS_STARTUP = auto() | ||||
|     CHECK_TARGET = auto() | ||||
|     CHECK_STANDBY = auto() | ||||
|  | ||||
|  | ||||
| class PollingStatus(IntEnum): | ||||
|     """ | ||||
|     The status of the socket during a connection. | ||||
|  | ||||
|     If ``READING`` or ``WRITING`` you may select before polling again. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     FAILED = 0 | ||||
|     """Connection attempt failed.""" | ||||
|     READING = auto() | ||||
|     """Will have to wait before reading new data.""" | ||||
|     WRITING = auto() | ||||
|     """Will have to wait before writing new data.""" | ||||
|     OK = auto() | ||||
|     """Connection completed.""" | ||||
|  | ||||
|     ACTIVE = auto() | ||||
|  | ||||
|  | ||||
| class ExecStatus(IntEnum): | ||||
|     """ | ||||
|     The status of a command. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     EMPTY_QUERY = 0 | ||||
|     """The string sent to the server was empty.""" | ||||
|  | ||||
|     COMMAND_OK = auto() | ||||
|     """Successful completion of a command returning no data.""" | ||||
|  | ||||
|     TUPLES_OK = auto() | ||||
|     """ | ||||
|     Successful completion of a command returning data (such as a SELECT or SHOW). | ||||
|     """ | ||||
|  | ||||
|     COPY_OUT = auto() | ||||
|     """Copy Out (from server) data transfer started.""" | ||||
|  | ||||
|     COPY_IN = auto() | ||||
|     """Copy In (to server) data transfer started.""" | ||||
|  | ||||
|     BAD_RESPONSE = auto() | ||||
|     """The server's response was not understood.""" | ||||
|  | ||||
|     NONFATAL_ERROR = auto() | ||||
|     """A nonfatal error (a notice or warning) occurred.""" | ||||
|  | ||||
|     FATAL_ERROR = auto() | ||||
|     """A fatal error occurred.""" | ||||
|  | ||||
|     COPY_BOTH = auto() | ||||
|     """ | ||||
|     Copy In/Out (to and from server) data transfer started. | ||||
|  | ||||
|     This feature is currently used only for streaming replication, so this | ||||
|     status should not occur in ordinary applications. | ||||
|     """ | ||||
|  | ||||
|     SINGLE_TUPLE = auto() | ||||
|     """ | ||||
|     The PGresult contains a single result tuple from the current command. | ||||
|  | ||||
|     This status occurs only when single-row mode has been selected for the | ||||
|     query. | ||||
|     """ | ||||
|  | ||||
|     PIPELINE_SYNC = auto() | ||||
|     """ | ||||
|     The PGresult represents a synchronization point in pipeline mode, | ||||
|     requested by PQpipelineSync. | ||||
|  | ||||
|     This status occurs only when pipeline mode has been selected. | ||||
|     """ | ||||
|  | ||||
|     PIPELINE_ABORTED = auto() | ||||
|     """ | ||||
|     The PGresult represents a pipeline that has received an error from the server. | ||||
|  | ||||
|     PQgetResult must be called repeatedly, and each time it will return this | ||||
|     status code until the end of the current pipeline, at which point it will | ||||
|     return PGRES_PIPELINE_SYNC and normal processing can resume. | ||||
|     """ | ||||
|  | ||||
|  | ||||
| class TransactionStatus(IntEnum): | ||||
|     """ | ||||
|     The transaction status of a connection. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     IDLE = 0 | ||||
|     """Connection ready, no transaction active.""" | ||||
|  | ||||
|     ACTIVE = auto() | ||||
|     """A command is in progress.""" | ||||
|  | ||||
|     INTRANS = auto() | ||||
|     """Connection idle in an open transaction.""" | ||||
|  | ||||
|     INERROR = auto() | ||||
|     """An error happened in the current transaction.""" | ||||
|  | ||||
|     UNKNOWN = auto() | ||||
|     """Unknown connection state, broken connection.""" | ||||
|  | ||||
|  | ||||
| class Ping(IntEnum): | ||||
|     """Response from a ping attempt.""" | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     OK = 0 | ||||
|     """ | ||||
|     The server is running and appears to be accepting connections. | ||||
|     """ | ||||
|  | ||||
|     REJECT = auto() | ||||
|     """ | ||||
|     The server is running but is in a state that disallows connections. | ||||
|     """ | ||||
|  | ||||
|     NO_RESPONSE = auto() | ||||
|     """ | ||||
|     The server could not be contacted. | ||||
|     """ | ||||
|  | ||||
|     NO_ATTEMPT = auto() | ||||
|     """ | ||||
|     No attempt was made to contact the server. | ||||
|     """ | ||||
|  | ||||
|  | ||||
| class PipelineStatus(IntEnum): | ||||
|     """Pipeline mode status of the libpq connection.""" | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     OFF = 0 | ||||
|     """ | ||||
|     The libpq connection is *not* in pipeline mode. | ||||
|     """ | ||||
|     ON = auto() | ||||
|     """ | ||||
|     The libpq connection is in pipeline mode. | ||||
|     """ | ||||
|     ABORTED = auto() | ||||
|     """ | ||||
|     The libpq connection is in pipeline mode and an error occurred while | ||||
|     processing the current pipeline. The aborted flag is cleared when | ||||
|     PQgetResult returns a result of type PGRES_PIPELINE_SYNC. | ||||
|     """ | ||||
|  | ||||
|  | ||||
| class DiagnosticField(IntEnum): | ||||
|     """ | ||||
|     Fields in an error report. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     # from postgres_ext.h | ||||
|     SEVERITY = ord("S") | ||||
|     SEVERITY_NONLOCALIZED = ord("V") | ||||
|     SQLSTATE = ord("C") | ||||
|     MESSAGE_PRIMARY = ord("M") | ||||
|     MESSAGE_DETAIL = ord("D") | ||||
|     MESSAGE_HINT = ord("H") | ||||
|     STATEMENT_POSITION = ord("P") | ||||
|     INTERNAL_POSITION = ord("p") | ||||
|     INTERNAL_QUERY = ord("q") | ||||
|     CONTEXT = ord("W") | ||||
|     SCHEMA_NAME = ord("s") | ||||
|     TABLE_NAME = ord("t") | ||||
|     COLUMN_NAME = ord("c") | ||||
|     DATATYPE_NAME = ord("d") | ||||
|     CONSTRAINT_NAME = ord("n") | ||||
|     SOURCE_FILE = ord("F") | ||||
|     SOURCE_LINE = ord("L") | ||||
|     SOURCE_FUNCTION = ord("R") | ||||
|  | ||||
|  | ||||
| class Format(IntEnum): | ||||
|     """ | ||||
|     Enum representing the format of a query argument or return value. | ||||
|  | ||||
|     These values are only the ones managed by the libpq. `~psycopg` may also | ||||
|     support automatically-chosen values: see `psycopg.adapt.PyFormat`. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     TEXT = 0 | ||||
|     """Text parameter.""" | ||||
|     BINARY = 1 | ||||
|     """Binary parameter.""" | ||||
|  | ||||
|  | ||||
| class Trace(IntFlag): | ||||
|     """ | ||||
|     Enum to control tracing of the client/server communication. | ||||
|     """ | ||||
|  | ||||
|     __module__ = "psycopg.pq" | ||||
|  | ||||
|     SUPPRESS_TIMESTAMPS = 1 | ||||
|     """Do not include timestamps in messages.""" | ||||
|  | ||||
|     REGRESS_MODE = 2 | ||||
|     """Redact some fields, e.g. OIDs, from messages.""" | ||||
							
								
								
									
										804
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_pq_ctypes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										804
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/_pq_ctypes.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,804 @@ | ||||
| """ | ||||
| libpq access using ctypes | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2020 The Psycopg Team | ||||
|  | ||||
| import sys | ||||
| import ctypes | ||||
| import ctypes.util | ||||
| from ctypes import Structure, CFUNCTYPE, POINTER | ||||
| from ctypes import c_char, c_char_p, c_int, c_size_t, c_ubyte, c_uint, c_void_p | ||||
| from typing import List, Optional, Tuple | ||||
|  | ||||
| from .misc import find_libpq_full_path | ||||
| from ..errors import NotSupportedError | ||||
|  | ||||
| libname = find_libpq_full_path() | ||||
| if not libname: | ||||
|     raise ImportError("libpq library not found") | ||||
|  | ||||
| pq = ctypes.cdll.LoadLibrary(libname) | ||||
|  | ||||
|  | ||||
| class FILE(Structure): | ||||
|     pass | ||||
|  | ||||
|  | ||||
| FILE_ptr = POINTER(FILE) | ||||
|  | ||||
| if sys.platform == "linux": | ||||
|     libcname = ctypes.util.find_library("c") | ||||
|     assert libcname | ||||
|     libc = ctypes.cdll.LoadLibrary(libcname) | ||||
|  | ||||
|     fdopen = libc.fdopen | ||||
|     fdopen.argtypes = (c_int, c_char_p) | ||||
|     fdopen.restype = FILE_ptr | ||||
|  | ||||
|  | ||||
| # Get the libpq version to define what functions are available. | ||||
|  | ||||
| PQlibVersion = pq.PQlibVersion | ||||
| PQlibVersion.argtypes = [] | ||||
| PQlibVersion.restype = c_int | ||||
|  | ||||
| libpq_version = PQlibVersion() | ||||
|  | ||||
|  | ||||
| # libpq data types | ||||
|  | ||||
|  | ||||
| Oid = c_uint | ||||
|  | ||||
|  | ||||
| class PGconn_struct(Structure): | ||||
|     _fields_: List[Tuple[str, type]] = [] | ||||
|  | ||||
|  | ||||
| class PGresult_struct(Structure): | ||||
|     _fields_: List[Tuple[str, type]] = [] | ||||
|  | ||||
|  | ||||
| class PQconninfoOption_struct(Structure): | ||||
|     _fields_ = [ | ||||
|         ("keyword", c_char_p), | ||||
|         ("envvar", c_char_p), | ||||
|         ("compiled", c_char_p), | ||||
|         ("val", c_char_p), | ||||
|         ("label", c_char_p), | ||||
|         ("dispchar", c_char_p), | ||||
|         ("dispsize", c_int), | ||||
|     ] | ||||
|  | ||||
|  | ||||
| class PGnotify_struct(Structure): | ||||
|     _fields_ = [ | ||||
|         ("relname", c_char_p), | ||||
|         ("be_pid", c_int), | ||||
|         ("extra", c_char_p), | ||||
|     ] | ||||
|  | ||||
|  | ||||
| class PGcancel_struct(Structure): | ||||
|     _fields_: List[Tuple[str, type]] = [] | ||||
|  | ||||
|  | ||||
| class PGresAttDesc_struct(Structure): | ||||
|     _fields_ = [ | ||||
|         ("name", c_char_p), | ||||
|         ("tableid", Oid), | ||||
|         ("columnid", c_int), | ||||
|         ("format", c_int), | ||||
|         ("typid", Oid), | ||||
|         ("typlen", c_int), | ||||
|         ("atttypmod", c_int), | ||||
|     ] | ||||
|  | ||||
|  | ||||
| PGconn_ptr = POINTER(PGconn_struct) | ||||
| PGresult_ptr = POINTER(PGresult_struct) | ||||
| PQconninfoOption_ptr = POINTER(PQconninfoOption_struct) | ||||
| PGnotify_ptr = POINTER(PGnotify_struct) | ||||
| PGcancel_ptr = POINTER(PGcancel_struct) | ||||
| PGresAttDesc_ptr = POINTER(PGresAttDesc_struct) | ||||
|  | ||||
|  | ||||
| # Function definitions as explained in PostgreSQL 12 documentation | ||||
|  | ||||
| # 33.1. Database Connection Control Functions | ||||
|  | ||||
| # PQconnectdbParams: doesn't seem useful, won't wrap for now | ||||
|  | ||||
| PQconnectdb = pq.PQconnectdb | ||||
| PQconnectdb.argtypes = [c_char_p] | ||||
| PQconnectdb.restype = PGconn_ptr | ||||
|  | ||||
| # PQsetdbLogin: not useful | ||||
| # PQsetdb: not useful | ||||
|  | ||||
| # PQconnectStartParams: not useful | ||||
|  | ||||
| PQconnectStart = pq.PQconnectStart | ||||
| PQconnectStart.argtypes = [c_char_p] | ||||
| PQconnectStart.restype = PGconn_ptr | ||||
|  | ||||
| PQconnectPoll = pq.PQconnectPoll | ||||
| PQconnectPoll.argtypes = [PGconn_ptr] | ||||
| PQconnectPoll.restype = c_int | ||||
|  | ||||
| PQconndefaults = pq.PQconndefaults | ||||
| PQconndefaults.argtypes = [] | ||||
| PQconndefaults.restype = PQconninfoOption_ptr | ||||
|  | ||||
| PQconninfoFree = pq.PQconninfoFree | ||||
| PQconninfoFree.argtypes = [PQconninfoOption_ptr] | ||||
| PQconninfoFree.restype = None | ||||
|  | ||||
| PQconninfo = pq.PQconninfo | ||||
| PQconninfo.argtypes = [PGconn_ptr] | ||||
| PQconninfo.restype = PQconninfoOption_ptr | ||||
|  | ||||
| PQconninfoParse = pq.PQconninfoParse | ||||
| PQconninfoParse.argtypes = [c_char_p, POINTER(c_char_p)] | ||||
| PQconninfoParse.restype = PQconninfoOption_ptr | ||||
|  | ||||
| PQfinish = pq.PQfinish | ||||
| PQfinish.argtypes = [PGconn_ptr] | ||||
| PQfinish.restype = None | ||||
|  | ||||
| PQreset = pq.PQreset | ||||
| PQreset.argtypes = [PGconn_ptr] | ||||
| PQreset.restype = None | ||||
|  | ||||
| PQresetStart = pq.PQresetStart | ||||
| PQresetStart.argtypes = [PGconn_ptr] | ||||
| PQresetStart.restype = c_int | ||||
|  | ||||
| PQresetPoll = pq.PQresetPoll | ||||
| PQresetPoll.argtypes = [PGconn_ptr] | ||||
| PQresetPoll.restype = c_int | ||||
|  | ||||
| PQping = pq.PQping | ||||
| PQping.argtypes = [c_char_p] | ||||
| PQping.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.2. Connection Status Functions | ||||
|  | ||||
| PQdb = pq.PQdb | ||||
| PQdb.argtypes = [PGconn_ptr] | ||||
| PQdb.restype = c_char_p | ||||
|  | ||||
| PQuser = pq.PQuser | ||||
| PQuser.argtypes = [PGconn_ptr] | ||||
| PQuser.restype = c_char_p | ||||
|  | ||||
| PQpass = pq.PQpass | ||||
| PQpass.argtypes = [PGconn_ptr] | ||||
| PQpass.restype = c_char_p | ||||
|  | ||||
| PQhost = pq.PQhost | ||||
| PQhost.argtypes = [PGconn_ptr] | ||||
| PQhost.restype = c_char_p | ||||
|  | ||||
| _PQhostaddr = None | ||||
|  | ||||
| if libpq_version >= 120000: | ||||
|     _PQhostaddr = pq.PQhostaddr | ||||
|     _PQhostaddr.argtypes = [PGconn_ptr] | ||||
|     _PQhostaddr.restype = c_char_p | ||||
|  | ||||
|  | ||||
| def PQhostaddr(pgconn: PGconn_struct) -> bytes: | ||||
|     if not _PQhostaddr: | ||||
|         raise NotSupportedError( | ||||
|             "PQhostaddr requires libpq from PostgreSQL 12," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|  | ||||
|     return _PQhostaddr(pgconn) | ||||
|  | ||||
|  | ||||
| PQport = pq.PQport | ||||
| PQport.argtypes = [PGconn_ptr] | ||||
| PQport.restype = c_char_p | ||||
|  | ||||
| PQtty = pq.PQtty | ||||
| PQtty.argtypes = [PGconn_ptr] | ||||
| PQtty.restype = c_char_p | ||||
|  | ||||
| PQoptions = pq.PQoptions | ||||
| PQoptions.argtypes = [PGconn_ptr] | ||||
| PQoptions.restype = c_char_p | ||||
|  | ||||
| PQstatus = pq.PQstatus | ||||
| PQstatus.argtypes = [PGconn_ptr] | ||||
| PQstatus.restype = c_int | ||||
|  | ||||
| PQtransactionStatus = pq.PQtransactionStatus | ||||
| PQtransactionStatus.argtypes = [PGconn_ptr] | ||||
| PQtransactionStatus.restype = c_int | ||||
|  | ||||
| PQparameterStatus = pq.PQparameterStatus | ||||
| PQparameterStatus.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQparameterStatus.restype = c_char_p | ||||
|  | ||||
| PQprotocolVersion = pq.PQprotocolVersion | ||||
| PQprotocolVersion.argtypes = [PGconn_ptr] | ||||
| PQprotocolVersion.restype = c_int | ||||
|  | ||||
| PQserverVersion = pq.PQserverVersion | ||||
| PQserverVersion.argtypes = [PGconn_ptr] | ||||
| PQserverVersion.restype = c_int | ||||
|  | ||||
| PQerrorMessage = pq.PQerrorMessage | ||||
| PQerrorMessage.argtypes = [PGconn_ptr] | ||||
| PQerrorMessage.restype = c_char_p | ||||
|  | ||||
| PQsocket = pq.PQsocket | ||||
| PQsocket.argtypes = [PGconn_ptr] | ||||
| PQsocket.restype = c_int | ||||
|  | ||||
| PQbackendPID = pq.PQbackendPID | ||||
| PQbackendPID.argtypes = [PGconn_ptr] | ||||
| PQbackendPID.restype = c_int | ||||
|  | ||||
| PQconnectionNeedsPassword = pq.PQconnectionNeedsPassword | ||||
| PQconnectionNeedsPassword.argtypes = [PGconn_ptr] | ||||
| PQconnectionNeedsPassword.restype = c_int | ||||
|  | ||||
| PQconnectionUsedPassword = pq.PQconnectionUsedPassword | ||||
| PQconnectionUsedPassword.argtypes = [PGconn_ptr] | ||||
| PQconnectionUsedPassword.restype = c_int | ||||
|  | ||||
| PQsslInUse = pq.PQsslInUse | ||||
| PQsslInUse.argtypes = [PGconn_ptr] | ||||
| PQsslInUse.restype = c_int | ||||
|  | ||||
| # TODO: PQsslAttribute, PQsslAttributeNames, PQsslStruct, PQgetssl | ||||
|  | ||||
|  | ||||
| # 33.3. Command Execution Functions | ||||
|  | ||||
| PQexec = pq.PQexec | ||||
| PQexec.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQexec.restype = PGresult_ptr | ||||
|  | ||||
| PQexecParams = pq.PQexecParams | ||||
| PQexecParams.argtypes = [ | ||||
|     PGconn_ptr, | ||||
|     c_char_p, | ||||
|     c_int, | ||||
|     POINTER(Oid), | ||||
|     POINTER(c_char_p), | ||||
|     POINTER(c_int), | ||||
|     POINTER(c_int), | ||||
|     c_int, | ||||
| ] | ||||
| PQexecParams.restype = PGresult_ptr | ||||
|  | ||||
| PQprepare = pq.PQprepare | ||||
| PQprepare.argtypes = [PGconn_ptr, c_char_p, c_char_p, c_int, POINTER(Oid)] | ||||
| PQprepare.restype = PGresult_ptr | ||||
|  | ||||
| PQexecPrepared = pq.PQexecPrepared | ||||
| PQexecPrepared.argtypes = [ | ||||
|     PGconn_ptr, | ||||
|     c_char_p, | ||||
|     c_int, | ||||
|     POINTER(c_char_p), | ||||
|     POINTER(c_int), | ||||
|     POINTER(c_int), | ||||
|     c_int, | ||||
| ] | ||||
| PQexecPrepared.restype = PGresult_ptr | ||||
|  | ||||
| PQdescribePrepared = pq.PQdescribePrepared | ||||
| PQdescribePrepared.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQdescribePrepared.restype = PGresult_ptr | ||||
|  | ||||
| PQdescribePortal = pq.PQdescribePortal | ||||
| PQdescribePortal.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQdescribePortal.restype = PGresult_ptr | ||||
|  | ||||
| PQresultStatus = pq.PQresultStatus | ||||
| PQresultStatus.argtypes = [PGresult_ptr] | ||||
| PQresultStatus.restype = c_int | ||||
|  | ||||
| # PQresStatus: not needed, we have pretty enums | ||||
|  | ||||
| PQresultErrorMessage = pq.PQresultErrorMessage | ||||
| PQresultErrorMessage.argtypes = [PGresult_ptr] | ||||
| PQresultErrorMessage.restype = c_char_p | ||||
|  | ||||
| # TODO: PQresultVerboseErrorMessage | ||||
|  | ||||
| PQresultErrorField = pq.PQresultErrorField | ||||
| PQresultErrorField.argtypes = [PGresult_ptr, c_int] | ||||
| PQresultErrorField.restype = c_char_p | ||||
|  | ||||
| PQclear = pq.PQclear | ||||
| PQclear.argtypes = [PGresult_ptr] | ||||
| PQclear.restype = None | ||||
|  | ||||
|  | ||||
| # 33.3.2. Retrieving Query Result Information | ||||
|  | ||||
| PQntuples = pq.PQntuples | ||||
| PQntuples.argtypes = [PGresult_ptr] | ||||
| PQntuples.restype = c_int | ||||
|  | ||||
| PQnfields = pq.PQnfields | ||||
| PQnfields.argtypes = [PGresult_ptr] | ||||
| PQnfields.restype = c_int | ||||
|  | ||||
| PQfname = pq.PQfname | ||||
| PQfname.argtypes = [PGresult_ptr, c_int] | ||||
| PQfname.restype = c_char_p | ||||
|  | ||||
| # PQfnumber: useless and hard to use | ||||
|  | ||||
| PQftable = pq.PQftable | ||||
| PQftable.argtypes = [PGresult_ptr, c_int] | ||||
| PQftable.restype = Oid | ||||
|  | ||||
| PQftablecol = pq.PQftablecol | ||||
| PQftablecol.argtypes = [PGresult_ptr, c_int] | ||||
| PQftablecol.restype = c_int | ||||
|  | ||||
| PQfformat = pq.PQfformat | ||||
| PQfformat.argtypes = [PGresult_ptr, c_int] | ||||
| PQfformat.restype = c_int | ||||
|  | ||||
| PQftype = pq.PQftype | ||||
| PQftype.argtypes = [PGresult_ptr, c_int] | ||||
| PQftype.restype = Oid | ||||
|  | ||||
| PQfmod = pq.PQfmod | ||||
| PQfmod.argtypes = [PGresult_ptr, c_int] | ||||
| PQfmod.restype = c_int | ||||
|  | ||||
| PQfsize = pq.PQfsize | ||||
| PQfsize.argtypes = [PGresult_ptr, c_int] | ||||
| PQfsize.restype = c_int | ||||
|  | ||||
| PQbinaryTuples = pq.PQbinaryTuples | ||||
| PQbinaryTuples.argtypes = [PGresult_ptr] | ||||
| PQbinaryTuples.restype = c_int | ||||
|  | ||||
| PQgetvalue = pq.PQgetvalue | ||||
| PQgetvalue.argtypes = [PGresult_ptr, c_int, c_int] | ||||
| PQgetvalue.restype = POINTER(c_char)  # not a null-terminated string | ||||
|  | ||||
| PQgetisnull = pq.PQgetisnull | ||||
| PQgetisnull.argtypes = [PGresult_ptr, c_int, c_int] | ||||
| PQgetisnull.restype = c_int | ||||
|  | ||||
| PQgetlength = pq.PQgetlength | ||||
| PQgetlength.argtypes = [PGresult_ptr, c_int, c_int] | ||||
| PQgetlength.restype = c_int | ||||
|  | ||||
| PQnparams = pq.PQnparams | ||||
| PQnparams.argtypes = [PGresult_ptr] | ||||
| PQnparams.restype = c_int | ||||
|  | ||||
| PQparamtype = pq.PQparamtype | ||||
| PQparamtype.argtypes = [PGresult_ptr, c_int] | ||||
| PQparamtype.restype = Oid | ||||
|  | ||||
| # PQprint: pretty useless | ||||
|  | ||||
| # 33.3.3. Retrieving Other Result Information | ||||
|  | ||||
| PQcmdStatus = pq.PQcmdStatus | ||||
| PQcmdStatus.argtypes = [PGresult_ptr] | ||||
| PQcmdStatus.restype = c_char_p | ||||
|  | ||||
| PQcmdTuples = pq.PQcmdTuples | ||||
| PQcmdTuples.argtypes = [PGresult_ptr] | ||||
| PQcmdTuples.restype = c_char_p | ||||
|  | ||||
| PQoidValue = pq.PQoidValue | ||||
| PQoidValue.argtypes = [PGresult_ptr] | ||||
| PQoidValue.restype = Oid | ||||
|  | ||||
|  | ||||
| # 33.3.4. Escaping Strings for Inclusion in SQL Commands | ||||
|  | ||||
| PQescapeLiteral = pq.PQescapeLiteral | ||||
| PQescapeLiteral.argtypes = [PGconn_ptr, c_char_p, c_size_t] | ||||
| PQescapeLiteral.restype = POINTER(c_char) | ||||
|  | ||||
| PQescapeIdentifier = pq.PQescapeIdentifier | ||||
| PQescapeIdentifier.argtypes = [PGconn_ptr, c_char_p, c_size_t] | ||||
| PQescapeIdentifier.restype = POINTER(c_char) | ||||
|  | ||||
| PQescapeStringConn = pq.PQescapeStringConn | ||||
| # TODO: raises "wrong type" error | ||||
| # PQescapeStringConn.argtypes = [ | ||||
| #     PGconn_ptr, c_char_p, c_char_p, c_size_t, POINTER(c_int) | ||||
| # ] | ||||
| PQescapeStringConn.restype = c_size_t | ||||
|  | ||||
| PQescapeString = pq.PQescapeString | ||||
| # TODO: raises "wrong type" error | ||||
| # PQescapeString.argtypes = [c_char_p, c_char_p, c_size_t] | ||||
| PQescapeString.restype = c_size_t | ||||
|  | ||||
| PQescapeByteaConn = pq.PQescapeByteaConn | ||||
| PQescapeByteaConn.argtypes = [ | ||||
|     PGconn_ptr, | ||||
|     POINTER(c_char),  # actually POINTER(c_ubyte) but this is easier | ||||
|     c_size_t, | ||||
|     POINTER(c_size_t), | ||||
| ] | ||||
| PQescapeByteaConn.restype = POINTER(c_ubyte) | ||||
|  | ||||
| PQescapeBytea = pq.PQescapeBytea | ||||
| PQescapeBytea.argtypes = [ | ||||
|     POINTER(c_char),  # actually POINTER(c_ubyte) but this is easier | ||||
|     c_size_t, | ||||
|     POINTER(c_size_t), | ||||
| ] | ||||
| PQescapeBytea.restype = POINTER(c_ubyte) | ||||
|  | ||||
|  | ||||
| PQunescapeBytea = pq.PQunescapeBytea | ||||
| PQunescapeBytea.argtypes = [ | ||||
|     POINTER(c_char),  # actually POINTER(c_ubyte) but this is easier | ||||
|     POINTER(c_size_t), | ||||
| ] | ||||
| PQunescapeBytea.restype = POINTER(c_ubyte) | ||||
|  | ||||
|  | ||||
| # 33.4. Asynchronous Command Processing | ||||
|  | ||||
| PQsendQuery = pq.PQsendQuery | ||||
| PQsendQuery.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQsendQuery.restype = c_int | ||||
|  | ||||
| PQsendQueryParams = pq.PQsendQueryParams | ||||
| PQsendQueryParams.argtypes = [ | ||||
|     PGconn_ptr, | ||||
|     c_char_p, | ||||
|     c_int, | ||||
|     POINTER(Oid), | ||||
|     POINTER(c_char_p), | ||||
|     POINTER(c_int), | ||||
|     POINTER(c_int), | ||||
|     c_int, | ||||
| ] | ||||
| PQsendQueryParams.restype = c_int | ||||
|  | ||||
| PQsendPrepare = pq.PQsendPrepare | ||||
| PQsendPrepare.argtypes = [PGconn_ptr, c_char_p, c_char_p, c_int, POINTER(Oid)] | ||||
| PQsendPrepare.restype = c_int | ||||
|  | ||||
| PQsendQueryPrepared = pq.PQsendQueryPrepared | ||||
| PQsendQueryPrepared.argtypes = [ | ||||
|     PGconn_ptr, | ||||
|     c_char_p, | ||||
|     c_int, | ||||
|     POINTER(c_char_p), | ||||
|     POINTER(c_int), | ||||
|     POINTER(c_int), | ||||
|     c_int, | ||||
| ] | ||||
| PQsendQueryPrepared.restype = c_int | ||||
|  | ||||
| PQsendDescribePrepared = pq.PQsendDescribePrepared | ||||
| PQsendDescribePrepared.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQsendDescribePrepared.restype = c_int | ||||
|  | ||||
| PQsendDescribePortal = pq.PQsendDescribePortal | ||||
| PQsendDescribePortal.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQsendDescribePortal.restype = c_int | ||||
|  | ||||
| PQgetResult = pq.PQgetResult | ||||
| PQgetResult.argtypes = [PGconn_ptr] | ||||
| PQgetResult.restype = PGresult_ptr | ||||
|  | ||||
| PQconsumeInput = pq.PQconsumeInput | ||||
| PQconsumeInput.argtypes = [PGconn_ptr] | ||||
| PQconsumeInput.restype = c_int | ||||
|  | ||||
| PQisBusy = pq.PQisBusy | ||||
| PQisBusy.argtypes = [PGconn_ptr] | ||||
| PQisBusy.restype = c_int | ||||
|  | ||||
| PQsetnonblocking = pq.PQsetnonblocking | ||||
| PQsetnonblocking.argtypes = [PGconn_ptr, c_int] | ||||
| PQsetnonblocking.restype = c_int | ||||
|  | ||||
| PQisnonblocking = pq.PQisnonblocking | ||||
| PQisnonblocking.argtypes = [PGconn_ptr] | ||||
| PQisnonblocking.restype = c_int | ||||
|  | ||||
| PQflush = pq.PQflush | ||||
| PQflush.argtypes = [PGconn_ptr] | ||||
| PQflush.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.5. Retrieving Query Results Row-by-Row | ||||
| PQsetSingleRowMode = pq.PQsetSingleRowMode | ||||
| PQsetSingleRowMode.argtypes = [PGconn_ptr] | ||||
| PQsetSingleRowMode.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.6. Canceling Queries in Progress | ||||
|  | ||||
| PQgetCancel = pq.PQgetCancel | ||||
| PQgetCancel.argtypes = [PGconn_ptr] | ||||
| PQgetCancel.restype = PGcancel_ptr | ||||
|  | ||||
| PQfreeCancel = pq.PQfreeCancel | ||||
| PQfreeCancel.argtypes = [PGcancel_ptr] | ||||
| PQfreeCancel.restype = None | ||||
|  | ||||
| PQcancel = pq.PQcancel | ||||
| # TODO: raises "wrong type" error | ||||
| # PQcancel.argtypes = [PGcancel_ptr, POINTER(c_char), c_int] | ||||
| PQcancel.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.8. Asynchronous Notification | ||||
|  | ||||
| PQnotifies = pq.PQnotifies | ||||
| PQnotifies.argtypes = [PGconn_ptr] | ||||
| PQnotifies.restype = PGnotify_ptr | ||||
|  | ||||
|  | ||||
| # 33.9. Functions Associated with the COPY Command | ||||
|  | ||||
| PQputCopyData = pq.PQputCopyData | ||||
| PQputCopyData.argtypes = [PGconn_ptr, c_char_p, c_int] | ||||
| PQputCopyData.restype = c_int | ||||
|  | ||||
| PQputCopyEnd = pq.PQputCopyEnd | ||||
| PQputCopyEnd.argtypes = [PGconn_ptr, c_char_p] | ||||
| PQputCopyEnd.restype = c_int | ||||
|  | ||||
| PQgetCopyData = pq.PQgetCopyData | ||||
| PQgetCopyData.argtypes = [PGconn_ptr, POINTER(c_char_p), c_int] | ||||
| PQgetCopyData.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.10. Control Functions | ||||
|  | ||||
| PQtrace = pq.PQtrace | ||||
| PQtrace.argtypes = [PGconn_ptr, FILE_ptr] | ||||
| PQtrace.restype = None | ||||
|  | ||||
| _PQsetTraceFlags = None | ||||
|  | ||||
| if libpq_version >= 140000: | ||||
|     _PQsetTraceFlags = pq.PQsetTraceFlags | ||||
|     _PQsetTraceFlags.argtypes = [PGconn_ptr, c_int] | ||||
|     _PQsetTraceFlags.restype = None | ||||
|  | ||||
|  | ||||
| def PQsetTraceFlags(pgconn: PGconn_struct, flags: int) -> None: | ||||
|     if not _PQsetTraceFlags: | ||||
|         raise NotSupportedError( | ||||
|             "PQsetTraceFlags requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|  | ||||
|     _PQsetTraceFlags(pgconn, flags) | ||||
|  | ||||
|  | ||||
| PQuntrace = pq.PQuntrace | ||||
| PQuntrace.argtypes = [PGconn_ptr] | ||||
| PQuntrace.restype = None | ||||
|  | ||||
| # 33.11. Miscellaneous Functions | ||||
|  | ||||
| PQfreemem = pq.PQfreemem | ||||
| PQfreemem.argtypes = [c_void_p] | ||||
| PQfreemem.restype = None | ||||
|  | ||||
| if libpq_version >= 100000: | ||||
|     _PQencryptPasswordConn = pq.PQencryptPasswordConn | ||||
|     _PQencryptPasswordConn.argtypes = [ | ||||
|         PGconn_ptr, | ||||
|         c_char_p, | ||||
|         c_char_p, | ||||
|         c_char_p, | ||||
|     ] | ||||
|     _PQencryptPasswordConn.restype = POINTER(c_char) | ||||
|  | ||||
|  | ||||
| def PQencryptPasswordConn( | ||||
|     pgconn: PGconn_struct, passwd: bytes, user: bytes, algorithm: bytes | ||||
| ) -> Optional[bytes]: | ||||
|     if not _PQencryptPasswordConn: | ||||
|         raise NotSupportedError( | ||||
|             "PQencryptPasswordConn requires libpq from PostgreSQL 10," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|  | ||||
|     return _PQencryptPasswordConn(pgconn, passwd, user, algorithm) | ||||
|  | ||||
|  | ||||
| PQmakeEmptyPGresult = pq.PQmakeEmptyPGresult | ||||
| PQmakeEmptyPGresult.argtypes = [PGconn_ptr, c_int] | ||||
| PQmakeEmptyPGresult.restype = PGresult_ptr | ||||
|  | ||||
| PQsetResultAttrs = pq.PQsetResultAttrs | ||||
| PQsetResultAttrs.argtypes = [PGresult_ptr, c_int, PGresAttDesc_ptr] | ||||
| PQsetResultAttrs.restype = c_int | ||||
|  | ||||
|  | ||||
| # 33.12. Notice Processing | ||||
|  | ||||
| PQnoticeReceiver = CFUNCTYPE(None, c_void_p, PGresult_ptr) | ||||
|  | ||||
| PQsetNoticeReceiver = pq.PQsetNoticeReceiver | ||||
| PQsetNoticeReceiver.argtypes = [PGconn_ptr, PQnoticeReceiver, c_void_p] | ||||
| PQsetNoticeReceiver.restype = PQnoticeReceiver | ||||
|  | ||||
| # 34.5 Pipeline Mode | ||||
|  | ||||
| _PQpipelineStatus = None | ||||
| _PQenterPipelineMode = None | ||||
| _PQexitPipelineMode = None | ||||
| _PQpipelineSync = None | ||||
| _PQsendFlushRequest = None | ||||
|  | ||||
| if libpq_version >= 140000: | ||||
|     _PQpipelineStatus = pq.PQpipelineStatus | ||||
|     _PQpipelineStatus.argtypes = [PGconn_ptr] | ||||
|     _PQpipelineStatus.restype = c_int | ||||
|  | ||||
|     _PQenterPipelineMode = pq.PQenterPipelineMode | ||||
|     _PQenterPipelineMode.argtypes = [PGconn_ptr] | ||||
|     _PQenterPipelineMode.restype = c_int | ||||
|  | ||||
|     _PQexitPipelineMode = pq.PQexitPipelineMode | ||||
|     _PQexitPipelineMode.argtypes = [PGconn_ptr] | ||||
|     _PQexitPipelineMode.restype = c_int | ||||
|  | ||||
|     _PQpipelineSync = pq.PQpipelineSync | ||||
|     _PQpipelineSync.argtypes = [PGconn_ptr] | ||||
|     _PQpipelineSync.restype = c_int | ||||
|  | ||||
|     _PQsendFlushRequest = pq.PQsendFlushRequest | ||||
|     _PQsendFlushRequest.argtypes = [PGconn_ptr] | ||||
|     _PQsendFlushRequest.restype = c_int | ||||
|  | ||||
|  | ||||
| def PQpipelineStatus(pgconn: PGconn_struct) -> int: | ||||
|     if not _PQpipelineStatus: | ||||
|         raise NotSupportedError( | ||||
|             "PQpipelineStatus requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|     return _PQpipelineStatus(pgconn) | ||||
|  | ||||
|  | ||||
| def PQenterPipelineMode(pgconn: PGconn_struct) -> int: | ||||
|     if not _PQenterPipelineMode: | ||||
|         raise NotSupportedError( | ||||
|             "PQenterPipelineMode requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|     return _PQenterPipelineMode(pgconn) | ||||
|  | ||||
|  | ||||
| def PQexitPipelineMode(pgconn: PGconn_struct) -> int: | ||||
|     if not _PQexitPipelineMode: | ||||
|         raise NotSupportedError( | ||||
|             "PQexitPipelineMode requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|     return _PQexitPipelineMode(pgconn) | ||||
|  | ||||
|  | ||||
| def PQpipelineSync(pgconn: PGconn_struct) -> int: | ||||
|     if not _PQpipelineSync: | ||||
|         raise NotSupportedError( | ||||
|             "PQpipelineSync requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|     return _PQpipelineSync(pgconn) | ||||
|  | ||||
|  | ||||
| def PQsendFlushRequest(pgconn: PGconn_struct) -> int: | ||||
|     if not _PQsendFlushRequest: | ||||
|         raise NotSupportedError( | ||||
|             "PQsendFlushRequest requires libpq from PostgreSQL 14," | ||||
|             f" {libpq_version} available instead" | ||||
|         ) | ||||
|     return _PQsendFlushRequest(pgconn) | ||||
|  | ||||
|  | ||||
| # 33.18. SSL Support | ||||
|  | ||||
| PQinitOpenSSL = pq.PQinitOpenSSL | ||||
| PQinitOpenSSL.argtypes = [c_int, c_int] | ||||
| PQinitOpenSSL.restype = None | ||||
|  | ||||
|  | ||||
| def generate_stub() -> None: | ||||
|     import re | ||||
|     from ctypes import _CFuncPtr  # type: ignore | ||||
|  | ||||
|     def type2str(fname, narg, t): | ||||
|         if t is None: | ||||
|             return "None" | ||||
|         elif t is c_void_p: | ||||
|             return "Any" | ||||
|         elif t is c_int or t is c_uint or t is c_size_t: | ||||
|             return "int" | ||||
|         elif t is c_char_p or t.__name__ == "LP_c_char": | ||||
|             if narg is not None: | ||||
|                 return "bytes" | ||||
|             else: | ||||
|                 return "Optional[bytes]" | ||||
|  | ||||
|         elif t.__name__ in ( | ||||
|             "LP_PGconn_struct", | ||||
|             "LP_PGresult_struct", | ||||
|             "LP_PGcancel_struct", | ||||
|         ): | ||||
|             if narg is not None: | ||||
|                 return f"Optional[{t.__name__[3:]}]" | ||||
|             else: | ||||
|                 return t.__name__[3:] | ||||
|  | ||||
|         elif t.__name__ in ("LP_PQconninfoOption_struct",): | ||||
|             return f"Sequence[{t.__name__[3:]}]" | ||||
|  | ||||
|         elif t.__name__ in ( | ||||
|             "LP_c_ubyte", | ||||
|             "LP_c_char_p", | ||||
|             "LP_c_int", | ||||
|             "LP_c_uint", | ||||
|             "LP_c_ulong", | ||||
|             "LP_FILE", | ||||
|         ): | ||||
|             return f"_Pointer[{t.__name__[3:]}]" | ||||
|  | ||||
|         else: | ||||
|             assert False, f"can't deal with {t} in {fname}" | ||||
|  | ||||
|     fn = __file__ + "i" | ||||
|     with open(fn) as f: | ||||
|         lines = f.read().splitlines() | ||||
|  | ||||
|     istart, iend = ( | ||||
|         i | ||||
|         for i, line in enumerate(lines) | ||||
|         if re.match(r"\s*#\s*autogenerated:\s+(start|end)", line) | ||||
|     ) | ||||
|  | ||||
|     known = { | ||||
|         line[4:].split("(", 1)[0] for line in lines[:istart] if line.startswith("def ") | ||||
|     } | ||||
|  | ||||
|     signatures = [] | ||||
|  | ||||
|     for name, obj in globals().items(): | ||||
|         if name in known: | ||||
|             continue | ||||
|         if not isinstance(obj, _CFuncPtr): | ||||
|             continue | ||||
|  | ||||
|         params = [] | ||||
|         for i, t in enumerate(obj.argtypes): | ||||
|             params.append(f"arg{i + 1}: {type2str(name, i, t)}") | ||||
|  | ||||
|         resname = type2str(name, None, obj.restype) | ||||
|  | ||||
|         signatures.append(f"def {name}({', '.join(params)}) -> {resname}: ...") | ||||
|  | ||||
|     lines[istart + 1 : iend] = signatures | ||||
|  | ||||
|     with open(fn, "w") as f: | ||||
|         f.write("\n".join(lines)) | ||||
|         f.write("\n") | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     generate_stub() | ||||
							
								
								
									
										384
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/abc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										384
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/abc.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,384 @@ | ||||
| """ | ||||
| Protocol objects to represent objects exposed by different pq implementations. | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2020 The Psycopg Team | ||||
|  | ||||
| from typing import Any, Callable, List, Optional, Sequence, Tuple | ||||
| from typing import Union, TYPE_CHECKING | ||||
| from typing_extensions import TypeAlias | ||||
|  | ||||
| from ._enums import Format, Trace | ||||
| from .._compat import Protocol | ||||
|  | ||||
| if TYPE_CHECKING: | ||||
|     from .misc import PGnotify, ConninfoOption, PGresAttDesc | ||||
|  | ||||
| # An object implementing the buffer protocol (ish) | ||||
| Buffer: TypeAlias = Union[bytes, bytearray, memoryview] | ||||
|  | ||||
|  | ||||
| class PGconn(Protocol): | ||||
|     notice_handler: Optional[Callable[["PGresult"], None]] | ||||
|     notify_handler: Optional[Callable[["PGnotify"], None]] | ||||
|  | ||||
|     @classmethod | ||||
|     def connect(cls, conninfo: bytes) -> "PGconn": | ||||
|         ... | ||||
|  | ||||
|     @classmethod | ||||
|     def connect_start(cls, conninfo: bytes) -> "PGconn": | ||||
|         ... | ||||
|  | ||||
|     def connect_poll(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def finish(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def info(self) -> List["ConninfoOption"]: | ||||
|         ... | ||||
|  | ||||
|     def reset(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def reset_start(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def reset_poll(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @classmethod | ||||
|     def ping(self, conninfo: bytes) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def db(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def user(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def password(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def host(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def hostaddr(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def port(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def tty(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def options(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def status(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def transaction_status(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def parameter_status(self, name: bytes) -> Optional[bytes]: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def error_message(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def server_version(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def socket(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def backend_pid(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def needs_password(self) -> bool: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def used_password(self) -> bool: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def ssl_in_use(self) -> bool: | ||||
|         ... | ||||
|  | ||||
|     def exec_(self, command: bytes) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def send_query(self, command: bytes) -> None: | ||||
|         ... | ||||
|  | ||||
|     def exec_params( | ||||
|         self, | ||||
|         command: bytes, | ||||
|         param_values: Optional[Sequence[Optional[Buffer]]], | ||||
|         param_types: Optional[Sequence[int]] = None, | ||||
|         param_formats: Optional[Sequence[int]] = None, | ||||
|         result_format: int = Format.TEXT, | ||||
|     ) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def send_query_params( | ||||
|         self, | ||||
|         command: bytes, | ||||
|         param_values: Optional[Sequence[Optional[Buffer]]], | ||||
|         param_types: Optional[Sequence[int]] = None, | ||||
|         param_formats: Optional[Sequence[int]] = None, | ||||
|         result_format: int = Format.TEXT, | ||||
|     ) -> None: | ||||
|         ... | ||||
|  | ||||
|     def send_prepare( | ||||
|         self, | ||||
|         name: bytes, | ||||
|         command: bytes, | ||||
|         param_types: Optional[Sequence[int]] = None, | ||||
|     ) -> None: | ||||
|         ... | ||||
|  | ||||
|     def send_query_prepared( | ||||
|         self, | ||||
|         name: bytes, | ||||
|         param_values: Optional[Sequence[Optional[Buffer]]], | ||||
|         param_formats: Optional[Sequence[int]] = None, | ||||
|         result_format: int = Format.TEXT, | ||||
|     ) -> None: | ||||
|         ... | ||||
|  | ||||
|     def prepare( | ||||
|         self, | ||||
|         name: bytes, | ||||
|         command: bytes, | ||||
|         param_types: Optional[Sequence[int]] = None, | ||||
|     ) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def exec_prepared( | ||||
|         self, | ||||
|         name: bytes, | ||||
|         param_values: Optional[Sequence[Buffer]], | ||||
|         param_formats: Optional[Sequence[int]] = None, | ||||
|         result_format: int = 0, | ||||
|     ) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def describe_prepared(self, name: bytes) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def send_describe_prepared(self, name: bytes) -> None: | ||||
|         ... | ||||
|  | ||||
|     def describe_portal(self, name: bytes) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     def send_describe_portal(self, name: bytes) -> None: | ||||
|         ... | ||||
|  | ||||
|     def get_result(self) -> Optional["PGresult"]: | ||||
|         ... | ||||
|  | ||||
|     def consume_input(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def is_busy(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def nonblocking(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @nonblocking.setter | ||||
|     def nonblocking(self, arg: int) -> None: | ||||
|         ... | ||||
|  | ||||
|     def flush(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def set_single_row_mode(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def get_cancel(self) -> "PGcancel": | ||||
|         ... | ||||
|  | ||||
|     def notifies(self) -> Optional["PGnotify"]: | ||||
|         ... | ||||
|  | ||||
|     def put_copy_data(self, buffer: Buffer) -> int: | ||||
|         ... | ||||
|  | ||||
|     def put_copy_end(self, error: Optional[bytes] = None) -> int: | ||||
|         ... | ||||
|  | ||||
|     def get_copy_data(self, async_: int) -> Tuple[int, memoryview]: | ||||
|         ... | ||||
|  | ||||
|     def trace(self, fileno: int) -> None: | ||||
|         ... | ||||
|  | ||||
|     def set_trace_flags(self, flags: Trace) -> None: | ||||
|         ... | ||||
|  | ||||
|     def untrace(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def encrypt_password( | ||||
|         self, passwd: bytes, user: bytes, algorithm: Optional[bytes] = None | ||||
|     ) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def make_empty_result(self, exec_status: int) -> "PGresult": | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def pipeline_status(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def enter_pipeline_mode(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def exit_pipeline_mode(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def pipeline_sync(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def send_flush_request(self) -> None: | ||||
|         ... | ||||
|  | ||||
|  | ||||
| class PGresult(Protocol): | ||||
|     def clear(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def status(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def error_message(self) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def error_field(self, fieldcode: int) -> Optional[bytes]: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def ntuples(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def nfields(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def fname(self, column_number: int) -> Optional[bytes]: | ||||
|         ... | ||||
|  | ||||
|     def ftable(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     def ftablecol(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     def fformat(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     def ftype(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     def fmod(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     def fsize(self, column_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def binary_tuples(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def get_value(self, row_number: int, column_number: int) -> Optional[bytes]: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def nparams(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def param_type(self, param_number: int) -> int: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def command_status(self) -> Optional[bytes]: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def command_tuples(self) -> Optional[int]: | ||||
|         ... | ||||
|  | ||||
|     @property | ||||
|     def oid_value(self) -> int: | ||||
|         ... | ||||
|  | ||||
|     def set_attributes(self, descriptions: List["PGresAttDesc"]) -> None: | ||||
|         ... | ||||
|  | ||||
|  | ||||
| class PGcancel(Protocol): | ||||
|     def free(self) -> None: | ||||
|         ... | ||||
|  | ||||
|     def cancel(self) -> None: | ||||
|         ... | ||||
|  | ||||
|  | ||||
| class Conninfo(Protocol): | ||||
|     @classmethod | ||||
|     def get_defaults(cls) -> List["ConninfoOption"]: | ||||
|         ... | ||||
|  | ||||
|     @classmethod | ||||
|     def parse(cls, conninfo: bytes) -> List["ConninfoOption"]: | ||||
|         ... | ||||
|  | ||||
|     @classmethod | ||||
|     def _options_from_array(cls, opts: Sequence[Any]) -> List["ConninfoOption"]: | ||||
|         ... | ||||
|  | ||||
|  | ||||
| class Escaping(Protocol): | ||||
|     def __init__(self, conn: Optional[PGconn] = None): | ||||
|         ... | ||||
|  | ||||
|     def escape_literal(self, data: Buffer) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def escape_identifier(self, data: Buffer) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def escape_string(self, data: Buffer) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def escape_bytea(self, data: Buffer) -> bytes: | ||||
|         ... | ||||
|  | ||||
|     def unescape_bytea(self, data: Buffer) -> bytes: | ||||
|         ... | ||||
							
								
								
									
										146
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/misc.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/misc.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,146 @@ | ||||
| """ | ||||
| Various functionalities to make easier to work with the libpq. | ||||
| """ | ||||
|  | ||||
| # Copyright (C) 2020 The Psycopg Team | ||||
|  | ||||
| import os | ||||
| import sys | ||||
| import logging | ||||
| import ctypes.util | ||||
| from typing import cast, NamedTuple, Optional, Union | ||||
|  | ||||
| from .abc import PGconn, PGresult | ||||
| from ._enums import ConnStatus, TransactionStatus, PipelineStatus | ||||
| from .._compat import cache | ||||
| from .._encodings import pgconn_encoding | ||||
|  | ||||
| logger = logging.getLogger("psycopg.pq") | ||||
|  | ||||
| OK = ConnStatus.OK | ||||
|  | ||||
|  | ||||
| class PGnotify(NamedTuple): | ||||
|     relname: bytes | ||||
|     be_pid: int | ||||
|     extra: bytes | ||||
|  | ||||
|  | ||||
| class ConninfoOption(NamedTuple): | ||||
|     keyword: bytes | ||||
|     envvar: Optional[bytes] | ||||
|     compiled: Optional[bytes] | ||||
|     val: Optional[bytes] | ||||
|     label: bytes | ||||
|     dispchar: bytes | ||||
|     dispsize: int | ||||
|  | ||||
|  | ||||
| class PGresAttDesc(NamedTuple): | ||||
|     name: bytes | ||||
|     tableid: int | ||||
|     columnid: int | ||||
|     format: int | ||||
|     typid: int | ||||
|     typlen: int | ||||
|     atttypmod: int | ||||
|  | ||||
|  | ||||
| @cache | ||||
| def find_libpq_full_path() -> Optional[str]: | ||||
|     if sys.platform == "win32": | ||||
|         libname = ctypes.util.find_library("libpq.dll") | ||||
|  | ||||
|     elif sys.platform == "darwin": | ||||
|         libname = ctypes.util.find_library("libpq.dylib") | ||||
|         # (hopefully) temporary hack: libpq not in a standard place | ||||
|         # https://github.com/orgs/Homebrew/discussions/3595 | ||||
|         # If pg_config is available and agrees, let's use its indications. | ||||
|         if not libname: | ||||
|             try: | ||||
|                 import subprocess as sp | ||||
|  | ||||
|                 libdir = sp.check_output(["pg_config", "--libdir"]).strip().decode() | ||||
|                 libname = os.path.join(libdir, "libpq.dylib") | ||||
|                 if not os.path.exists(libname): | ||||
|                     libname = None | ||||
|             except Exception as ex: | ||||
|                 logger.debug("couldn't use pg_config to find libpq: %s", ex) | ||||
|  | ||||
|     else: | ||||
|         libname = ctypes.util.find_library("pq") | ||||
|  | ||||
|     return libname | ||||
|  | ||||
|  | ||||
| def error_message(obj: Union[PGconn, PGresult], encoding: str = "utf8") -> str: | ||||
|     """ | ||||
|     Return an error message from a `PGconn` or `PGresult`. | ||||
|  | ||||
|     The return value is a `!str` (unlike pq data which is usually `!bytes`): | ||||
|     use the connection encoding if available, otherwise the `!encoding` | ||||
|     parameter as a fallback for decoding. Don't raise exceptions on decoding | ||||
|     errors. | ||||
|  | ||||
|     """ | ||||
|     bmsg: bytes | ||||
|  | ||||
|     if hasattr(obj, "error_field"): | ||||
|         # obj is a PGresult | ||||
|         obj = cast(PGresult, obj) | ||||
|         bmsg = obj.error_message | ||||
|  | ||||
|         # strip severity and whitespaces | ||||
|         if bmsg: | ||||
|             bmsg = bmsg.split(b":", 1)[-1].strip() | ||||
|  | ||||
|     elif hasattr(obj, "error_message"): | ||||
|         # obj is a PGconn | ||||
|         if obj.status == OK: | ||||
|             encoding = pgconn_encoding(obj) | ||||
|         bmsg = obj.error_message | ||||
|  | ||||
|         # strip severity and whitespaces | ||||
|         if bmsg: | ||||
|             bmsg = bmsg.split(b":", 1)[-1].strip() | ||||
|  | ||||
|     else: | ||||
|         raise TypeError(f"PGconn or PGresult expected, got {type(obj).__name__}") | ||||
|  | ||||
|     if bmsg: | ||||
|         msg = bmsg.decode(encoding, "replace") | ||||
|     else: | ||||
|         msg = "no details available" | ||||
|  | ||||
|     return msg | ||||
|  | ||||
|  | ||||
| def connection_summary(pgconn: PGconn) -> str: | ||||
|     """ | ||||
|     Return summary information on a connection. | ||||
|  | ||||
|     Useful for __repr__ | ||||
|     """ | ||||
|     parts = [] | ||||
|     if pgconn.status == OK: | ||||
|         # Put together the [STATUS] | ||||
|         status = TransactionStatus(pgconn.transaction_status).name | ||||
|         if pgconn.pipeline_status: | ||||
|             status += f", pipeline={PipelineStatus(pgconn.pipeline_status).name}" | ||||
|  | ||||
|         # Put together the (CONNECTION) | ||||
|         if not pgconn.host.startswith(b"/"): | ||||
|             parts.append(("host", pgconn.host.decode())) | ||||
|         if pgconn.port != b"5432": | ||||
|             parts.append(("port", pgconn.port.decode())) | ||||
|         if pgconn.user != pgconn.db: | ||||
|             parts.append(("user", pgconn.user.decode())) | ||||
|         parts.append(("database", pgconn.db.decode())) | ||||
|  | ||||
|     else: | ||||
|         status = ConnStatus(pgconn.status).name | ||||
|  | ||||
|     sparts = " ".join("%s=%s" % part for part in parts) | ||||
|     if sparts: | ||||
|         sparts = f" ({sparts})" | ||||
|     return f"[{status}]{sparts}" | ||||
							
								
								
									
										1089
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/pq_ctypes.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1089
									
								
								srcs/.venv/lib/python3.11/site-packages/psycopg/pq/pq_ctypes.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user