From 15db7fb790f1ec3de58b2df4ae199be542f99775 Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Tue, 31 Mar 2009 21:46:17 +0000 Subject: [PATCH] Adding missing sqlite portion of alowry's patch from r5881 --- lib/sqlalchemy/dialects/sqlite/base.py | 27 +++++++++++++++++++++++++- test/dialect/sqlite.py | 15 ++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 5b40dcaa4d..5249e2a1f8 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -252,7 +252,32 @@ class SQLiteDialect(default.DefaultDialect): preparer = SQLiteIdentifierPreparer ischema_names = ischema_names colspecs = colspecs - + isolation_level = None + + def __init__(self, isolation_level=None, **kwargs): + default.DefaultDialect.__init__(self, **kwargs) + if isolation_level and isolation_level not in ('SERIALIZABLE', + 'READ UNCOMMITTED'): + raise exc.ArgumentError("Invalid value for isolation_level. " + "Valid isolation levels for sqlite are 'SERIALIZABLE' and " + "'READ UNCOMMITTED'.") + self.isolation_level = isolation_level + + def visit_pool(self, pool): + if self.isolation_level is not None: + class SetIsolationLevel(object): + def __init__(self, isolation_level): + if isolation_level == 'READ UNCOMMITTED': + self.isolation_level = 1 + else: + self.isolation_level = 0 + + def connect(self, conn, rec): + cursor = conn.cursor() + cursor.execute("PRAGMA read_uncommitted = %d" % self.isolation_level) + cursor.close() + pool.add_listener(SetIsolationLevel(self.isolation_level)) + def table_names(self, connection, schema): if schema is not None: qschema = self.identifier_preparer.quote_identifier(schema) diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py index 3a33f58ede..dae4a41a8c 100644 --- a/test/dialect/sqlite.py +++ b/test/dialect/sqlite.py @@ -270,6 +270,21 @@ class DialectTest(TestBase, AssertsExecutionResults): pass raise + def test_set_isolation_level(self): + """Test setting the read uncommitted/serializable levels""" + eng = create_engine(testing.db.url) + self.assertEquals(eng.execute("PRAGMA read_uncommitted").scalar(), 0) + + eng = create_engine(testing.db.url, isolation_level="READ UNCOMMITTED") + self.assertEquals(eng.execute("PRAGMA read_uncommitted").scalar(), 1) + + eng = create_engine(testing.db.url, isolation_level="SERIALIZABLE") + self.assertEquals(eng.execute("PRAGMA read_uncommitted").scalar(), 0) + + self.assertRaises(exc.ArgumentError, create_engine, testing.db.url, + isolation_level="FOO") + + class InsertTest(TestBase, AssertsExecutionResults): """Tests inserts and autoincrement.""" -- 2.47.3