1
0
Fork 0

datastore: support custom knodes instead of nemubotstate

This commit is contained in:
nemunaire 2017-08-20 21:17:08 +02:00 committed by Pierre-Olivier Mercier
parent 5cbad96492
commit d528746cb5
3 changed files with 30 additions and 8 deletions

View File

@ -32,16 +32,20 @@ class Abstract:
def close(self):
return
def load(self, module):
def load(self, module, knodes):
"""Load data for the given module
Argument:
module -- the module name of data to load
knodes -- the schema to use to load the datas
Return:
The loaded data
"""
if knodes is not None:
return None
return self.new()
def save(self, module, data):

View File

@ -83,27 +83,38 @@ class XML(Abstract):
return os.path.join(self.basedir, module + ".xml")
def load(self, module):
def load(self, module, knodes):
"""Load data for the given module
Argument:
module -- the module name of data to load
knodes -- the schema to use to load the datas
"""
data_file = self._get_data_file_path(module)
if knodes is None:
from nemubot.tools.xmlparser import parse_file
def _true_load(path):
return parse_file(path)
else:
from nemubot.tools.xmlparser import XMLParser
p = XMLParser(knodes)
def _true_load(path):
return p.parse_file(path)
# Try to load original file
if os.path.isfile(data_file):
from nemubot.tools.xmlparser import parse_file
try:
return parse_file(data_file)
return _true_load(data_file)
except xml.parsers.expat.ExpatError:
# Try to load from backup
for i in range(10):
path = data_file + "." + str(i)
if os.path.isfile(path):
try:
cnt = parse_file(path)
cnt = _true_load(path)
logger.warn("Restoring from backup: %s", path)
@ -112,7 +123,7 @@ class XML(Abstract):
continue
# Default case: initialize a new empty datastore
return Abstract.load(self, module)
return super().load(module, knodes)
def _rotate(self, path):
"""Backup given path
@ -143,6 +154,9 @@ class XML(Abstract):
if self.rotate:
self._rotate(path)
if data is None:
return
import tempfile
_, tmpath = tempfile.mkstemp()
with open(tmpath, "w") as f:

View File

@ -16,7 +16,7 @@
class _ModuleContext:
def __init__(self, module=None):
def __init__(self, module=None, knodes=None):
self.module = module
if module is not None:
@ -30,12 +30,16 @@ class _ModuleContext:
from nemubot.config.module import Module
self.config = Module(self.module_name)
self._knodes = knodes
def load_data(self):
from nemubot.tools.xmlparser import module_state
return module_state.ModuleState("nemubotstate")
def set_knodes(self, knodes):
self._knodes = knodes
def add_hook(self, hook, *triggers):
from nemubot.hooks import Abstract as AbstractHook
assert isinstance(hook, AbstractHook), hook
@ -112,7 +116,7 @@ class ModuleContext(_ModuleContext):
def load_data(self):
return self.context.datastore.load(self.module_name)
return self.context.datastore.load(self.module_name, self._knodes)
def add_hook(self, hook, *triggers):
from nemubot.hooks import Abstract as AbstractHook