Source code for linesman.backends.pickle
# This file is part of linesman.
#
# linesman is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# linesman is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with linesman. If not, see <http://www.gnu.org/licenses/>.
#
import cPickle
import logging
from linesman.backends.base import Backend
try:
# Python 2.7+
from collections import OrderedDict
except ImportError: #pragma no cover
# Python 2.4+
from ordereddict import OrderedDict
log = logging.getLogger(__name__)
[docs]class PickleBackend(Backend):
"""
Stores entire session as a pickled object. This can be extremely slow when
using even smaller sets of sessions--on the order of 30mb, or around 200
requests.
"""
def __init__(self, filename="sessions.dat"):
self.filename = filename
def _flush(self):
"""
Writes the session history to disk, in pickled form.
"""
with open(self.filename, "w+b") as pickle_fd:
cPickle.dump(self._session_history,
pickle_fd,
cPickle.HIGHEST_PROTOCOL)
[docs] def setup(self):
"""
Reads in pickled data from ``filename``.
"""
try:
with open(self.filename, "rb") as pickle_fd:
self._session_history = cPickle.load(pickle_fd)
except IOError:
log.debug(
"`%s' does not exist; creating new dictionary.",
self.filename)
self._session_history = OrderedDict()
except ValueError:
log.error("Could not unpickle `%s`; this is likely not "
"recoverable. Please delete this file and start "
"from scratch.", self.filename)
raise
[docs] def add(self, session):
"""
Adds a session to this dictionary and flushes it to disk.
"""
self._session_history[session.uuid] = session
self._flush()
[docs] def delete(self, session_uuid):
"""
Remove a session from the dictionary and flush it to disk.
"""
if self.get(session_uuid):
del self._session_history[session_uuid]
self._flush()
return 1
return 0
[docs] def delete_many(self, session_uuids):
"""
Remove the sessions from the dictionary and flush it to disk.
"""
count = 0
for session_uuid in session_uuids:
if session_uuid in self._session_history:
del self._session_history[session_uuid]
count += 1
self._flush()
return count
[docs] def delete_all(self):
"""
Clear the entire session history and flush it to disk.
"""
deleted_rows = len(self._session_history)
self._session_history.clear()
self._flush()
return deleted_rows
[docs] def get(self, session_uuid):
return self._session_history.get(session_uuid)
[docs] def get_all(self):
return self._session_history.copy()