static CfgNode * _get_commit_other_node(CfgNode *cfg1, CfgNode *cfg2, const Cpath& cur_path) { string name, value; bool not_tag_node, is_value, is_leaf_typeless; vector<CfgNode *> rcnodes1, rcnodes2; cnode::cmp_non_leaf_nodes(cfg1, cfg2, rcnodes1, rcnodes2, not_tag_node, is_value, is_leaf_typeless, name, value); if (!cfg1) { return _create_commit_cfg_node(*cfg2, cur_path, COMMIT_STATE_ADDED); } else if (!cfg2) { return _create_commit_cfg_node(*cfg1, cur_path, COMMIT_STATE_DELETED); } CfgNode *cn = _create_commit_cfg_node(*cfg1, cur_path, COMMIT_STATE_UNCHANGED); for (size_t i = 0; i < rcnodes1.size(); i++) { CfgNode *cnode = getCommitTree(rcnodes1[i], rcnodes2[i], cn->getCommitPath()); if (cnode) { cn->addChildNode(cnode); } } if (cn->numChildNodes() < 1) { delete cn; return NULL; } return cn; }
static void _set_node_commit_state(CfgNode& node, CommitState s, bool recursive) { node.setCommitState(s); if (recursive) { for (size_t i = 0; i < node.numChildNodes(); i++) { _set_node_commit_state(*(node.childAt(i)), s, recursive); } } }
static void _set_node_commit_path(CfgNode& node, const Cpath &p, bool recursive) { node.setCommitPath(p, node.isValue(), node.getValue(), node.getName()); if (recursive) { for (size_t i = 0; i < node.numChildNodes(); i++) { _set_node_commit_path(*(node.childAt(i)), node.getCommitPath(), recursive); } } }
static void _set_node_commit_create_failed(CfgNode& node) { // recursively top-down if (node.getCommitState() == COMMIT_STATE_ADDED) { // only set failure if the node is being created node.setCommitCreateFailed(); } for (size_t i = 0; i < node.numChildNodes(); i++) { _set_node_commit_create_failed(*(node.childAt(i))); } }
// nodes other than "changed" leaf nodes static CfgNode * _create_commit_cfg_node(CfgNode& cn, const Cpath& p, CommitState s) { CfgNode *node = new CfgNode(cn); _set_node_commit_state(*node, s, (s != COMMIT_STATE_UNCHANGED)); _set_node_commit_path(*node, p, (s != COMMIT_STATE_UNCHANGED)); if (s == COMMIT_STATE_UNCHANGED) { node->clearChildNodes(); } else { for (size_t i = 0; i < node->numChildNodes(); i++) { node->childAt(i)->setParent(node); } } return node; }