###################################################################
# Copyright 2013-2014 All Rights Reserved
# Authors: The Paradrop Team
###################################################################
import os
import pickle
from twisted.internet.task import LoopingCall
from paradrop.base.output import out
from paradrop.base import pdutils
from paradrop.lib.utils import pdos
[docs]class PDStorage(object):
"""
ParaDropStorage class.
This class is designed to be implemented by other classes.
Its purpose is to make whatever data is considered important persistant to disk.
The implementer can override functions in order to implement this class:
getAttr() : Get the attr we need to save to disk
setAttr() : Set the attr we got from disk
importAttr(): Takes a payload and returns the properly formatted data
exportAttr(): Takes the data and returns a payload
attrSaveable(): Returns True if we should save this attr
"""
def __init__(self, filename, saveTimer):
self.filename = filename
self.saveTimer = saveTimer
# Setup looping call to keep chute list perisistant
if (self.saveTimer > 0):
self.repeater = LoopingCall(self.saveToDisk)
self.repeater.start(self.saveTimer)
[docs] def loadFromDisk(self):
"""Attempts to load the data from disk.
Returns True if success, False otherwise."""
if(pdos.exists(self.filename)):
deleteFile = False
data = ""
try:
pyld = pickle.load(pdos.open(self.filename, 'rb'))
self.setAttr(self.importAttr(pyld))
return True
except Exception as e:
out.err('Error loading from disk: %s\n' % (str(e)))
deleteFile = True
# Delete the file
if(deleteFile):
try:
pdos.unlink(self.filename)
except Exception as e:
out.err('Error unlinking %s\n' % (self.filename))
return False
[docs] def saveToDisk(self):
"""Saves the data to disk."""
out.info('Saving to disk (%s)\n' % (self.filename))
# Make sure they want to save
if(not self.attrSaveable()):
return
# Get whatever the data is
pyld = self.exportAttr(self.getAttr())
# Write the file to disk, truncate if it exists
try:
with open(self.filename, 'wb') as output:
pickle.dump(pyld, output)
os.fsync(output.fileno())
except Exception as e:
out.err('Error writing to disk %s\n' % (str(e)))
[docs] def attrSaveable(self):
"""THIS SHOULD BE OVERRIDEN BY THE IMPLEMENTER."""
return False
[docs] def importAttr(self, pyld):
"""By default do nothing, but expect that this function could be overwritten"""
return pyld
[docs] def exportAttr(self, data):
"""By default do nothing, but expect that this function could be overwritten"""
return data