[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