summaryrefslogtreecommitdiff
path: root/src/server/db_controller.py
diff options
context:
space:
mode:
authorAlon Levy <alon@pobox.com>2014-12-23 21:53:46 +0200
committerAlon Levy <alon@pobox.com>2014-12-23 22:03:17 +0200
commitf7ff8bc38410c2666665c4c70cc71c17f6eb7835 (patch)
tree458bd97cf23a2672102d85babe1deaa2ec581233 /src/server/db_controller.py
parent3e3944c42517a2745d9dd2312e8c3a571de41863 (diff)
use topo_diff for user input changes
pretty large commit, but it mainly boils to - reusing the same format clone returns to the client for topo_diff bad bad code introduced mainly in client side, but server wasn't spared: - graph/commit_topo__diff massages the links too much - this should not be there at all, it should be in the correct format to begin with. server code duplication between clone & topo_diff post processing, should be factored out on the good side: single transaction whenever user presses enter, and the correct place to send back any accumulated diffs (other user changes).
Diffstat (limited to 'src/server/db_controller.py')
-rw-r--r--src/server/db_controller.py42
1 files changed, 36 insertions, 6 deletions
diff --git a/src/server/db_controller.py b/src/server/db_controller.py
index fac4146a..b9e1ef8d 100644
--- a/src/server/db_controller.py
+++ b/src/server/db_controller.py
@@ -133,6 +133,8 @@ class DBO_topo_diff_commit(DB_composed_op):
l_rm_set = topo_diff.link_set_rm
n_rm_set = topo_diff.node_set_rm
+ self.n_add_map = len(n_add_map) > 0
+ self.l_add_map = len(l_add_map) > 0
#
# [!] order critical
#
@@ -152,6 +154,34 @@ class DBO_topo_diff_commit(DB_composed_op):
op = DBO_rm_node_set(n_rm_set)
self.add_sub_op(op)
+ def process_result_set(self):
+ ret_n_set = []
+ ret_l_set = []
+ it = iter(self)
+
+ if self.n_add_map:
+ for _, _, row_set in it.next():
+ for row in row_set:
+ n, n_lbl_set = row.items() # see query return statement
+
+ assert None != n.get('id'), "db contains nodes with no id"
+
+ n['__label_set'] = n_lbl_set
+ ret_n_set.append(n)
+
+ if self.l_add_map:
+ for _, _, l_set in it.next():
+ for l, l_src, l_dst, l_type in l_set:
+ l['__src_id'] = l_src
+ l['__dst_id'] = l_dst
+ l['__label_set'] = [l_type] # box single value returned by type()
+
+ ret_l_set.append(l)
+
+ return {'node_set': ret_n_set,
+ 'link_set': ret_l_set }
+
+
class DBO_attr_diff_commit(DB_op):
"""
commit a Attr_Diff
@@ -257,13 +287,13 @@ class DBO_add_node_set(DB_op):
self.add_statement(q, q_param_set)
def process_result_set(self):
- id_set = []
+ n_set = []
for _, _, row_set in self:
for row in row_set:
for clo in row:
- id_set.append(clo)
+ n_set.append(clo)
- return id_set
+ return n_set
class DBO_add_link_set(DB_op):
def __init__(self, link_map):
@@ -276,13 +306,13 @@ class DBO_add_link_set(DB_op):
self.add_statement(q, q_params)
def process_result_set(self):
- id_set = []
+ l_set = []
for _, _, r_set in self:
for row in r_set:
for col_val in row:
- id_set.append(col_val)
+ l_set.append(col_val)
- return id_set
+ return l_set
class DBO_load_node_set_by_DB_id(DB_op):
def __init__(self, id_set):