[Checkins] SVN: relstorage/trunk/ Fixed another minor compatibility issue with PostgreSQL 9.0. Packing

Shane Hathaway shane at hathawaymix.org
Wed Mar 2 16:51:24 EST 2011


Log message for revision 120706:
  Fixed another minor compatibility issue with PostgreSQL 9.0.  Packing
  raised an error when the client used old an version of libpq.
  

Changed:
  U   relstorage/trunk/CHANGES.txt
  U   relstorage/trunk/relstorage/adapters/mysql.py
  U   relstorage/trunk/relstorage/adapters/oracle.py
  U   relstorage/trunk/relstorage/adapters/packundo.py
  U   relstorage/trunk/relstorage/adapters/postgresql.py

-=-
Modified: relstorage/trunk/CHANGES.txt
===================================================================
--- relstorage/trunk/CHANGES.txt	2011-03-02 21:50:50 UTC (rev 120705)
+++ relstorage/trunk/CHANGES.txt	2011-03-02 21:51:23 UTC (rev 120706)
@@ -1,7 +1,8 @@
 Next Release
 ------------
 
-- ...
+- Fixed another minor compatibility issue with PostgreSQL 9.0.  Packing
+  raised an error when the client used old an version of libpq.
 
 1.5.0b2 (2011-03-02)
 --------------------

Modified: relstorage/trunk/relstorage/adapters/mysql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/mysql.py	2011-03-02 21:50:50 UTC (rev 120705)
+++ relstorage/trunk/relstorage/adapters/mysql.py	2011-03-02 21:51:23 UTC (rev 120706)
@@ -133,6 +133,7 @@
 
         if self.keep_history:
             self.packundo = MySQLHistoryPreservingPackUndo(
+                database_name='mysql',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,
@@ -144,6 +145,7 @@
                 )
         else:
             self.packundo = MySQLHistoryFreePackUndo(
+                database_name='mysql',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,

Modified: relstorage/trunk/relstorage/adapters/oracle.py
===================================================================
--- relstorage/trunk/relstorage/adapters/oracle.py	2011-03-02 21:50:50 UTC (rev 120705)
+++ relstorage/trunk/relstorage/adapters/oracle.py	2011-03-02 21:51:23 UTC (rev 120706)
@@ -128,6 +128,7 @@
 
         if self.keep_history:
             self.packundo = OracleHistoryPreservingPackUndo(
+                database_name='oracle',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,
@@ -139,6 +140,7 @@
                 )
         else:
             self.packundo = OracleHistoryFreePackUndo(
+                database_name='oracle',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,

Modified: relstorage/trunk/relstorage/adapters/packundo.py
===================================================================
--- relstorage/trunk/relstorage/adapters/packundo.py	2011-03-02 21:50:50 UTC (rev 120705)
+++ relstorage/trunk/relstorage/adapters/packundo.py	2011-03-02 21:51:23 UTC (rev 120706)
@@ -14,6 +14,7 @@
 """Pack/Undo implementations.
 """
 
+from base64 import decodestring
 from relstorage.adapters.interfaces import IPackUndo
 from ZODB.POSException import UndoError
 from zope.interface import implements
@@ -28,7 +29,8 @@
 
     verify_sane_database = False
 
-    def __init__(self, connmanager, runner, locker, options):
+    def __init__(self, database_name, connmanager, runner, locker, options):
+        self.database_name = database_name
         self.connmanager = connmanager
         self.runner = runner
         self.locker = locker
@@ -388,12 +390,20 @@
         """
         log.debug("pre_pack: transaction %d: computing references ", tid)
         from_count = 0
+        use_base64 = (self.database_name == 'postgresql')
 
-        stmt = """
-        SELECT zoid, state
-        FROM object_state
-        WHERE tid = %(tid)s
-        """
+        if use_base64:
+            stmt = """
+            SELECT zoid, encode(state, 'base64')
+            FROM object_state
+            WHERE tid = %(tid)s
+            """
+        else:
+            stmt = """
+            SELECT zoid, state
+            FROM object_state
+            WHERE tid = %(tid)s
+            """
         self.runner.run_script_stmt(cursor, stmt, {'tid': tid})
 
         replace_rows = []
@@ -404,9 +414,12 @@
                 # Oracle
                 state = state.read()
             if state:
+                state = str(state)
+                if use_base64:
+                    state = decodestring(state)
                 from_count += 1
                 try:
-                    to_oids = get_references(str(state))
+                    to_oids = get_references(state)
                 except:
                     log.error("pre_pack: can't unpickle "
                         "object %d in transaction %d; state length = %d" % (
@@ -964,14 +977,21 @@
 
         Returns the number of references added.
         """
-        to_count = 0
         oid_list = ','.join(str(oid) for oid in oids)
+        use_base64 = (self.database_name == 'postgresql')
 
-        stmt = """
-        SELECT zoid, tid, state
-        FROM object_state
-        WHERE zoid IN (%s)
-        """ % oid_list
+        if use_base64:
+            stmt = """
+            SELECT zoid, tid, encode(state, 'base64')
+            FROM object_state
+            WHERE zoid IN (%s)
+            """ % oid_list
+        else:
+            stmt = """
+            SELECT zoid, tid, state
+            FROM object_state
+            WHERE zoid IN (%s)
+            """ % oid_list
         self.runner.run_script_stmt(cursor, stmt)
 
         add_objects = []
@@ -982,8 +1002,11 @@
                 state = state.read()
             add_objects.append((from_oid, tid))
             if state:
+                state = str(state)
+                if use_base64:
+                    state = decodestring(state)
                 try:
-                    to_oids = get_references(str(state))
+                    to_oids = get_references(state)
                 except:
                     log.error("pre_pack: can't unpickle "
                         "object %d in transaction %d; state length = %d" % (

Modified: relstorage/trunk/relstorage/adapters/postgresql.py
===================================================================
--- relstorage/trunk/relstorage/adapters/postgresql.py	2011-03-02 21:50:50 UTC (rev 120705)
+++ relstorage/trunk/relstorage/adapters/postgresql.py	2011-03-02 21:51:23 UTC (rev 120706)
@@ -98,6 +98,7 @@
 
         if self.keep_history:
             self.packundo = HistoryPreservingPackUndo(
+                database_name='postgresql',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,
@@ -109,6 +110,7 @@
                 )
         else:
             self.packundo = HistoryFreePackUndo(
+                database_name='postgresql',
                 connmanager=self.connmanager,
                 runner=self.runner,
                 locker=self.locker,



More information about the checkins mailing list