Merge pull request #494 from niphlod/fix/pickle_refactoring

refactored pickling of sessions
This commit is contained in:
mdipierro
2014-09-11 21:13:47 -05:00
2 changed files with 18 additions and 14 deletions

View File

@@ -31,12 +31,13 @@ An interactive, stateful AJAX shell that runs Python code on the server.
import logging
import new
import os
import cPickle
try:
import cPickle as pickle
except:
import pickle
import sys
import traceback
import types
import wsgiref.handlers
import StringIO
import threading
locker = threading.RLock()
@@ -100,7 +101,7 @@ class History:
name: the name of the global to remove
value: any picklable value
"""
blob = cPickle.dumps(value)
blob = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)
if name in self.global_names:
index = self.global_names.index(name)
@@ -159,7 +160,7 @@ def represent(obj):
code below to determine whether the object changes over time.
"""
try:
return cPickle.dumps(obj)
return pickle.dumps(obj, pickle.HIGHEST_PROTOCOL)
except:
return repr(obj)
@@ -258,7 +259,7 @@ def run(history, statement, env={}):
if not name.startswith('__'):
try:
history.set_global(name, val)
except (TypeError, cPickle.PicklingError), ex:
except (TypeError, pickle.PicklingError), ex:
UNPICKLABLE_TYPES.append(type(val))
history.add_unpicklable(statement, new_globals.keys())

View File

@@ -28,7 +28,10 @@ from gluon.settings import global_settings
from gluon import recfile
import hashlib
import portalocker
import cPickle
try:
import cPickle as pickle
except:
import pickle
from pickle import Pickler, MARK, DICT, EMPTY_DICT
from types import DictionaryType
import cStringIO
@@ -830,7 +833,7 @@ class Session(Storage):
portalocker.lock(response.session_file,
portalocker.LOCK_EX)
response.session_locked = True
self.update(cPickle.load(response.session_file))
self.update(pickle.load(response.session_file))
response.session_file.seek(0)
oc = response.session_filename.split('/')[-1].split('-')[0]
if check_client and response.session_client != oc:
@@ -895,7 +898,7 @@ class Session(Storage):
if row:
# rows[0].update_record(locked=True)
# Unpickle the data
session_data = cPickle.loads(row.session_data)
session_data = pickle.loads(row.session_data)
self.update(session_data)
response.session_new = False
else:
@@ -907,7 +910,7 @@ class Session(Storage):
else:
response.session_id = None
response.session_new = True
# if there is no session id yet, we'll need to create a
# if there is no session id yet, we'll need to create a
# new session
else:
response.session_new = True
@@ -925,7 +928,7 @@ class Session(Storage):
response.cookies[response.session_id_name]['expires'] = \
cookie_expires.strftime(FMT)
session_pickled = cPickle.dumps(self)
session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL)
response.session_hash = hashlib.md5(session_pickled).hexdigest()
if self.flash:
@@ -1084,7 +1087,7 @@ class Session(Storage):
return True
def _unchanged(self, response):
session_pickled = cPickle.dumps(self)
session_pickled = pickle.dumps(self, pickle.HIGHEST_PROTOCOL)
response.session_pickled = session_pickled
session_hash = hashlib.md5(session_pickled).hexdigest()
return response.session_hash == session_hash
@@ -1111,7 +1114,7 @@ class Session(Storage):
else:
unique_key = response.session_db_unique_key
session_pickled = response.session_pickled or cPickle.dumps(self)
session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL)
dd = dict(locked=False,
client_ip=response.session_client,
@@ -1152,7 +1155,7 @@ class Session(Storage):
portalocker.lock(response.session_file, portalocker.LOCK_EX)
response.session_locked = True
if response.session_file:
session_pickled = response.session_pickled or cPickle.dumps(self)
session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL)
response.session_file.write(session_pickled)
response.session_file.truncate()
finally: