/* -*-C++-*- */
#ifndef COMMISC_H
#define COMMISC_H
/* -*-C++-*-
 *****************************************************************************
 *
 * File:         ComMisc.h
 * Description:  Miscellaneous global functions
 *
 * Created:      1/20/2010
 * Language:     C++
 *
 *
// @@@ 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 @@@
 *
 *
 *****************************************************************************
 */

#include "Platform.h"
#include "ComSmallDefs.h"
#include "NAString.h"

// schema names of pattern  "_%_" are reserved for internal system schemas.
NABoolean ComIsTrafodionReservedSchemaName(
                                           const NAString &schName);

// list of schemas that have been created as reserved schemas.
NABoolean ComIsTrafodionReservedSchema(
                                       const NAString &systemCatalog,
                                       const NAString &catName,
                                       const NAString &schName);

// schema names of pattern "_HV_ ... _" and "_HB_ ... _" are reserved to store
// external hive and hbase tables.
// If isHive is passed in, then it is set to TRUE if this is a hive schema,
// and set to FALSE otherwise.
NABoolean ComIsTrafodionExternalSchemaName (
     const NAString &schName,
     NABoolean * isHive = NULL);

NABoolean ComIsHbaseMappedSchemaName (const NAString &schName);

// external format of an HBase mapped table used by 
// users: HBASE."_MAP_".<tablename>
NABoolean ComIsHBaseMappedExtFormat(const NAString &catName,
                                    const NAString &schName);

// internal format of HBase mapped table as stored in traf
// metadata: TRAFODION."_HB_MAP_".<tablename>
NABoolean ComIsHBaseMappedIntFormat(const NAString &catName,
                                    const NAString &schName);

void ComConvertHBaseMappedIntToExt(const NAString &inCatName,
                                   const NAString &inSchName,
                                   NAString &outCatName, 
                                   NAString &outSchName);

void ComConvertHBaseMappedExtToInt(const NAString &inCatName,
                                   const NAString &inSchName,
                                   NAString &outCatName, 
                                   NAString &outSchName);

NAString ComConvertNativeNameToTrafName ( 
                                         const NAString &catalogName,
                                         const NAString &schemaName,
                                         const NAString &objectName);

NAString ComConvertTrafNameToNativeName(
                                         const NAString &catalogName,
                                         const NAString &schemaName,
                                         const NAString &objectName);

// returns TRUE if specified name is a reserved name.
// Currently, reserved names for traf internal usage are:
//   SYSKEY
//   _SALT_
//   _DIVISION_*_   :_DIVISION_ prefix followed by division number and ending
//                   with underscore(_)
NABoolean ComTrafReservedColName(const NAString &colName);

#endif // COMMISC_H
