# -*- coding: utf-8 -*-
from __future__ import absolute_import
import os.path as osp
import six
import uuid
from capsul.engine.database import DatabaseEngine
from populse_db.database import Database
[docs]class PopulseDBEngine(DatabaseEngine):
def __init__(self, database_engine):
self.db = Database(database_engine)
with self.db as dbs:
if not dbs.get_collection('path_metadata'):
# Create the schema if it does not exist
dbs.add_collection('named_directory', 'name')
dbs.add_field('named_directory', 'path', 'string')
dbs.add_collection('json_value', 'name')
dbs.add_field('json_value', 'value', 'json')
dbs.add_collection('path_metadata', 'path')
dbs.add_field('path_metadata', 'named_directory', 'string',
description='Reference to a base directory whose '
'path is stored in named_directory collection')
#self.dbs = self.db.__enter__()
def __del__(self):
self.close()
def close(self):
#self.db.__exit__(None, None, None)
self.db = None
#self.dbs = None
def commit(self):
#self.dbs.save_modifications()
with self.db as dbs:
dbs.save_modifications()
def rollback(self):
#self.dbs.unsave_modifications()
with self.db as dbs:
dbs.unsave_modifications()
[docs] def set_named_directory(self, name, path):
if path:
path = osp.normpath(osp.abspath(path))
#doc = self.dbs.get_document('named_directory', name)
#if doc is None:
#if path:
#doc = {'name': name,
#'path': path}
#self.dbs.add_document('named_directory', doc)
#else:
#if path:
#self.dbs.set_value('named_directory', name, 'path', path)
#else:
#self.dbs.remove_document('named_directory', name)
with self.db as dbs:
doc = dbs.get_document('named_directory', name)
if doc is None:
if path:
doc = {'name': name,
'path': path}
dbs.add_document('named_directory', doc)
else:
if path:
dbs.set_value('named_directory', name, 'path', path)
else:
dbs.remove_document('named_directory', name)
[docs] def named_directory(self, name):
#return self.dbs.get_value('named_directory', name, 'path')
with self.db as dbs:
return dbs.get_value('named_directory', name, 'path')
[docs] def named_directories(self):
#return self.dbs.filter_documents('named_directory', 'all')
with self.db as dbs:
return dbs.filter_documents('named_directory', 'all')
[docs] def set_json_value(self, name, json_value):
#doc = self.dbs.get_document('json_value', name)
#json_dict = {'value': json_value}
#if doc is None:
#doc = {'name': name,
#'json_dict': json_dict
#}
#self.dbs.add_document('json_value', doc)
#else:
#self.dbs.set_value('json_value', name, 'json_dict', json_dict)
with self.db as dbs:
doc = dbs.get_document('json_value', name)
json_dict = {'value': json_value}
if doc is None:
doc = {'name': name,
'json_dict': json_dict
}
dbs.add_document('json_value', doc)
else:
dbs.set_value('json_value', name, 'json_dict', json_dict)
[docs] def json_value(self, name):
#doc = self.dbs.get_document('json_value', name)
#if doc:
#return doc['json_dict']['value']
#return None
with self.db as dbs:
doc = dbs.get_document('json_value', name)
if doc:
return doc['json_dict']['value']
return None