Re-implemented copyreg picklers/unpicklers for DAL and Reference classes (due to errors on sessions)

This commit is contained in:
gi0baro
2014-09-03 14:48:26 +02:00
parent 5e5e649c28
commit 625e4849ef
3 changed files with 29 additions and 3 deletions
+3 -1
View File
@@ -7,13 +7,15 @@ PY2 = sys.version_info[0] == 2
if PY2:
import cPickle as pickle
import cStringIO as StringIO
import copy_reg as copyreg
hashlib_md5 = hashlib.md5
else:
import pickle
from io import StringIO
import copyreg
hashlib_md5 = lambda s: hashlib.md5(bytes(s,'utf8'))
pjoin = os.path.join
exists = os.path.exists
ogetattr = object.__getattribute__
osetattr = object.__setattr__
osetattr = object.__setattr__
+11 -1
View File
@@ -142,7 +142,7 @@ import copy
import traceback
import glob
from ._compat import pickle, hashlib_md5, pjoin, ogetattr, osetattr
from ._compat import pickle, hashlib_md5, pjoin, ogetattr, osetattr, copyreg
from ._globals import GLOBAL_LOCKER, THREAD_LOCAL, LOGGER, DEFAULT
from ._load import have_serializers, serializers, is_jdbc, OrderedDict
from .helpers.classes import SQLCallableList
@@ -1081,3 +1081,13 @@ class DAL(object):
break
else:
raise RuntimeError("Unable to import table that does not exist.\nTry db.import_from_csv_file(..., map_tablenames={'table':'othertable'},ignore_missing_tables=True)")
def DAL_unpickler(db_uid):
return DAL('<zombie>', db_uid=db_uid)
def DAL_pickler(db):
return DAL_unpickler, (db._db_uid,)
copyreg.pickle(DAL, DAL_pickler, DAL_unpickler)
+15 -1
View File
@@ -1,8 +1,10 @@
# -*- coding: utf-8 -*-
import copy
import marshal
import struct
import traceback
from .._compat import exists
from .._compat import exists, copyreg
from .._globals import LOGGER
@@ -45,6 +47,18 @@ class Reference(long):
self.__allocate()
self._record[key] = value
def Reference_unpickler(data):
return marshal.loads(data)
def Reference_pickler(data):
try:
marshal_dump = marshal.dumps(long(data))
except AttributeError:
marshal_dump = 'i%s' % struct.pack('<i', long(data))
return (Reference_unpickler, (marshal_dump,))
copyreg.pickle(Reference, Reference_pickler, Reference_unpickler)
class SQLCallableList(list):
def __call__(self):