Re-implemented copyreg picklers/unpicklers for DAL and Reference classes (due to errors on sessions)
This commit is contained in:
@@ -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
@@ -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)
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user