|
@@ -5,31 +5,44 @@ import cPickle as pickle
|
|
|
import logging
|
|
|
import os
|
|
|
|
|
|
-class Storage:
|
|
|
- data = None
|
|
|
+from .basestorage import BaseStorage
|
|
|
+
|
|
|
+class Storage(BaseStorage):
|
|
|
+ """Provides file-based persistency for BaseStorage"""
|
|
|
|
|
|
def __init__(self, storage_dir):
|
|
|
self.logger = logging.getLogger('Storage')
|
|
|
self.storage_dir = storage_dir
|
|
|
|
|
|
self.logger.debug('Using storage at \'{0}\''.format(storage_dir))
|
|
|
- self.storage_file = open(os.path.join(storage_dir, 'storage.dat'), 'a+b')
|
|
|
+ self.storage_filename = os.path.join(storage_dir, 'storage.dat')
|
|
|
+
|
|
|
+ self.storage_file = None
|
|
|
+
|
|
|
+ def open(self):
|
|
|
+ self.storage_file = open(self.storage_filename, 'a+b')
|
|
|
try:
|
|
|
self.storage_file.seek(0, os.SEEK_SET)
|
|
|
self.data = pickle.load(self.storage_file)
|
|
|
+
|
|
|
except EOFError:
|
|
|
self.logger.warn('The storage file was empty. I\'ll assume this is the first start with this storage directory.')
|
|
|
+
|
|
|
except Exception as err:
|
|
|
self.logger.error('Loading the storage failed. Please resolve the error and/or remove the storage file \'{0}\': {1}'.format(
|
|
|
- os.path.join(storage_dir, self.storage_file.name),
|
|
|
+ self.storage_filename,
|
|
|
str(err),
|
|
|
))
|
|
|
raise err
|
|
|
+
|
|
|
if self.data is None:
|
|
|
self.data = {}
|
|
|
self.logger.info('Opened storage with ' + str(len(self.data)) + ' entries.')
|
|
|
|
|
|
def save(self):
|
|
|
+ if self.storage_file is None:
|
|
|
+ return
|
|
|
+
|
|
|
self.storage_file.seek(0, os.SEEK_SET)
|
|
|
self.storage_file.truncate()
|
|
|
pickle.dump(self.data, self.storage_file, protocol=2)
|
|
@@ -38,4 +51,5 @@ class Storage:
|
|
|
def close(self):
|
|
|
self.save()
|
|
|
self.storage_file.close()
|
|
|
+ self.storage_file = None
|
|
|
self.data = None
|