| 110 | |
| 111 | |
| 112 | class PoolConnectionHolder: |
| 113 | |
| 114 | __slots__ = ('_con', '_pool', '_loop', '_proxy', |
| 115 | '_max_queries', '_setup', |
| 116 | '_max_inactive_time', '_in_use', |
| 117 | '_inactive_callback', '_timeout', |
| 118 | '_generation') |
| 119 | |
| 120 | def __init__( |
| 121 | self, |
| 122 | pool: "Pool", |
| 123 | *, |
| 124 | max_queries: float, |
| 125 | setup: Optional[Callable[[PoolConnectionProxy], Awaitable[None]]], |
| 126 | max_inactive_time: float, |
| 127 | ) -> None: |
| 128 | |
| 129 | self._pool = pool |
| 130 | self._con: Optional[connection.Connection] = None |
| 131 | self._proxy: Optional[PoolConnectionProxy] = None |
| 132 | |
| 133 | self._max_queries = max_queries |
| 134 | self._max_inactive_time = max_inactive_time |
| 135 | self._setup = setup |
| 136 | self._inactive_callback: Optional[Callable] = None |
| 137 | self._in_use: Optional[asyncio.Future] = None |
| 138 | self._timeout: Optional[float] = None |
| 139 | self._generation: Optional[int] = None |
| 140 | |
| 141 | def is_connected(self) -> bool: |
| 142 | return self._con is not None and not self._con.is_closed() |
| 143 | |
| 144 | def is_idle(self) -> bool: |
| 145 | return not self._in_use |
| 146 | |
| 147 | async def connect(self) -> None: |
| 148 | if self._con is not None: |
| 149 | raise exceptions.InternalClientError( |
| 150 | 'PoolConnectionHolder.connect() called while another ' |
| 151 | 'connection already exists') |
| 152 | |
| 153 | self._con = await self._pool._get_new_connection() |
| 154 | self._generation = self._pool._generation |
| 155 | self._maybe_cancel_inactive_callback() |
| 156 | self._setup_inactive_callback() |
| 157 | |
| 158 | async def acquire(self) -> PoolConnectionProxy: |
| 159 | if self._con is None or self._con.is_closed(): |
| 160 | self._con = None |
| 161 | await self.connect() |
| 162 | |
| 163 | elif self._generation != self._pool._generation: |
| 164 | # Connections have been expired, re-connect the holder. |
| 165 | self._pool._loop.create_task( |
| 166 | self._con.close(timeout=self._timeout)) |
| 167 | self._con = None |
| 168 | await self.connect() |
| 169 |
no outgoing calls
no test coverage detected
searching dependent graphs…