]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix support for two phase commit in pg8000 dialect
authorTony Locke <tlocke@tlocke.org.uk>
Sun, 13 Jul 2014 21:38:39 +0000 (22:38 +0100)
committerTony Locke <tlocke@tlocke.org.uk>
Sat, 19 Jul 2014 19:20:12 +0000 (20:20 +0100)
The postgresql base dialect has problems with two-phase commit because
there isn't a standard way of handling autocommit in DBAPI. This commit
modifies the pg8000 dialect to use the DBAPI tpc extension, which is
supported by pg8000 as of version 1.9.11.

lib/sqlalchemy/dialects/postgresql/pg8000.py

index dc5ed6e73f522bd0b1efd07e4f80baca07f29fd3..dd63d7ea8a22f6910002cc6ebc9c6136e32dc0c6 100644 (file)
@@ -167,4 +167,23 @@ class PGDialect_pg8000(PGDialect):
                 (level, self.name, ", ".join(self._isolation_lookup))
                 )
 
+    def do_begin_twophase(self, connection, xid):
+        print("begin twophase", xid)
+        connection.connection.tpc_begin((0, xid, ''))
+
+    def do_prepare_twophase(self, connection, xid):
+        print("prepare twophase", xid)
+        connection.connection.tpc_prepare()
+
+    def do_rollback_twophase(
+            self, connection, xid, is_prepared=True, recover=False):
+        connection.connection.tpc_rollback((0, xid, ''))
+
+    def do_commit_twophase(
+            self, connection, xid, is_prepared=True, recover=False):
+        connection.connection.tpc_commit((0, xid, ''))
+
+    def do_recover_twophase(self, connection):
+        return [row[1] for row in connection.connection.tpc_recover()]
+
 dialect = PGDialect_pg8000