]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-105539: Emit ResourceWarning if sqlite3 database is not closed explicitly (#108015)
authorErlend E. Aasland <erlend@python.org>
Tue, 22 Aug 2023 11:10:29 +0000 (13:10 +0200)
committerGitHub <noreply@github.com>
Tue, 22 Aug 2023 11:10:29 +0000 (13:10 +0200)
Doc/library/sqlite3.rst
Doc/whatsnew/3.13.rst
Lib/test/test_sqlite3/test_dbapi.py
Misc/NEWS.d/next/Library/2023-08-16-14-30-13.gh-issue-105539.29lA6c.rst [new file with mode: 0644]
Modules/_sqlite/connection.c

index 5f1676e5ae2f562acf7be1958607af1e6a8e2a4d..d2745b0dbceb232cb06d6b1e080095c7aab065e7 100644 (file)
@@ -630,6 +630,12 @@ Connection objects
       * :ref:`sqlite3-connection-shortcuts`
       * :ref:`sqlite3-connection-context-manager`
 
+
+   .. versionchanged:: 3.13
+
+      A :exc:`ResourceWarning` is emitted if :meth:`close` is not called before
+      a :class:`!Connection` object is deleted.
+
    An SQLite database connection has the following attributes and methods:
 
    .. method:: cursor(factory=Cursor)
index bfab868d1c5b62a116351cab27c5fb7b39658153..8509e18a7d792e507e1d8e3e2d75b527699c3f79 100644 (file)
@@ -158,6 +158,13 @@ pathlib
   :meth:`~pathlib.Path.is_dir`.
   (Contributed by Barney Gale in :gh:`77609` and :gh:`105793`.)
 
+sqlite3
+-------
+
+* A :exc:`ResourceWarning` is now emitted if a :class:`sqlite3.Connection`
+  object is not :meth:`closed <sqlite3.Connection.close>` explicitly.
+  (Contributed by Erlend E. Aasland in :gh:`105539`.)
+
 tkinter
 -------
 
index df3c2ea8d1dbdabcffbd53e0218286d092ee3446..d80ad7af3200f0fe896abb69eb20e34eb69ee3b2 100644 (file)
@@ -583,6 +583,12 @@ class ConnectionTests(unittest.TestCase):
             cx.close()
         self.assertEqual(cm.filename, __file__)
 
+    def test_connection_resource_warning(self):
+        with self.assertWarns(ResourceWarning):
+            cx = sqlite.connect(":memory:")
+            del cx
+            gc_collect()
+
 
 class UninitialisedConnectionTests(unittest.TestCase):
     def setUp(self):
diff --git a/Misc/NEWS.d/next/Library/2023-08-16-14-30-13.gh-issue-105539.29lA6c.rst b/Misc/NEWS.d/next/Library/2023-08-16-14-30-13.gh-issue-105539.29lA6c.rst
new file mode 100644 (file)
index 0000000..0098c7f
--- /dev/null
@@ -0,0 +1,3 @@
+:mod:`sqlite3` now emits an :exc:`ResourceWarning` if a
+:class:`sqlite3.Connection` object is not :meth:`closed
+<sqlite3.connection.close>` explicitly. Patch by Erlend E. Aasland.
index 282855f886594098600dede005890614d5c5c390..e133977b28c378f0ba97117b61147859cce1b44d 100644 (file)
@@ -493,6 +493,14 @@ connection_finalize(PyObject *self)
     }
 
     /* Clean up if user has not called .close() explicitly. */
+    if (con->db) {
+        if (PyErr_ResourceWarning(self, 1, "unclosed database in %R", self)) {
+            /* Spurious errors can appear at shutdown */
+            if (PyErr_ExceptionMatches(PyExc_Warning)) {
+                PyErr_WriteUnraisable(self);
+            }
+        }
+    }
     if (connection_close(con) < 0) {
         if (teardown) {
             PyErr_Clear();