/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
/* -*-C++-*-
 *****************************************************************************
 *
 * File:         CmpCommon.h
 * Description:  The error/memory/exception handling routines for SQL compiler
 *               components.
 *
 * Created:      8/29/96
 * Language:     C++
 *
 *
 *
 *****************************************************************************
 */


#ifndef CMPCOMMON_H
#define CMPCOMMON_H

#define ARKCMP_PRIVATE

// Forward references -- preceding any #include's that might actually define
// them, because there appear to be circular dependencies somewhere.
class ComDiagsArea;

#include "Platform.h"
#include "ComDiags.h"
#include "ComTransInfo.h"       
#include "ComObjectName.h"       
#include "DefaultConstants.h"
#include "EHException.h"
#include "NAAssert.h"

// CmpContext contains the global information for arkcmp, defined in arkcmp

enum CompilationMode { STMT_STATIC, STMT_DYNAMIC };

class NAMemory;
class CmpContext;
class CmpContextInfo;
class CmpStatement;

// For ComDiagsArea and memory handling, use the following static functions 
// in CmpCommon.

class CmpCommon
{
public:

  // To get the current ComDiagsArea*, use diags(). This area will be 
  // cleanup up in the beginning of the statement compilation. In the
  // case of CMPASSERT called, an internal error ComCondition will be
  // put into the diags() with the file name and line number specified.

  static ComDiagsArea* diags();

  // This routine dumps all diags messages in CmpCommon::diags() out to a given ostream.
 
  static void dumpDiags(ostream&, NABoolean newline = FALSE);

  // Some notes about memory management
  // arkcmp (compiler main program) maintains two kind of heaps, 
  // contextHeap and statementHeap.
  // For variables that will stay accross the statements, they should
  // be allocated in the contextHeap, because statementHeap will be
  // wiped out at the end of statement to avoid memory leak. arkcmp looks like
  //
  // main()
  // { contextHeap;
  //    for each statement
  //      {
  //         contextHeap->init();
  //         statementHeap;
  //          .....
  //         contextHeap->cleanup(); 
  //      }  the statementHeap is deleted at this point
  // }
  //
  // Note 1: If there are storages (variables) need to be initialized,
  //         or cleaned up, put them into init() and cleanup() routines.
  // Note 2: VERY IMPORTANT
  //         e.g. an instance of class A is in the scope of contextHeap
  //         class A { char* p; }, 
  //         - if p is allocated in the scope of statementHeap ( which will
  //           be deleted in the end of statement), it can not be deleted in 
  //           the the next statement loop. The suggestion will be delete p
  //           in cleanup(), or if you need to use p for next statement, put
  //           it into the scope of contextHeap (i.e. new(contextHeap) char[])
  //
  // To avoid memory leak, most of the variables should be allocated from
  // statementHeap, so that they will be wiped at the end of each statement.
  // Only very few should be put into contextHeap, then delete has to be
  // performed to avoid memory leak.
  // **IMPORTANT NOTE** : The memory allocated from this heap should be 
  // deleted accordingly when not in use, otherwise memory leak.
  //  **IMPORTANT NOTE** : The variables allocated through this heap can not
  // be reused in next statement, otherwise memory fault. 
  // To allocate the space for contextHeap, use the overloaded new with
  // CmpCommon::contextHeap() as the NAMemory*, 
  // To allocate the space for statementHeap, use the overloaded new with
  // CmpCommon::statementHeap() as the NAMemory*
  // use global new/delete will get the space from global new/delete.
  // for more information about the usage of new/delete, see sqlcomp/NAHeap.h

  // These #defines are just to make coding a little less crowded, more clear.
  // "HEAP" is a synonym for STMTHEAP, a default as it were, for the most
  // commonly new'd-from heap.

  #define CTXTHEAP	(CmpCommon::contextHeap())
  #define STMTHEAP	(CmpCommon::statementHeap())
  #define HEAP		STMTHEAP			// the commonest case

  static NAMemory * contextHeap();
  static NAHeap * statementHeap();

  #define CURRENTSTMT (CmpCommon::statement())
  #define CURRSTMT_OPTGLOBALS  (CmpCommon::statement()->getOptGlobals())
  #define CURRSTMT_CQSWA  (CmpCommon::statement()->getCqsWA())
  #define CURRCONTEXT_OPTDEBUG (CmpCommon::context()->getOptDbg())
  #define CURRCONTEXT_HISTCACHE (CmpCommon::context()->getHistogramCache())
  #define CURRCONTEXT_OPTSIMULATOR (CmpCommon::context()->getOptimizerSimulator())
  #define GLOBAL_EMPTY_INPUT_LOGPROP (CmpCommon::statement()->getGEILP())
  #define CURRSTMT_OPTDEFAULTS (CmpCommon::context()->getOptDefaults())

  // For some routines that do care about the current CmpContext*. 
  // If you need to declare some global/static variables in the scope of
  // context, put them into CmpContext class. (arkcmp/CmpContext.[Ch])
  // To access the variables in current Context, use
  // CmpCommon::context()->...
  static CmpContext* context();

  #define CURRENTQCACHE (CmpCommon::context()->getQueryCache())
  #define CURROPTPCODECACHE (CmpCommon::context()->getOptPCodeCache() )

  #define GlobalRuleSet (CmpCommon::context()->getRuleSet())

  // The following functions allow access to the defaults table
  // in sqlcomp/NADefaults.cpp.  Given the id number of the default,
  // the first returns the value as a double (-1 if invalid),
  // the second puts the NORMALIZED (trimmed, upcased) string representation
  // into 'result' and returns the Token
  // (DF_ON, etc.; negative if not a known Token, in which case an error diag
  // is emitted if errOrWarn is -1, a warning if +1, no diag if 0).
  // The third one doesn't have the overhead of returning the value
  // as a string. This one should be used most of the time.
  //
  static Lng32         getDefaultLong(DefaultConstants id);
  static double        getDefaultNumeric(DefaultConstants id);
  static NAString       getDefaultString(DefaultConstants id);
  static DefaultToken getDefault(DefaultConstants id,
  				 NAString &result,
				 Int32 errOrWarn =-1);
  static DefaultToken getDefault(DefaultConstants id,
				 Int32 errOrWarn = -1);
  static NABoolean wantCharSetInference();

  static void applyDefaults(ComObjectName &name);

  // The current statement under process. 
  // If you need to declare some global/static variables in the scope of
  // statement, put them into CmpStatement (arkcmp/CmpStatement.[Ch])
  // To access the variables in current statement, use
  // CmpCommon::statement()->....
  static CmpStatement* statement();

  // The TransMode for the current statement.  Was in generator.cpp previously.
  static TransMode * transMode(); 

  static const NAString * getControlSessionValue(const NAString &token);
};

// For exception handling, use CMPASSERT, CMPBREAK and CMPABORT macros

// CMPASSERT is used in the case of internal error. It will
// put an internal error into the global diags area (the diags that
// arkcmp passes into each routine) with the file name and line specified. 
// Clean up the statement heap and wait for next statement 
// request if possible.
// Notice this *always* asserts something, even if NDEBUG is TRUE.
//
#define CMPASSERT(b)                                                    \
  { if (!(b)) CmpAssertInternal("" # b "", __FILE__, __LINE__); }

#define CMPASSERT_STRING(b,str)                         \
  { if (!(b)) { cerr << str << endl; CMPASSERT(b); }}

// The following DCMPASSERT is for supporting an assert mechanism for the
// compiler that gets disabled in RELEASE (NDEBUG) code:
//
#ifndef NDEBUG
#define DCMPASSERT(x)	 CMPASSERT(x); 

#else
  #define DCMPASSERT(x) 
#endif

#define CMPBREAK CMPASSERT(FALSE)

// CMPABORT will just exit the program. It is used in the case of
// server error, so the program (process) can not continue anymore.
//
#define CMPABORT            CmpAbortInternal("", __FILE__, __LINE__);
#define CMPABORT_MSG(b)     CmpAbortInternal(b, __FILE__, __LINE__);

extern ARKCMP_PRIVATE void CmpAssertInternal(const char*, const char*, Int32);
extern ARKCMP_PRIVATE void CmpAbortInternal(const char*, const char*, Int32);
extern THREAD_P ARKCMP_PRIVATE CmpContext* cmpCurrentContext;

extern THREAD_P ARKCMP_PRIVATE jmp_buf* ExportJmpBufPtr;
extern THREAD_P ARKCMP_PRIVATE jmp_buf* CmpInternalErrorJmpBufPtr;

extern void deinitializeArkcmp();

#endif
