def _repr(self, cur: BaseCursor[ConnectionType, Row]) -> str:
cls = f"{cur.__class__.__module__}.{cur.__class__.__qualname__}"
info = pq.misc.connection_summary(cur._conn.pgconn)
- if cur._closed:
+ if cur.closed:
status = "closed"
elif not cur.pgresult:
status = "no result"
self.itersize: int = DEFAULT_ITERSIZE
def __del__(self) -> None:
- if not self._closed:
+ if not self.closed:
warnings.warn(
f"the server-side cursor {self} was deleted while still open."
f" Please use 'with' or '.close()' to close the cursor properly",
Close the current cursor and free associated resources.
"""
with self._conn.lock:
+ if self.closed:
+ return
self._conn.wait(self._helper._close_gen(self))
- self._close()
+ self._close()
def execute(
self,
self.itersize: int = DEFAULT_ITERSIZE
def __del__(self) -> None:
- if not self._closed:
+ if not self.closed:
warnings.warn(
f"the server-side cursor {self} was deleted while still open."
f" Please use 'with' or '.close()' to close the cursor properly",
async def close(self) -> None:
async with self._conn.lock:
+ if self.closed:
+ return
await self._conn.wait(self._helper._close_gen(self))
- self._close()
+ self._close()
async def execute(
self,
assert not recwarn, [str(w.message) for w in recwarn.list]
+def test_close_idempotent(conn):
+ cur = conn.cursor("foo")
+ cur.execute("select 1")
+ cur.fetchall()
+ cur.close()
+ cur.close()
+
+
def test_close_noop(conn, recwarn, retries):
for retry in retries:
with retry:
assert not recwarn, [str(w.message) for w in recwarn.list]
+async def test_close_idempotent(aconn):
+ cur = aconn.cursor("foo")
+ await cur.execute("select 1")
+ await cur.fetchall()
+ await cur.close()
+ await cur.close()
+
+
async def test_close_noop(aconn, recwarn, retries):
async for retry in retries:
with retry: