summaryrefslogtreecommitdiff
path: root/src-py/db_driver.py
diff options
context:
space:
mode:
Diffstat (limited to 'src-py/db_driver.py')
-rw-r--r--src-py/db_driver.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/src-py/db_driver.py b/src-py/db_driver.py
new file mode 100644
index 00000000..0532e512
--- /dev/null
+++ b/src-py/db_driver.py
@@ -0,0 +1,91 @@
+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)
+