From a08cd3e8ffe57823d8f9b80abdf82f873455fdb1 Mon Sep 17 00:00:00 2001 From: mdipierro Date: Tue, 27 Aug 2013 15:55:01 -0500 Subject: [PATCH] monkey_patched_pickle --- VERSION | 2 +- gluon/globals.py | 4 +++- gluon/monkey_patch_pickle.py | 9 +++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 gluon/monkey_patch_pickle.py diff --git a/VERSION b/VERSION index 2e7f1fff..35e184c6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Version 2.6.0-development+timestamp.2013.08.27.06.33.47 +Version 2.6.0-development+timestamp.2013.08.27.15.54.04 diff --git a/gluon/globals.py b/gluon/globals.py index 9d4e8bb9..1adf63b1 100644 --- a/gluon/globals.py +++ b/gluon/globals.py @@ -23,11 +23,13 @@ from http import HTTP, redirect from fileutils import up from serializers import json, custom_json import settings +import monkey_patch_pickle from utils import web2py_uuid, secure_dumps, secure_loads from settings import global_settings import hashlib import portalocker import cPickle +import pickle import cStringIO import datetime import re @@ -977,7 +979,7 @@ class Session(Storage): if not previous_session_hash and not \ any(value is not None for value in self.itervalues()): return True - session_pickled = cPickle.dumps(dict(self)) + session_pickled = pickle.dumps(dict(self)) # requires monkey patched pickle session_hash = hashlib.md5(session_pickled).hexdigest() if previous_session_hash == session_hash: return True diff --git a/gluon/monkey_patch_pickle.py b/gluon/monkey_patch_pickle.py new file mode 100644 index 00000000..ff186523 --- /dev/null +++ b/gluon/monkey_patch_pickle.py @@ -0,0 +1,9 @@ +from pickle import Pickler, MARK, DICT, EMPTY_DICT +from types import DictionaryType + +def save_dict(self, obj): + self.write(EMPTY_DICT if self.bin else MARK+DICT) + self.memoize(obj) + self._batch_setitems([(key,obj[key]) for key in sorted(obj)]) + +Pickler.dispatch[DictionaryType] = save_dict