/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #ifndef OCEANBASE_SHARE_SCHEMA_OB_PRIV_MGR_H_ #define OCEANBASE_SHARE_SCHEMA_OB_PRIV_MGR_H_ #include #include "lib/hash/ob_pointer_hashmap.h" #include "lib/container/ob_vector.h" #include "lib/allocator/page_arena.h" #include "share/schema/ob_schema_struct.h" namespace oceanbase { namespace share { namespace schema { template struct ObGetTablePrivKeyV3 { void operator()(const T & t, const V &v) const { UNUSED(t); UNUSED(v); } }; template<> struct ObGetTablePrivKeyV3 { ObTablePrivSortKey operator()(const ObTablePriv *table_priv) const { ObTablePrivSortKey key; return NULL != table_priv ? table_priv->get_sort_key() : key; } }; template struct ObGetObjPrivKey { void operator()(const T & t, const V &v) const { UNUSED(t); UNUSED(v); } }; template<> struct ObGetObjPrivKey { ObObjPrivSortKey operator()(const ObObjPriv *obj_priv) const { ObObjPrivSortKey key; return NULL != obj_priv ? obj_priv->get_sort_key() : key; } }; class ObPrivMgr { typedef common::ObSortedVector DBPrivInfos; typedef common::ObSortedVector TablePrivInfos; typedef common::ObSortedVectorObjPrivInfos; typedef common::ObSortedVectorSysPrivInfos; typedef common::hash::ObPointerHashMap TablePrivMap; typedef common::hash::ObPointerHashMap ObjPrivMap; typedef DBPrivInfos::iterator DBPrivIter; typedef DBPrivInfos::const_iterator ConstDBPrivIter; typedef TablePrivInfos::iterator TablePrivIter; typedef TablePrivInfos::const_iterator ConstTablePrivIter; typedef SysPrivInfos::iterator SysPrivIter; typedef SysPrivInfos::const_iterator ConstSysPrivIter; typedef ObjPrivInfos::iterator ObjPrivIter; typedef ObjPrivInfos::const_iterator ConstObjPrivIter; public: ObPrivMgr(); explicit ObPrivMgr(common::ObIAllocator &allocator); virtual ~ObPrivMgr(); int init(); void reset(); ObPrivMgr &operator =(const ObPrivMgr &other); int assign(const ObPrivMgr &other); int deep_copy(const ObPrivMgr &other); void dump() const; // db priv int add_db_privs(const common::ObIArray &db_privs); int del_db_privs(const common::ObIArray &db_priv_keys); int add_db_priv(const ObDBPriv &db_priv); int del_db_priv(const ObOriginalDBKey &db_priv_key); int get_db_priv(const ObOriginalDBKey &db_priv_key, const ObDBPriv *&db_priv, bool db_is_pattern = false) const; int get_db_priv_set(const ObOriginalDBKey &db_priv_key, ObPrivSet &priv_set, bool is_pattern = false) const; // table priv int add_table_privs(const common::ObIArray &table_privs); int del_table_privs(const common::ObIArray &table_priv_keys); int add_table_priv(const ObTablePriv &table_priv); int del_table_priv(const ObTablePrivSortKey &table_priv_key); int get_table_priv(const ObTablePrivSortKey &table_priv_key, const ObTablePriv *&table_priv) const; int get_table_priv_set(const ObTablePrivSortKey &table_priv_key, ObPrivSet &priv_set) const; int table_grant_in_db(const uint64_t tenant_id, const uint64_t user_id, const common::ObString &db, bool &is_grant) const; //obj priv int add_obj_privs(const common::ObIArray &obj_privs); int del_obj_privs(const common::ObIArray &obj_priv_keys); int add_obj_priv(const ObObjPriv &obj_priv); int del_obj_priv(const ObObjPrivSortKey &obj_priv); int get_obj_priv(const ObObjPrivSortKey &obj_priv_key, const ObObjPriv *&obj_priv) const; int get_obj_privs_in_ur_and_obj( const uint64_t tenant_id, const ObObjPrivSortKey &obj_key, common::ObIArray &obj_privs) const; int get_obj_privs_in_ur_and_obj( const uint64_t tenant_id, const ObObjPrivSortKey &obj_key, ObPackedObjPriv &obj_privs) const; int get_obj_privs_in_grantor_ur_obj_id( const uint64_t tenant_id, const ObObjPrivSortKey &obj_key, common::ObIArray &obj_privs) const; int get_obj_privs_in_grantor_obj_id( const uint64_t tenant_id, const ObObjPrivSortKey &obj_key, common::ObIArray &obj_privs) const; //sys priv int add_sys_privs(const common::ObIArray &sys_privs); int del_sys_privs(const common::ObIArray &sys_priv_keys); int add_sys_priv(const ObSysPriv &sys_priv); int del_sys_priv(const ObSysPrivKey &db_priv_key); int get_sys_priv(const ObSysPrivKey &sys_priv_key, const ObSysPriv *&sys_priv) const; int get_sys_priv_array(const ObSysPrivKey &sys_priv_key, const ObPackedPrivArray &packed_priv_array) const; // other int get_db_privs_in_tenant(const uint64_t tenant_id, common::ObIArray &db_privs) const; int get_db_privs_in_user(const uint64_t tenant_id, const uint64_t user_id, common::ObIArray &db_privs) const; int get_table_privs_in_tenant(const uint64_t tenant_id, common::ObIArray &table_privs) const; int get_table_privs_in_user(const uint64_t tenant_id, const uint64_t user_id, common::ObIArray &table_privs) const; int get_obj_privs_in_tenant(const uint64_t tenant_id, common::ObIArray &obj_privs) const; int get_obj_privs_in_grantee(const uint64_t tenant_id, const uint64_t grantee_id, common::ObIArray &obj_privs) const; int get_obj_privs_in_grantor(const uint64_t tenant_id, const uint64_t grantor_id, common::ObIArray &obj_privs, bool reset_flag) const; int get_obj_privs_in_obj(const uint64_t tenant_id, const uint64_t obj_id, const uint64_t obj_type, common::ObIArray &obj_privs, bool reset_flag) const; int get_sys_privs_in_tenant(const uint64_t tenant_id, common::ObIArray &sys_privs) const; int get_sys_priv_in_grantee(const uint64_t tenant_id, const uint64_t grantee_id, ObSysPriv *& sys_priv) const; static const char *get_first_priv_name(ObPrivSet priv_set); static const char *get_priv_name(int64_t priv_shift); int get_priv_schema_count(int64_t &priv_scheam_count) const; int get_schema_statistics(const ObSchemaType schema_type, ObSchemaStatisticsInfo &schema_info) const; private: int get_db_priv_iter(const ObOriginalDBKey &db_key, DBPrivIter &target_db_priv_iter) const; int get_sys_priv_iter(const ObSysPrivKey &sys_key, SysPrivIter &target_sys_priv_iter) const; private: common::ObArenaAllocator local_allocator_; common::ObIAllocator &allocator_; DBPrivInfos db_privs_; TablePrivInfos table_privs_; TablePrivMap table_priv_map_; ObjPrivInfos obj_privs_; ObjPrivMap obj_priv_map_; SysPrivInfos sys_privs_; static const char *priv_names_[]; }; } //end of schema } //end of share } //end of oceanbase #endif //OB_OCEANBASE_SCHEMA_OB_PRIV_MGR_H_