import logging from neo4j_util import Neo4JException import neo4j_util as db_util log = logging.getLogger('rhizi') class DB_Driver_Base(): def log_committed_queries(self, statement_set): for sp_dict in statement_set['statements']: if None != sp_dict['parameters']: msg = '\tq: {0}\n\tp: {1}'.format(sp_dict['statement'], sp_dict['parameters']) else: msg = '\tq: {0}'.format(sp_dict['statement']) log.debug(msg) class DB_Driver_Embedded(DB_Driver_Base): def __init__(self, db_base_url): self.tx_base_url = db_base_url + '/db/data/transaction' from org.rhizi.db.neo4j.util import EmbeddedNeo4j self.edb = EmbeddedNeo4j.createDb() self.edb.createDb() def begin_tx(self, op): pass def exec_statement_set(self, op): s_set = op.statement_set self.edb.executeCypherQury() def commit_tx(self, op): pass class DB_Driver_REST(DB_Driver_Base): def __init__(self, db_base_url): self.tx_base_url = db_base_url + '/db/data/transaction' def begin_tx(self, op): tx_open_url = self.tx_base_url try: # # [!] neo4j seems picky about receiving an additional empty statement list # data = data = db_util.statement_set_to_REST_form([]) ret = db_util.post_neo4j(tx_open_url, data) tx_commit_url = ret['commit'] op.parse_tx_id(tx_commit_url) log.debug('tx-open: id: {0}, commit-url: {1}'.format(op.tx_id, tx_commit_url)) except Exception as e: raise Exception('failed to open transaction:' + e.message) def exec_statement_set(self, op): tx_url = "{0}/{1}".format(self.tx_base_url, op.tx_id) statement_set = db_util.statement_set_to_REST_form(op.statement_set) try: post_ret = db_util.post_neo4j(tx_url, statement_set) op.result_set = post_ret['results'] op.error_set = post_ret['errors'] if 0 != len(op.error_set): raise Neo4JException(op.error_set) self.log_committed_queries(statement_set) except Neo4JException as e: raise e except Exception as e: raise Exception('failed exec op statements: err: {0}, url: {1}'.format(e.message, tx_url)) def commit_tx(self, op): tx_commit_url = "{0}/{1}/commit".format(self.tx_base_url, op.tx_id) try: # # [!] neo4j seems picky about receiving an additional empty statement list # data = db_util.statement_set_to_REST_form([]) ret = db_util.post(tx_commit_url, data) log.debug('tx-commit: id: {0}, commit-url: {1}'.format(op.tx_id, tx_commit_url)) return ret except Exception as e: raise Exception('failed to commit transaction:' + e.message)