--- /dev/null
+.. change::
+ :tags: bug, sqlite, regression
+ :tickets: 6586
+
+ The fix for pysqlcipher released in version 1.4.3 :ticket:`5848` was
+ unfortunately non-working, in that the new ``on_connect_url`` hook was
+ erroneously not receiving a ``URL`` object under normal usage of
+ :func:`_sa.create_engine` and instead received a string that was unhandled;
+ the test suite failed to fully set up the actual conditions under which
+ this hook is called. This has been fixed.
.. dialect:: sqlite+pysqlcipher
:name: pysqlcipher
:dbapi: sqlcipher 3 or pysqlcipher
- :connectstring: sqlite+pysqlcipher://:passphrase/file_path[?kdf_iter=<iter>]
+ :connectstring: sqlite+pysqlcipher://:passphrase@/file_path[?kdf_iter=<iter>]
Dialect for support of DBAPIs that make use of the
`SQLCipher <https://www.zetetic.net/sqlcipher>`_ backend.
engine = engineclass(pool, dialect, u, **engine_args)
if _initialize:
-
- do_on_connect = dialect.on_connect_url(url)
+ do_on_connect = dialect.on_connect_url(u)
if do_on_connect:
if _wrap_do_on_connect:
do_on_connect = _wrap_do_on_connect(do_on_connect)
)
)
+ @testing.only_on("sqlite+pysqlcipher")
+ def test_pysqlcipher_connects(self):
+ """test #6586"""
+ str_url = str(testing.db.url)
+ e = create_engine(str_url)
+
+ with e.connect() as conn:
+ eq_(conn.scalar(text("select 1")), 1)
+
@testing.provide_metadata
def test_extra_reserved_words(self, connection):
"""Tests reserved words in identifiers.
eq_(e.dialect.foobar, 5)
eq_(e.dialect.bathoho, False)
+ def test_on_connect_url(self):
+ """test #6586"""
+
+ tokens = __name__.split(".")
+
+ canary = mock.Mock()
+
+ class MyDialect(MockDialect):
+ def on_connect_url(self, url):
+ canary.on_connect_url(url)
+
+ global dialect
+ dialect = MyDialect
+ registry.register(
+ "mockdialect.ocu", ".".join(tokens[0:-1]), tokens[-1]
+ )
+
+ create_engine("mockdialect+ocu://foo:bar@host/test")
+ eq_(
+ canary.mock_calls,
+ [
+ mock.call.on_connect_url(
+ url.URL.create(
+ drivername="mockdialect+ocu",
+ username="foo",
+ password="bar",
+ host="host",
+ database="test",
+ )
+ )
+ ],
+ )
+
def test_custom(self):
dbapi = MockDBAPI(
foober=12, lala=18, hoho={"this": "dict"}, fooz="somevalue"