mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	gh-92547: Remove deprecated sqlite3 features (#92548)
The following sqlite3 features were deprecated in 3.10, scheduled for removal in 3.12: - sqlite3.OptimizedUnicode (gh-23163) - sqlite3.enable_shared_cache (gh-24008) Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com> Signed-off-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
This commit is contained in:
		
							parent
							
								
									9b50585e02
								
							
						
					
					
						commit
						00f22e8cc2
					
				
					 8 changed files with 16 additions and 121 deletions
				
			
		|  | @ -107,6 +107,15 @@ Deprecated | ||||||
| Removed | Removed | ||||||
| ======= | ======= | ||||||
| 
 | 
 | ||||||
|  | * The following undocumented :mod:`sqlite3` features, deprecated in Python | ||||||
|  |   3.10, are now removed: | ||||||
|  | 
 | ||||||
|  |   * ``sqlite3.enable_shared_cache()`` | ||||||
|  |   * ``sqlite3.OptimizedUnicode`` | ||||||
|  | 
 | ||||||
|  |   (Contributed by Erlend E. Aasland in :gh:`92548`) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| Porting to Python 3.12 | Porting to Python 3.12 | ||||||
| ====================== | ====================== | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,17 +55,3 @@ | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
| from sqlite3.dbapi2 import * | from sqlite3.dbapi2 import * | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # bpo-42264: OptimizedUnicode was deprecated in Python 3.10.  It's scheduled |  | ||||||
| # for removal in Python 3.12. |  | ||||||
| def __getattr__(name): |  | ||||||
|     if name == "OptimizedUnicode": |  | ||||||
|         import warnings |  | ||||||
|         msg = (""" |  | ||||||
|             OptimizedUnicode is deprecated and will be removed in Python 3.12. |  | ||||||
|             Since Python 3.3 it has simply been an alias for 'str'. |  | ||||||
|         """) |  | ||||||
|         warnings.warn(msg, DeprecationWarning, stacklevel=2) |  | ||||||
|         return str |  | ||||||
|     raise AttributeError(f"module 'sqlite3' has no attribute '{name}'") |  | ||||||
|  |  | ||||||
|  | @ -82,20 +82,6 @@ def convert_timestamp(val): | ||||||
| 
 | 
 | ||||||
| register_adapters_and_converters() | register_adapters_and_converters() | ||||||
| 
 | 
 | ||||||
| # bpo-24464: enable_shared_cache was deprecated in Python 3.10.  It's |  | ||||||
| # scheduled for removal in Python 3.12. |  | ||||||
| def enable_shared_cache(enable): |  | ||||||
|     from _sqlite3 import enable_shared_cache as _old_enable_shared_cache |  | ||||||
|     import warnings |  | ||||||
|     msg = ( |  | ||||||
|         "enable_shared_cache is deprecated and will be removed in Python 3.12. " |  | ||||||
|         "Shared cache is strongly discouraged by the SQLite 3 documentation. " |  | ||||||
|         "If shared cache must be used, open the database in URI mode using" |  | ||||||
|         "the cache=shared query parameter." |  | ||||||
|     ) |  | ||||||
|     warnings.warn(msg, DeprecationWarning, stacklevel=2) |  | ||||||
|     return _old_enable_shared_cache(enable) |  | ||||||
| 
 |  | ||||||
| # Clean up namespace | # Clean up namespace | ||||||
| 
 | 
 | ||||||
| del(register_adapters_and_converters) | del(register_adapters_and_converters) | ||||||
|  |  | ||||||
|  | @ -344,15 +344,6 @@ def test_extended_error_code_on_exception(self): | ||||||
|                              sqlite.SQLITE_CONSTRAINT_CHECK) |                              sqlite.SQLITE_CONSTRAINT_CHECK) | ||||||
|             self.assertEqual(exc.sqlite_errorname, "SQLITE_CONSTRAINT_CHECK") |             self.assertEqual(exc.sqlite_errorname, "SQLITE_CONSTRAINT_CHECK") | ||||||
| 
 | 
 | ||||||
|     # sqlite3_enable_shared_cache() is deprecated on macOS and calling it may raise |  | ||||||
|     # OperationalError on some buildbots. |  | ||||||
|     @unittest.skipIf(sys.platform == "darwin", "shared cache is deprecated on macOS") |  | ||||||
|     def test_shared_cache_deprecated(self): |  | ||||||
|         for enable in (True, False): |  | ||||||
|             with self.assertWarns(DeprecationWarning) as cm: |  | ||||||
|                 sqlite.enable_shared_cache(enable) |  | ||||||
|             self.assertIn("dbapi.py", cm.filename) |  | ||||||
| 
 |  | ||||||
|     def test_disallow_instantiation(self): |     def test_disallow_instantiation(self): | ||||||
|         cx = sqlite.connect(":memory:") |         cx = sqlite.connect(":memory:") | ||||||
|         check_disallow_instantiation(self, type(cx("select 1"))) |         check_disallow_instantiation(self, type(cx("select 1"))) | ||||||
|  |  | ||||||
|  | @ -256,18 +256,6 @@ def test_custom(self): | ||||||
|         self.assertEqual(type(row[0]), str, "type of row[0] must be unicode") |         self.assertEqual(type(row[0]), str, "type of row[0] must be unicode") | ||||||
|         self.assertTrue(row[0].endswith("reich"), "column must contain original data") |         self.assertTrue(row[0].endswith("reich"), "column must contain original data") | ||||||
| 
 | 
 | ||||||
|     def test_optimized_unicode(self): |  | ||||||
|         # OptimizedUnicode is deprecated as of Python 3.10 |  | ||||||
|         with self.assertWarns(DeprecationWarning) as cm: |  | ||||||
|             self.con.text_factory = sqlite.OptimizedUnicode |  | ||||||
|         self.assertIn("factory.py", cm.filename) |  | ||||||
|         austria = "Österreich" |  | ||||||
|         germany = "Deutchland" |  | ||||||
|         a_row = self.con.execute("select ?", (austria,)).fetchone() |  | ||||||
|         d_row = self.con.execute("select ?", (germany,)).fetchone() |  | ||||||
|         self.assertEqual(type(a_row[0]), str, "type of non-ASCII row must be str") |  | ||||||
|         self.assertEqual(type(d_row[0]), str, "type of ASCII-only row must be str") |  | ||||||
| 
 |  | ||||||
|     def tearDown(self): |     def tearDown(self): | ||||||
|         self.con.close() |         self.con.close() | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | Remove undocumented :mod:`sqlite3` features deprecated in Python 3.10: | ||||||
|  | 
 | ||||||
|  | * ``sqlite3.enable_shared_cache()`` | ||||||
|  | * ``sqlite3.OptimizedUnicode`` | ||||||
|  | 
 | ||||||
|  | Patch by Erlend E. Aasland. | ||||||
							
								
								
									
										42
									
								
								Modules/_sqlite/clinic/module.c.h
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										42
									
								
								Modules/_sqlite/clinic/module.c.h
									
										
									
										generated
									
									
									
								
							|  | @ -158,46 +158,6 @@ exit: | ||||||
|     return return_value; |     return return_value; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| PyDoc_STRVAR(pysqlite_enable_shared_cache__doc__, |  | ||||||
| "enable_shared_cache($module, /, do_enable)\n" |  | ||||||
| "--\n" |  | ||||||
| "\n" |  | ||||||
| "Enable or disable shared cache mode for the calling thread.\n" |  | ||||||
| "\n" |  | ||||||
| "This method is deprecated and will be removed in Python 3.12.\n" |  | ||||||
| "Shared cache is strongly discouraged by the SQLite 3 documentation.\n" |  | ||||||
| "If shared cache must be used, open the database in URI mode using\n" |  | ||||||
| "the cache=shared query parameter."); |  | ||||||
| 
 |  | ||||||
| #define PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF    \ |  | ||||||
|     {"enable_shared_cache", _PyCFunction_CAST(pysqlite_enable_shared_cache), METH_FASTCALL|METH_KEYWORDS, pysqlite_enable_shared_cache__doc__}, |  | ||||||
| 
 |  | ||||||
| static PyObject * |  | ||||||
| pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable); |  | ||||||
| 
 |  | ||||||
| static PyObject * |  | ||||||
| pysqlite_enable_shared_cache(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames) |  | ||||||
| { |  | ||||||
|     PyObject *return_value = NULL; |  | ||||||
|     static const char * const _keywords[] = {"do_enable", NULL}; |  | ||||||
|     static _PyArg_Parser _parser = {NULL, _keywords, "enable_shared_cache", 0}; |  | ||||||
|     PyObject *argsbuf[1]; |  | ||||||
|     int do_enable; |  | ||||||
| 
 |  | ||||||
|     args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 1, 1, 0, argsbuf); |  | ||||||
|     if (!args) { |  | ||||||
|         goto exit; |  | ||||||
|     } |  | ||||||
|     do_enable = _PyLong_AsInt(args[0]); |  | ||||||
|     if (do_enable == -1 && PyErr_Occurred()) { |  | ||||||
|         goto exit; |  | ||||||
|     } |  | ||||||
|     return_value = pysqlite_enable_shared_cache_impl(module, do_enable); |  | ||||||
| 
 |  | ||||||
| exit: |  | ||||||
|     return return_value; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PyDoc_STRVAR(pysqlite_register_adapter__doc__, | PyDoc_STRVAR(pysqlite_register_adapter__doc__, | ||||||
| "register_adapter($module, type, caster, /)\n" | "register_adapter($module, type, caster, /)\n" | ||||||
| "--\n" | "--\n" | ||||||
|  | @ -334,4 +294,4 @@ skip_optional: | ||||||
| exit: | exit: | ||||||
|     return return_value; |     return return_value; | ||||||
| } | } | ||||||
| /*[clinic end generated code: output=d846459943008a9c input=a9049054013a1b77]*/ | /*[clinic end generated code: output=43aa4f4356f9269d input=a9049054013a1b77]*/ | ||||||
|  |  | ||||||
|  | @ -105,36 +105,6 @@ pysqlite_complete_statement_impl(PyObject *module, const char *statement) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /*[clinic input]
 |  | ||||||
| _sqlite3.enable_shared_cache as pysqlite_enable_shared_cache |  | ||||||
| 
 |  | ||||||
|     do_enable: int |  | ||||||
| 
 |  | ||||||
| Enable or disable shared cache mode for the calling thread. |  | ||||||
| 
 |  | ||||||
| This method is deprecated and will be removed in Python 3.12. |  | ||||||
| Shared cache is strongly discouraged by the SQLite 3 documentation. |  | ||||||
| If shared cache must be used, open the database in URI mode using |  | ||||||
| the cache=shared query parameter. |  | ||||||
| [clinic start generated code]*/ |  | ||||||
| 
 |  | ||||||
| static PyObject * |  | ||||||
| pysqlite_enable_shared_cache_impl(PyObject *module, int do_enable) |  | ||||||
| /*[clinic end generated code: output=259c74eedee1516b input=26e40d5971d3487d]*/ |  | ||||||
| { |  | ||||||
|     int rc; |  | ||||||
| 
 |  | ||||||
|     rc = sqlite3_enable_shared_cache(do_enable); |  | ||||||
| 
 |  | ||||||
|     if (rc != SQLITE_OK) { |  | ||||||
|         pysqlite_state *state = pysqlite_get_state(module); |  | ||||||
|         PyErr_SetString(state->OperationalError, "Changing the shared_cache flag failed"); |  | ||||||
|         return NULL; |  | ||||||
|     } else { |  | ||||||
|         Py_RETURN_NONE; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /*[clinic input]
 | /*[clinic input]
 | ||||||
| _sqlite3.register_adapter as pysqlite_register_adapter | _sqlite3.register_adapter as pysqlite_register_adapter | ||||||
| 
 | 
 | ||||||
|  | @ -277,7 +247,6 @@ static PyMethodDef module_methods[] = { | ||||||
|     PYSQLITE_COMPLETE_STATEMENT_METHODDEF |     PYSQLITE_COMPLETE_STATEMENT_METHODDEF | ||||||
|     PYSQLITE_CONNECT_METHODDEF |     PYSQLITE_CONNECT_METHODDEF | ||||||
|     PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF |     PYSQLITE_ENABLE_CALLBACK_TRACE_METHODDEF | ||||||
|     PYSQLITE_ENABLE_SHARED_CACHE_METHODDEF |  | ||||||
|     PYSQLITE_REGISTER_ADAPTER_METHODDEF |     PYSQLITE_REGISTER_ADAPTER_METHODDEF | ||||||
|     PYSQLITE_REGISTER_CONVERTER_METHODDEF |     PYSQLITE_REGISTER_CONVERTER_METHODDEF | ||||||
|     {NULL, NULL} |     {NULL, NULL} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Erlend Egeberg Aasland
						Erlend Egeberg Aasland