//*****************************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
//
//// @@@ END COPYRIGHT @@@
//*****************************************************************************

#ifndef PRIVMGR_MD_DEFS_H
#define PRIVMGR_MD_DEFS_H


// *****************************************************************************
// *
// * File:         PrivMgrMDDef.h
// * Description:  This file contains definitions of all the objects managed
// *               by the privilege manager component
// *
// *****************************************************************************

// List of tables that make up the privilege manager component
#define PRIVMGR_OBJECT_PRIVILEGES "OBJECT_PRIVILEGES"
#define PRIVMGR_COLUMN_PRIVILEGES "COLUMN_PRIVILEGES"
#define PRIVMGR_COMPONENTS "COMPONENTS"
#define PRIVMGR_COMPONENT_OPERATIONS "COMPONENT_OPERATIONS"
#define PRIVMGR_COMPONENT_PRIVILEGES "COMPONENT_PRIVILEGES"
#define PRIVMGR_ROLE_USAGE "ROLE_USAGE"
#define PRIVMGR_SCHEMA_PRIVILEGES "SCHEMA_PRIVILEGES"

enum PrivMgrTableEnum { OBJECT_PRIVILEGES_ENUM = 30,
                        COLUMN_PRIVILEGES_ENUM = 31,
                        SCHEMA_PRIVIELGES_ENUM = 32,
                        COMPONENTS_ENUM        = 33,
                        COMPONENT_OPERATIONS_ENUM  = 34,
                        COMPONENT_PRIVILEGES_ENUM  = 35,
                        ROLE_USAGES_ENUM           = 36,
                        OBJECTS_ENUM               = 37,
                        UNKNOWN_ENUM               = 38
                      };

// The TableDDLString is used to contain the CREATE text for privilege manager
// metadata tables
struct TableDDLString {
public:
  const char * str;
};

// The PrivMgrTableStruct is used to describe a privilege manager metadata 
// table
struct PrivMgrTableStruct
{
  const char * tableName;
  const TableDDLString * tableDDL;
  const bool isIndex;
};

// Trafodion creates HBase tables that concatenate the catalog, schema, and
// object name together.  The max HBase name can only be 255.  As long as
// we create Trafodion objects in HBase the same way, the object_name variables
// stored in the PrivMgr tables cannot exceed 255.  If we decide to change
// our naming convention, this size could change. 
  
// the following TableDDLStrings describe each metadata tables
static const TableDDLString columnPrivilegesDDL[] =
{" ( \
   object_uid largeint not null, \
   object_name varchar(600 bytes) character set utf8 not null, \
   grantee_id int not null, \
   grantee_name varchar(256 bytes) character set utf8 not null, \
   grantor_id int not null, \
   grantor_name varchar(256 bytes) character set utf8 not null, \
   column_number int not null, \
   privileges_bitmap largeint not null, \
   grantable_bitmap largeint not null, \
   primary key (object_uid, grantee_id, grantor_id, column_number) \
   ) attribute hbase format;" };

static const TableDDLString componentsDDL[] =
{" ( \
   component_uid largeint not null primary key, \
   component_name varchar(128 bytes) character set ISO88591 not null, \
   is_system char(2) not null, \
   component_description varchar(80 bytes) character set ISO88591 default null \
   )  attribute hbase format;" };

static const TableDDLString componentOperationsDDL[] =
{ " ( \
  component_uid largeint not null , \
  operation_code char(2 bytes) character set ISO88591 not null, \
  operation_name varchar(256 bytes) character set ISO88591 not null, \
  is_system char(2) not null, \
  operation_description char(80 bytes) character set ISO88591 default null, \
  primary key (component_uid, operation_code) \
  ) attribute hbase format;" };

static const TableDDLString componentPrivilegesDDL[] = 
{ " ( \
  grantee_id int not null, \
  grantor_id int not null, \
  component_uid largeint not null, \
  operation_code char(2 bytes) character set ISO88591 not null, \
  grantee_name varchar(256 bytes) character set utf8 not null, \
  grantor_name varchar(256 bytes) character set utf8 not null, \
  grant_depth int not null, \
  primary key (grantee_id, grantor_id, component_uid, operation_code) \
  ) attribute hbase format;" };

static const TableDDLString objectPrivilegesDDL[] = 
{ " ( \
  object_uid largeint not null, \
  object_name varchar(600 bytes) character set utf8 not null, \
  object_type char (2 bytes)not null, \
  grantee_id largeint not null, \
  grantee_name varchar(256 bytes) character set utf8 not null, \
  grantee_type char (2 bytes) not null, \
  grantor_id largeint not null, \
  grantor_name varchar(256 bytes) character set utf8 not null, \
  grantor_type char (2 bytes) not null, \
  privileges_bitmap largeint not null, \
  grantable_bitmap largeint not null, \
  primary key (object_uid, grantor_id, grantee_id) \
  ) attribute hbase format;" };

static const TableDDLString roleUsageDDL[] = 
{ " ( \
  role_id int not null, \
  role_name varchar(256 bytes) character set utf8 not null, \
  grantee_id int not null, \
  grantee_name varchar(256 bytes) character set utf8 not null, \
  grantee_auth_class char (2 bytes) character set utf8 not null, \
  grantor_id int not null, \
  grantor_name varchar(256 bytes) character set utf8 not null, \
  grantor_auth_class char (2 bytes) character set utf8 not null, \
  grant_depth int not null, \
  primary key (role_id, grantor_id, grantee_id) \
  ) attribute hbase format;" };
  
static const TableDDLString schemaPrivilegesDDL[] = 
{ " ( \
  schema_uid largeint not null, \
  schema_name varchar(600 bytes) character set utf8 not null, \
  grantee_id int not null, \
  grantee_name varchar(256 bytes) character set utf8 not null, \
  grantor_id int not null, \
  grantor_name varchar(256 bytes) character set utf8 not null, \
  privileges_bitmap largeint not null, \
  grantable_bitmap largeint not null, \
  primary key (schema_uid, grantor_id, grantee_id) \
  ) attribute hbase format;" };

// The PrivMgrTableStruct describes each table
static const PrivMgrTableStruct privMgrTables[] =
  { { PRIVMGR_OBJECT_PRIVILEGES, objectPrivilegesDDL, false }, 
    { PRIVMGR_COLUMN_PRIVILEGES, columnPrivilegesDDL, false },
    { PRIVMGR_COMPONENTS, componentsDDL, false },
    { PRIVMGR_COMPONENT_OPERATIONS, componentOperationsDDL, false },
    { PRIVMGR_COMPONENT_PRIVILEGES, componentPrivilegesDDL, false },
    { PRIVMGR_ROLE_USAGE, roleUsageDDL, false },
    { PRIVMGR_SCHEMA_PRIVILEGES, schemaPrivilegesDDL, false } 
  };


#endif // PRIVMGR_MD_DEFS_H









