From 625e4849efc26920dbe19196c55f3d38d87f5fb9 Mon Sep 17 00:00:00 2001 From: gi0baro Date: Wed, 3 Sep 2014 14:48:26 +0200 Subject: [PATCH] Re-implemented copyreg picklers/unpicklers for DAL and Reference classes (due to errors on sessions) --- gluon/dal/_compat.py | 4 +++- gluon/dal/base.py | 12 +++++++++++- gluon/dal/helpers/classes.py | 16 +++++++++++++++- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gluon/dal/_compat.py b/gluon/dal/_compat.py index 10f61209..c38b1220 100644 --- a/gluon/dal/_compat.py +++ b/gluon/dal/_compat.py @@ -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__ \ No newline at end of file +osetattr = object.__setattr__ diff --git a/gluon/dal/base.py b/gluon/dal/base.py index bd60dcb0..eb9c95ce 100644 --- a/gluon/dal/base.py +++ b/gluon/dal/base.py @@ -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('', db_uid=db_uid) + + +def DAL_pickler(db): + return DAL_unpickler, (db._db_uid,) + +copyreg.pickle(DAL, DAL_pickler, DAL_unpickler) diff --git a/gluon/dal/helpers/classes.py b/gluon/dal/helpers/classes.py index 0150c45e..6fb93d28 100644 --- a/gluon/dal/helpers/classes.py +++ b/gluon/dal/helpers/classes.py @@ -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('