43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
# Python imports
|
|
import os
|
|
import json
|
|
from distutils.dir_util import mkpath
|
|
|
|
# Lib imports
|
|
|
|
|
|
# Application imports
|
|
from .KeyValueDb import KeyValueDb, Key, Value
|
|
|
|
|
|
class KeyValueJsonDb(KeyValueDb[Key, Value]):
|
|
"""
|
|
Key-value JSON database
|
|
Use open() method to load DB from a file and commit() to save it
|
|
"""
|
|
|
|
def open(self) -> 'KeyValueJsonDb':
|
|
"""Create a new data base or open existing one"""
|
|
if os.path.exists(self._name):
|
|
if not os.path.isfile(self._name):
|
|
raise IOError("%s exists and is not a file" % self._name)
|
|
|
|
try:
|
|
with open(self._name, 'r') as _in:
|
|
self.set_records(json.load(_in))
|
|
except json.JSONDecodeError:
|
|
self.commit()
|
|
else:
|
|
mkpath(os.path.dirname(self._name))
|
|
self.commit()
|
|
|
|
return self
|
|
|
|
def commit(self) -> 'KeyValueJsonDb':
|
|
""" Write the database to a file... """
|
|
with open(self._name, 'w') as out:
|
|
json.dump(self._records, out, indent=4)
|
|
out.close()
|
|
|
|
return self
|