"""Simple database module.
Authors: Valentyn Stadnytskyi
Date created: 2019-11-21
Date last modified: 2020-01-18
Comment: Friedrich Schotte: Create directory as needed when writing, use "makedirs" instead of "mkdir"
Python Version: 2.7 and 3.7
"""
from logging import debug,info,warning,error
__version__ = "1.5.7"
from pdb import pm
from threading import RLock
lock = RLock()
from os import getcwd
[docs]class DataBase():
[docs] def __init__(self,root,name):
"""
initializes the connection to the database.
Parameters
----------
root :: (string)
path or environment variable
name :: (string)
name of the database
Returns
-------
Examples
--------
>>> write()
"""
self.filename, self.root, self.name = self.get_filename(root,name)
self.database = self.read()
[docs] def get_filename(self,root,name):
"""
generates filename based on input root and name. There are few special keywords like TEMP, LOCAL that will obtain the locations of temporary and local directories. The function also ensures that the path is correct in different platforms.
Parameters
----------
root :: (string)
path or environment variable
name :: (string)
name of the database
Returns
-------
tuple :: (filename, root, name)
returns a tuple with 3 entries filename, root, name: (0) full filename (1) full path from the home directory; (2) the name of the file.
Examples
--------
>>> filename, root, name = get_filename(root, 'name.db')
"""
from platform import system
from os.path import join
name += '_db.py'
if root == "TEMP":
from tempfile import gettempdir
root = join(gettempdir(),'SavedProperty')
elif root == "LOCAL" or root == "":
from os import getcwd
root = join(getcwd(),'SavedProperty')
else:
root = join(root,'SavedProperty')
filename = join(root,name)
return filename, root, name
[docs] def read(self):
"""
reads the database file
Parameters
----------
Returns
-------
dictionary :: (dictionary)
returns a dictionary of all data in the database file.
Examples
--------
>>> data = read()
"""
import yaml
from os.path import exists
if exists(self.filename):
with lock:
with open(self.filename) as handle:
try:
data = yaml.safe_load(handle.read()) # (2)
return data
except yaml.YAMLError:
return {} # (3)
else:
return {}
[docs] def write(self):
"""
writes current dictionary saved in memory to the database file
Parameters
----------
Returns
-------
Examples
--------
>>> write()
"""
# Created directory if such doesn't exist
from os.path import dirname,exists
from os import makedirs
import yaml
directory = dirname(self.filename)
if not exists(directory):
makedirs(directory)
data = self.database
with lock:
with open(self.filename, 'w') as handle:
yaml.dump(data, handle)
[docs] def sync(self):
"""
reads the database file and updates the self.database variable accordingly.
Parameters
----------
Returns
-------
Examples
--------
>>> sync()
"""
self.database = self.read()
def close(self): # (4)
pass
[docs]class SavedProperty():
[docs] def __init__(self,db,name,value):
self.name = name
self.db = db
self.default_value = value
[docs] def init(self):
"""
wrapper that returns property object with get and set functions.
Parameters
----------
Returns
-------
Examples
--------
>>> from saved_property import DataBase, SavedProperty
>>> db = DataBase(root = '', name = 'simpledb')
>>> d = SavedProperty(db,'d',5.0).init()
"""
return property(self.get,self.set)
[docs] def set(self,name,value) :
"""
setter for SavedProperty. sets value in the database
Parameters
----------
value :: (object)
value saved to the database.
Returns
-------
Examples
--------
>>>
"""
self.db.database[self.name] = value
self.db.write()
[docs] def get(self,name):
"""
getter for SavedProperty. returns saved value if it exists in the database, otherwise returns default_value
Parameters
----------
Returns
-------
value :: (object)
returns a value stored with the selected key in the database
Examples
--------
>>>
"""
if self.name in list(self.db.database.keys()):
return self.db.database[self.name]
else:
return self.default_value