]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Adding missing sqlite portion of alowry's patch from r5881
authorJason Kirtland <jek@discorporate.us>
Tue, 31 Mar 2009 21:46:17 +0000 (21:46 +0000)
committerJason Kirtland <jek@discorporate.us>
Tue, 31 Mar 2009 21:46:17 +0000 (21:46 +0000)
lib/sqlalchemy/dialects/sqlite/base.py
test/dialect/sqlite.py

index 5b40dcaa4dc30fb93dd04e1fa0d2d3a8671e57ab..5249e2a1f880154de88284c43031e45ff5411a32 100644 (file)
@@ -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)
index 3a33f58edeb2df471de0a4a420023c8d1d5ed139..dae4a41a8c4875be41b59f9763d6eec5a65dd6ec 100644 (file)
@@ -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."""