backend/wbpublic/grtdb/role_tree_model.h (106 lines of code) (raw):

/* * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2.0, * as published by the Free Software Foundation. * * This program is designed to work with certain software (including * but not limited to OpenSSL) that is licensed under separate terms, as * designated in a particular file or component or in included license * documentation. The authors of MySQL hereby grant you an additional * permission to link the program and your derivative works with the * separately licensed software that they have either included with * the program or referenced in the documentation. * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See * the GNU General Public License, version 2.0, for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _ROLE_TREE_MODEL_H_ #define _ROLE_TREE_MODEL_H_ #include "grt/tree_model.h" #include "grts/structs.db.h" #include "wbpublic_public_interface.h" namespace bec { class WBPUBLICBACKEND_PUBLIC_FUNC RoleTreeBE : public TreeModel { public: enum Columns { Enabled, Name }; protected: struct Node { Node *parent; db_RoleRef role; std::vector<Node *> children; Node() : parent(NULL) { } ~Node() { for (std::vector<Node *>::iterator iter = children.begin(); iter != children.end(); ++iter) delete *iter; } void insert_child_after(Node *after, Node *child) { if (after == NULL) children.push_back(child); else { std::vector<Node *>::iterator insert_point = std::find(children.begin(), children.end(), after); if (insert_point == children.end()) children.push_back(child); else children.insert(insert_point, child); } child->parent = this; if (role.is_valid()) { if (after) role->childRoles().insert(child->role, role->childRoles().get_index(after->role)); else role->childRoles().insert(child->role, role->childRoles().count() - 1); } child->role->parentRole(this->role); } void insert_child_before(Node *before, Node *child) { if (before == NULL) { children.push_back(child); } else { std::vector<Node *>::iterator insert_point = std::find(children.begin(), children.end(), before); if (insert_point == children.end()) children.push_back(child); else children.insert(insert_point, child); } child->parent = this; if (role.is_valid()) { if (before) role->childRoles().insert(child->role, role->childRoles().get_index(before->role)); else role->childRoles().insert(child->role); } child->role->parentRole(this->role); } void append_child(Node *child) { children.push_back(child); child->parent = this; // If this is the hidden root node then no child roles list exists (the role is just a dummy). if (role.is_valid()) role->childRoles().insert(child->role); child->role->parentRole(this->role); } void erase_child(Node *child) { std::vector<Node *>::iterator erase_point = std::find(children.begin(), children.end(), child); if (erase_point != children.end()) { children.erase(erase_point); child->parent = NULL; } // If the current parent is the hidden root node then there is no childRoles collection. if (role.is_valid()) role->childRoles().remove_value(child->role); child->role->parentRole(db_RoleRef()); } }; db_CatalogRef _catalog; Node *_root; std::string _object_id; virtual bool get_field_grt(const NodeId &node, ColumnId column, grt::ValueRef &value); virtual grt::Type get_field_type(const NodeId &node, ColumnId column); virtual bool set_field(const NodeId &node, ColumnId column, const std::string &value); Node *get_node_with_id(const NodeId &node); bool find_role(const RoleTreeBE::Node *node, const db_RoleRef &role, bec::NodeId &path); void add_role_children_to_node(Node *parent_node); bool is_parent_child(Node *parent, Node *child); public: RoleTreeBE(const db_CatalogRef &catalog); void set_object(const db_DatabaseObjectRef &object); virtual ~RoleTreeBE(); virtual void refresh(); virtual size_t count_children(const NodeId &parent); virtual NodeId get_child(const NodeId &parent, size_t index); db_RoleRef get_role_with_id(const NodeId &node) { Node *n = get_node_with_id(node); return (n ? n->role : db_RoleRef()); } NodeId node_id_for_role(const db_RoleRef &role); void erase_node(const NodeId &node); void insert_node_after(const NodeId &after, const NodeId &node); void insert_node_before(const NodeId &before, const NodeId &node); void append_child(const NodeId &parent, const NodeId &child); void move_to_top_level(const NodeId &node); }; }; #endif