Skip to content

Commit 9ff1eb5

Browse files
fix: Track connection closed state internally
The is_connected property was relying on ping() to determine if a connection was closed, but MySQLdb's ping() may succeed even after close() is called. Now tracks connection state with _is_closed flag that is: - Set to True in __init__ (before connect) - Set to False after successful connect() - Set to True in close() - Checked first in is_connected before attempting ping() Fixes test_connection_context_manager, test_connection_context_manager_exception, and test_close failures.
1 parent ddca0ed commit 9ff1eb5

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

src/datajoint/connection.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ def __init__(
177177
self.init_fun = init_fun
178178
self._conn = None
179179
self._query_cache = None
180+
self._is_closed = True # Mark as closed until connect() succeeds
180181

181182
# Select adapter based on configured backend
182183
backend = config["database.backend"]
@@ -228,6 +229,7 @@ def connect(self) -> None:
228229
)
229230
else:
230231
raise
232+
self._is_closed = False # Mark as connected after successful connection
231233

232234
def set_query_cache(self, query_cache: str | None = None) -> None:
233235
"""
@@ -255,7 +257,9 @@ def purge_query_cache(self) -> None:
255257

256258
def close(self) -> None:
257259
"""Close the database connection."""
258-
self._conn.close()
260+
if self._conn is not None:
261+
self._conn.close()
262+
self._is_closed = True
259263

260264
def __enter__(self) -> "Connection":
261265
"""
@@ -329,9 +333,12 @@ def is_connected(self) -> bool:
329333
bool
330334
True if connected.
331335
"""
336+
if self._is_closed:
337+
return False
332338
try:
333339
self.ping()
334340
except:
341+
self._is_closed = True
335342
return False
336343
return True
337344

0 commit comments

Comments
 (0)