
// @@@ 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 CONTEXT_H
#define CONTEXT_H

/* -*-C++-*-
 *****************************************************************************
 *
 * File:         Context.h
 * Description:  CLI context. A CLI context is an entire execution environment
 *               for an SQL client (including a user id, transactions,
 *               prepared statements, cursor states, etc). Right now
 *               (December 1999) we only support a single context.
 *
 * Created:      7/10/95
 * Language:     C++
 *
 *
 *
 *
 *****************************************************************************
 */


#include "Platform.h"
#include "CliDefs.h"
#include "ComDiags.h"
#include "DllExportDefines.h"
#include "CliSemaphore.h"
#include "sqlcli.h"
#include "Statement.h"
#include "ex_god.h"
#include "timeout_data.h" 
#include "Module.h"
#include "Globals.h"
#include "NAUserId.h"
#include "SessionDefaults.h"
#include "ex_transaction.h"
#include "CmpCommon.h"
#include "ExSqlComp.h"
#include "ExStats.h"
#include "ExpSeqGen.h"
#include "ssmpipc.h"
#include "hdfs.h"
#include "HdfsClient_JNI.h"

class CliGlobals;
class HashQueue;
class Queue;
class ExSqlComp;
class ExStatisticsArea;
class ExControlArea;
class ExUdrServer;
class UdrContextMsg;
class SequenceValueGenerator;
class LmRoutine;
class ContextCli : public ExGod {
  
public:
  enum ArkcmpFailMode { arkcmpIS_OK_ = FALSE/*no failure*/,
			arkcmpWARN_,
			arkcmpERROR_ };

  enum CloseCursorType {
    CLOSE_ALL,       // close all non-holdable cursors 
    CLOSE_ALL_INCLUDING_ANSI_PUBSUB_HOLDABLE,  // close all cursors including pubsub and ansi holdable cursors 
    CLOSE_ALL_INCLUDING_ANSI_HOLDABLE, // close all non-holdable cursors and ansi holdable cursors
    CLOSE_ALL_INCLUDING_PUBSUB_HOLDABLE, // close all non-holdable cursors and pubsub holdable cursors
    CLOSE_ALL_INCLUDING_ANSI_PUBSUB_HOLDABLE_WHEN_CQD // close all incl AHC holdable cursors and pubsub holdable cursors
                                                      // when CQD PSHOLD_CLOSE_ON_ROLLBACK
  };

  enum closeTransactionType {
    CLOSE_ALL_XN,   // close cursors belonging to any transaction
    CLOSE_CURR_XN,  // close only those that are part of current transaction
    CLOSE_ENDED_XN  // close those cursors whose
                    // associated xns are no longer active
  };

  SQLCTX_HANDLE getContextHandle() { return contextHandle_; }

  // Accessor functions to retrieve the current user name and ID
  const char *getDatabaseUserName() { return databaseUserName_;}
  Int32 *getDatabaseUserID() { return &databaseUserID_; }
  Int32 *getSessionUserID() { return &sessionUserID_; }
  
  // Functions to switch user identity. The specified user must exist
  // as a valid user in the USERS metadata table. Otherwise an error
  // code is returned and error conditions will be written to the
  // context's diagnostics area. These functions are only supported on
  // Linux.
  RETCODE setDatabaseUserByID(Int32 userID);
  RETCODE setDatabaseUserByName(const char *userName);

  void setDatabaseUser(const Int32 &uid, // IN
                       const char *uname);   // IN

  // Functions to map between Trafodion authentication IDs and names. 
  RETCODE getAuthIDFromName(
     const char *authName,  
     Int32 & authID);   
  
  RETCODE getAuthNameFromID(
     Int32 authID,         // IN
     char *authNameBuffer, // OUT
     Int32 maxBufLen,      // IN
     Int32 &requiredLen);   // OUT optional
  RETCODE getDBUserNameFromID(Int32 userID,         // IN
                              char *userNameBuffer, // OUT
                              Int32 maxBufLen,      // IN
                              Int32 *requiredLen);  // OUT
  RETCODE getDBUserIDFromName(const char *userName, // IN
                              Int32 *userID);       // OUT

  // Function to be used only in ESPs to establish user identity. This
  // call will update data members and will NOT verify the input
  // arguments by querying the USERS table.
  void setDatabaseUserInESP(const Int32 &uid, const char *uname,
                            bool closeAllOpens = false);

  char * getExternalUserName() { return externalUsername_; }

  char * userSpecifiedSessionName() { return userSpecifiedSessionName_; }
  void setUserSpecifiedSessionName(const char * un) 
  { 
    strcpy(userSpecifiedSessionName_, un);
  }

  void setAuthStateInCmpContexts(NABoolean authEnabled,
                                 NABoolean authReady);

  void getAuthState (bool &authenticationEnabled,
                     bool &authorizationEnabled,
                     bool &authorizationReady,
                     bool &auditingEnabled);


  // functions to get and set roles for the current user
  RETCODE getRoleList(Int32  &numRoles,
                      Int32  *&roleIDs);

  RETCODE resetRoleList();

  SequenceValueGenerator* &seqGen() { return seqGen_; }

  HashQueue * trafSElist() { return trafSElist_; }

  inline void incStmtReclaimCount()
  {
    stmtReclaimCount_++;
    if (processStats_ != NULL) 
       processStats_->incReclaimStmtCount();
  }

  inline void decStmtReclaimCount() 
  {
    stmtReclaimCount_--;
    if (processStats_ != NULL) 
       processStats_->decReclaimStmtCount();
  }

  inline void incCloseStmtListSize()
  {
    closeStmtListSize_--;
    if (processStats_ != NULL)
       processStats_->incCloseStmtCount();
  }

  inline void decCloseStmtListSize()
  {
    closeStmtListSize_--;
    if (processStats_ != NULL)
       processStats_->decCloseStmtCount();
  }

  inline ExProcessStats *getExProcessStats() { return processStats_; }
  void setHbaseClient(HBaseClient_JNI *hbaseClientJNI)
  { hbaseClientJNI_ = hbaseClientJNI; }
  HBaseClient_JNI *getHBaseClient() { return hbaseClientJNI_; }

  HiveClient_JNI *getHiveClient() { return hiveClientJNI_; }
  void setHiveClient(HiveClient_JNI *hiveClientJNI)
  { hiveClientJNI_ = hiveClientJNI; }

  HdfsClient *getHDFSClient() { return hdfsClientJNI_; }
  void setHDFSClient(HdfsClient *hdfsClientJNI)
  { hdfsClientJNI_ = hdfsClientJNI; }

  //expose cmpContextInfo_ to get HQC info of different contexts
  const NAArray<CmpContextInfo *> & getCmpContextInfo() const { return cmpContextInfo_; }

  //expose cmpContext stack to allow search
  const LIST(CmpContext *)& getCmpContextsInUse() const { return  cmpContextInUse_; }

  CollIndex addTrustedRoutine(LmRoutine *r);
  LmRoutine *findTrustedRoutine(CollIndex ix);
  void putTrustedRoutine(CollIndex ix);

  ExSqlComp::ReturnStatus sendXnMsgToArkcmp
  (char * data, Lng32 dataSize, 
   Lng32 xnMsgType, ComDiagsArea* &diagsArea);

  inline NABoolean grabMemoryQuotaIfAvailable(ULng32 size)
  {
    if ( unusedBMOsMemoryQuota_ < size ) return FALSE;
    unusedBMOsMemoryQuota_ -= size ;
    return TRUE;
  }

  inline void resetMemoryQuota() { unusedBMOsMemoryQuota_ = 0 ; }

  inline ULng32 unusedMemoryQuota() { return unusedBMOsMemoryQuota_; }

  inline void yieldMemoryQuota(ULng32 size)
  { unusedBMOsMemoryQuota_ += size; }

private:

  // The heap where executor 'stuff' will be allocated from.
  // exHeap_ must be first so that it's dtor is called last (Gil)
  NAHeap exHeap_;

  SQLCTX_HANDLE contextHandle_;

  CliGlobals *cliGlobals_;

  SessionDefaults * sessionDefaults_;

  HashQueue * bdrConfigInfoList_;

  // this class defined in file SessionDefaults.h
  //  AQRInfo * aqrInfo_;

  char * authID_;
  char * authToken_;
  NABoolean validAuthID_;
  SQLAUTHID_TYPE authIDType_;

  //External name, max 128 characters
  char* externalUsername_;

  // Database user name. On Linux the values come from the USER_NAME
  // column in the USERS table. Max 128 characters.
  char *databaseUserName_;

  // List of active roles for the databaseUser
  Int32  *roleIDs_;
  Int32   numRoles_;

  NABoolean userNameChanged_;

  // queues(lists) to keep track of loaded modules, statements
  // and descriptors.
  HashQueue * moduleList_;
  HashQueue * statementList_;
  HashQueue * descriptorList_;
  HashQueue * cursorList_;
  // this is a subset of statementList_. It contains all statements in
  // state OPEN_ or EOF_
  HashQueue * openStatementList_;

  // list of non-audited tbat have been locked.
  HashQueue * nonAuditedLockedTableList_;

  // List of closed statements with ESPs assigned
  Queue * statementWithEspsList_;

  // remember the last assigned descriptor handle
  ULong lastDescriptorHandle_;
  ULong lastStatementHandle_;

  Int32 databaseUserID_;
  // With SPJ Definer Rights, we need to support different values for
  // SESSION_USER and CURRENT_USER/USER. SESSION_USER is the user that is 
  // logged on to the current SQL session. CURRENT_USER is the one with 
  // whose privileges a SQL statement is executed, With Definer Rights SPJ, 
  // the CURRENT_USER is the owner of the SPJ while SESSION_USER is the 
  // user who invoked the SPJ.
  Int32 sessionUserID_;

  // keeps track of current define context.
  unsigned short defineContext_;

  // flag and pointer to the embedded arkcmp context
  NABoolean isEmbeddedArkcmpInitialized_;
  CmpContext * embeddedArkcmpContext_;

  CmpContext * prevCmpContext_;

  // pointer to the array of server  versions used to communicate with ARKCMP.
  ARRAY(ExSqlComp *) arkcmpArray_;

  // Arkcmp context (CmpContext) switching related info
  // known CmpContext instance set to be used for different catagory
  ARRAY(CmpContextInfo *) cmpContextInfo_;
  // stack of CmpContexts in use except current one
  LIST(CmpContext *) cmpContextInUse_; 

  // Array of failure modes for each arkcmp 
  ARRAY(ArkcmpFailMode) arkcmpInitFailed_;
  short versionOfMxcmp_;
  char *mxcmpNodeName_;
  short indexIntoCompilerArray_;
  // the transaction object
  ExTransaction * transaction_;

  // A diagnostics area for this context
  ComDiagsArea   diagsArea_;

  // Points to the statistics area of current statement
  // being executed. Used to return stat info for the
  // 'last' statement that was executed.
  ExStatisticsArea * stats_;

  // this area contains the defaults and other controls
  // specified by user using CONTROL QUERY statements.
  ExControlArea * controlArea_;

  // used by asynchronous CLI cancel feature to
  // synchronize the main thread and the cancel thread.
  CLISemaphore cancelSemaphore_;

  // parser flags to be sent to mxcmp
  ULng32 sqlParserFlags_;

  // Hold all the dynamicly set (in this process) timeout data
  TimeoutData  * timeouts_;  // it is NULL if not used

  // logical timestamp; increment each time SET TIMEOUT executes
  // (We ignore counter overlap; this can only affect a statement that
  //  remained fixed up after 2^32 times of timeout-settings .... :-)
  UInt32  timeoutChangeCounter_; 

  // A list of closed statements maintained in LRU order.
  // Used to determine aging statements for space deallocation.
  // Rules: (when there are enough allocated statements).
  // - A statement is added to the head of the list at close() time. 
  // - A statement is removed from the list at open() and
  //   deallocate() time.
  // - Each statement on the list has a unique sequence > 0.
  //   A zero or negative sequence indicates the statement is not on the list.
  // - The sequence numbers indicate the sequence of closes of  
  //   those statements.
  //
  // closeStatementList points to the most recently closed static statement,
  // which has the largest close sequence number.
  // nextReclaimStatement points to the statement most eligible for 
  // space reclaim.  nextReclaimStatement will move toward the head of
  // the list as statements are reclaimed one by one.
  // 
  Statement * closeStatementList_;
  Statement * nextReclaimStatement_;

  // Statistics data.
  // stmtReclaimCount_ is the number of statements on the closeStmtList_
  // for which space reclaim has been done.

  Lng32 closeStmtListSize_;
  Lng32 stmtReclaimCount_;
  Lng32 stmtReclaimMinPctFree_; // Reclaim space when free is <= percent of total
  IpcTimeout espReleaseTimeout_;

  // currSequence_ is the sequence of the latest close of a statement.
  // prevFixupSequence_ is the sequence of the latest fixup.
  Lng32 currSequence_;
  Lng32 prevFixupSequence_;

  // a pointer containing information that catman
  // wants to persist across multiple calls to catman interface
  // from executor. 
  // Its contents are unknown to cli or executor. It is allocated
  // and maintained by catman code.
  // Passed to CatManAnsiNameToGuardianName.
  void * catmanInfo_;

  enum Flags
  {
    // If the stmt for which stats were collected is deallocated,
    // then a copy of it ExStatisticsArea is made and pointed to
    // by the stats_ field. This flag, if set, indicates that.
    // If this flag is not set, then stats_ points to the stats
    // area of the corresponding stmt.
    STATS_COPY_ = 0x0001,
    DELETE_MERGED_STATS_ = 0x0002,
    STATS_IN_SHARED_SEGMENT_ = 0x0004,
    // an inMemory object definition was created during this session.
    // Kill mxcmp at the end of this session.
    IN_MEMORY_OBJECT_DEFN = 0x0008
  };

  ULng32 flags_;

  // List of UDR servers servicing this context. Each list element is
  // an ExUdrServer pointer. There may be duplicates in the list. Each
  // element represents a reference on an ExUdrServer instance. A
  // context may own multiple references on a given ExUdrServer, one
  // for each fixed up CALL statement that has been executed within
  // the context. When a context is destroyed all ExUdrServer
  // references must be released by calling the ExUdrServerManager
  // interface.
  HashQueue *udrServerList_;

  // Strings to store UDR runtime options that have been set
  // dynamically by the calling application. These strings can only be
  // set via an internal CLI function and catman is the only caller of
  // that function.
  char *udrRuntimeOptions_;
  char *udrRuntimeOptionDelimiters_;
  Statement *pendingNoWaitPrepare_;
  ExProcessStats *processStats_;

  inline HashQueue * moduleList(){return moduleList_;};
  inline HashQueue * statementList(){return statementList_;};
  inline HashQueue * descriptorList(){return descriptorList_;};
  inline HashQueue * cursorList(){return cursorList_;};
  inline HashQueue * openStatementList(){return openStatementList_;};

  // Used to reclaim space from a list of closed statements.
  void addToCloseStatementList(Statement *statement);

  // SPJ add on
  void issueCtrlStmts(IpcConstMessageBufferPtr ctrlStmtBuffer, Int32 length);
  void internalPrepareExecuteFetchStmt(char *sqlText);
  UdrContextMsg * manufactureUdrContextMsg();  

  // Locate a matching UDR server within this context
  ExUdrServer *findUdrServer(const char *runtimeOptions,
                             const char *optionDelimiters,
                             NABoolean dedicated);

  // Release all ExUdrServer references currently held
  void releaseUdrServers();

  // Remove a child statement such as a clone or a stored procedure
  // result set proxy from the context's statement lists. Do not call
  // the child's destructor (that job is left to the parent
  // statement's destructor).
  RETCODE cleanupChildStmt(Statement *child);

  char * userSpecifiedSessionName_;

  // created whenever user begins a session.
  // Should never be NULL as we are always in a session.
  char * sessionID_;

  // list of volatile tables created in a session.
  HashQueue * volTabList_;

  HashQueue *hdfsHandleList_;
  SequenceValueGenerator * seqGen_;

  NABoolean sessionInUse_;
  NABoolean mxcmpSessionInUse_;
  NABoolean volatileSchemaCreated_;
  ExStatisticsArea *mergedStats_;
  StmtStats *prevStmtStats_;
  
  CLISemaphore *cliSemaphore_;
  Lng32 numCliCalls_;
  IpcEnvironment *env_;
  NAHeap *ipcHeap_;
  UInt32 eventConsumed_;
  NABoolean breakEnabled_;
  // ESP manager for the context
  ExEspManager *espManager_;
  ExeTraceInfo *exeTraceInfo_;
  // UDR server manager for this process
  ExUdrServerManager *udrServerManager_;
  // trusted routines in use locally in this context,
  // without going through udrserv
  ARRAY(LmRoutine *) trustedRoutines_;
  // SSMP manager for this context.
  ExSsmpManager *ssmpManager_;
  NABoolean dropInProgress_;

  // set to true if ddl stmts are issued.
  // Reset at begin and commit Xn. Used to do NATable invalidation
  // for ddl stmts issued within a transaction.
  NABoolean ddlStmtsExecuted_;

  //   
  //
  //  Fields to enforce SQL semantics inside the UDR server. These
  //  fields are checked by the UDR server after a user-defined routine
  //  returns control, to see if that routine violated any SQL
  //  semantics for UDRs. Some examples of violations include a NO SQL
  //  routine attempting to access SQL, and a routine attempting to
  //  issue SQL transaction statements such as BEGIN WORK.
  //  If the udrErrorChecksEnabled_ flag is FALSE then none of this UDR
  //  error checking is performed. The only SQL application that
  //  enables the UDR error checking is the UDR server.
  //   
  NABoolean udrErrorChecksEnabled_;
  Lng32 udrSqlAccessMode_;
  NABoolean udrAccessModeViolation_;
  NABoolean udrXactViolation_;
  NABoolean udrXactAborted_;
  Int64 udrXactId_;  // transid that UDR Server is interested to know
                     // if aborted
  NAString jniErrorStr_; 
  HBaseClient_JNI *hbaseClientJNI_;
  HiveClient_JNI *hiveClientJNI_;
  HdfsClient *hdfsClientJNI_;

  // this points to data used by trafSE (traf storage engine) that is context specific.
  // It points to a list of 'black box' of data allocated by user and is returned
  // back whenever this context is in use.
  HashQueue * trafSElist_;
  // memory quota allocation given back by BMOs to be used by other BMOs
  ULng32 unusedBMOsMemoryQuota_;

  NABoolean deleteStats()
  {
    return (flags_ & DELETE_MERGED_STATS_) != 0; 
  }

  void setDeleteStats(NABoolean v)      
  {
    (v ? flags_ |= DELETE_MERGED_STATS_ : flags_ &= ~DELETE_MERGED_STATS_); 
  }

  // An enumeration for different types of lookups into the AUTHS table 
  //   USER BY USER NAME      -- Find the row matching a database user name
  //   USER BY USER ID        -- Find the row matching a database user ID
  //   USER BY EXTERNAL NAME  -- Find the row matching an external user name
  //   ROLE BY ROLE ID	      -- Find the row matching a database role ID
  //   AUTH BY NAME           -- Find the row matching the database name
  enum AuthQueryType
    {
      USERS_QUERY_BY_USER_NAME = 2,
      USERS_QUERY_BY_USER_ID,
      USERS_QUERY_BY_EXTERNAL_NAME,
      ROLE_QUERY_BY_ROLE_ID,
      AUTH_QUERY_BY_NAME,
      ROLES_QUERY_BY_AUTH_ID
    };

  // Private method to perform single-row lookups into the AUTHS
  // table. If a matching row is found, column values are returned in
  // the users_type structure. users_type is defined in
  // smdio/CmTableDefs.h.
  //
  // For query type USERS_QUERY_BY_USER_ID, the authID argument must
  // be provided.
  //
  // For query types USERS_QUERY_BY_USER_NAME and
  // USERS_QUERY_BY_EXTERNAL_NAME, the authName argument must be
  // provided.
  RETCODE authQuery(
     AuthQueryType          queryType,         
     const char           * authName,          
     Int32                  authID,            
     char                 * authNameFromTable,
     Int32                  authNameMaxLen, 
     Int32                & authIDFromTable,
     std::vector<int32_t> & roleIDs);  
      
  RETCODE storeName(
     const char *src,
     char       *dest,
     int         maxLength);

  RETCODE storeName(
     const char *src,
     char       *dest,
     int         maxLength,
     int        &actualLength);
  
public:
  ContextCli(CliGlobals *cliGlobals);
  ~ContextCli();
  void deleteMe();
  inline UInt32 * getEventConsumed() { return &eventConsumed_; }
  inline IpcEnvironment * getEnvironment() { return env_; }
  inline ExEspManager * getEspManager() { return espManager_; }
  inline ExSsmpManager *getSsmpManager() { return ssmpManager_; }
  inline ExeTraceInfo *getExeTraceInfo() { return exeTraceInfo_; }
  NAHeap *getIpcHeap() { return ipcHeap_; }
  inline ExUdrServerManager *getUdrServerManager() { return udrServerManager_; }
  //
  // Accessor and mutator functions for UDR error checking. Notes on
  // UDR error checking appear below with the data member
  // declarations.
  // 
  NABoolean getUdrErrorChecksEnabled() { return udrErrorChecksEnabled_; }
  Lng32 getUdrSQLAccessMode() { return udrSqlAccessMode_; }
  NABoolean getUdrAccessModeViolation() { return udrAccessModeViolation_; }
  NABoolean getUdrXactViolation() { return udrXactViolation_; }
  NABoolean getUdrXactAborted() { return udrXactAborted_; }

  void setUdrErrorChecksEnabled(NABoolean b) { udrErrorChecksEnabled_ = b; }
  void setUdrSQLAccessMode(Lng32 mode) { udrSqlAccessMode_ = mode; }
  void setUdrAccessModeViolation(NABoolean b) { udrAccessModeViolation_ = b; }
  void setUdrXactViolation(NABoolean b) { udrXactViolation_ = b; }
  void setUdrXactAborted(Int64 currTransId, NABoolean b);
  //
  // A few useful wrapper functions to ease management of the UDR
  // error checking fields
  // 
  void clearUdrErrorFlags();

  NABoolean sqlAccessAllowed() const;

  void getUdrErrorFlags(NABoolean &sqlViolation,
                        NABoolean &xactViolation,
                        NABoolean &xactAborted) const
  {
    sqlViolation = udrAccessModeViolation_;
    xactViolation = udrXactViolation_;
    xactAborted = udrXactAborted_;
  }

  inline CLISemaphore *getSemaphore()
  { 
     return cliSemaphore_;
  }
  inline Lng32 incrNumOfCliCalls()  { return ++numCliCalls_; }
  inline Lng32 decrNumOfCliCalls()
  {
     if (numCliCalls_ > 0)
        return --numCliCalls_;
     else
        return numCliCalls_;
  }
  inline Lng32 getNumOfCliCalls() { return numCliCalls_; }
  Lng32 initializeSessionDefaults();
  Lng32 initializeExeBDRConfigInfo(char *mgbltyCatName,
				  ComDiagsArea * diagsArea);

  short moduleAdded(const SQLMODULE_ID * module_name);

  RETCODE allocateDesc(SQLDESC_ID * desc_id, Lng32 max_entries);
  RETCODE deallocDesc(SQLDESC_ID * desc_id,
		      NABoolean deallocStaticDesc);
  Descriptor * getDescriptor(SQLDESC_ID * desc_id);

  RETCODE allocateStmt(SQLSTMT_ID * stmt_id, 
		       Statement::StatementType stmt_type = Statement::DYNAMIC_STMT,
                       SQLSTMT_ID * cloned_stmt_id = NULL);

  RETCODE deallocStmt(SQLSTMT_ID * stmt_id, 
		      NABoolean deallocStaticStmt);

  Statement * getStatement(SQLSTMT_ID * statement_id, HashQueue * stmtList = NULL);

  Statement * getNextStatement(SQLSTMT_ID * statement_id, NABoolean position,
			       NABoolean advance);

  // Upgrade both argument types for multi charset module names
  void removeCursor(SQLSTMT_ID* cursorName, const SQLMODULE_ID* moduleName);

  void addToCursorList(Statement &s);

  void addToOpenStatementList(SQLSTMT_ID *statement_id, Statement *statement);
  void removeFromOpenStatementList(SQLSTMT_ID * statement_id);

  short commitTransaction(NABoolean waited);
  short releaseAllTransactionalRequests();

  void closeAllCursors(enum CloseCursorType, 
          enum closeTransactionType transType, const Int64 executorXnId = 0, 
          NABoolean inRollback = FALSE);
  void checkIfNeedToClose(Statement *stmt, enum CloseCursorType type, 
          NABoolean &closeStmt, NABoolean &releaseStmt);
  void clearAllTransactionInfoInClosedStmt(Int64 transid);
  void closeAllCursorsFor(SQLSTMT_ID * statement_id);

  inline NAHeap * exHeap()                            { return &exHeap_; }
  inline CollHeap * exCollHeap()                      { return &exHeap_; }
  inline HashQueue *getStatementList() const;
  inline HashQueue *getCursorList() const;
  inline HashQueue *getOpenStatementList() const;
  inline HashQueue * getNonAuditedLockedTableList()
                                    { return nonAuditedLockedTableList_; }

  inline ULong getNextDescriptorHandle()
                                       { return lastDescriptorHandle_++; }
  inline ULong getNextStatementHandle() {return ++lastStatementHandle_;}
  
#ifdef _DEBUG
  // dumps a list of all statements with info about allocated memory
  // for debugging purposes only
  void dumpStatementInfo();
#endif

  void dumpStatementAndGlobalInfo(ostream* outstream);

  // Returns a reference to the ComDiagsArea, diagsArea_, of this context.
  ComDiagsArea  &diags() { return diagsArea_; }

  ComDiagsArea *getDiagsArea() { return &diagsArea_; }
 
  ExStatisticsArea* getStats() { return stats_; }

  void setStatsArea(ExStatisticsArea *stats, NABoolean statsCopy = FALSE, 
      NABoolean inSharedSegment = TRUE, NABoolean getSemaphore = TRUE);

  ExControlArea * getControlArea() { return controlArea_; }

  // return the TimeoutData field of the context (if it is NULL --allocate it)
  // (If allocate == FALSE, just return it as is, even if it is NULL)
  TimeoutData * getTimeouts( NABoolean allocate = TRUE );

  void clearTimeoutData();  // deallocate the TimeoutData 

  // make these functions non-inline on NT and inline on NSK.
  // These methods are called from code in executor directory
  // which creates a problem when linking for arkesp since arkesp
  // does not link in with cli code.
  // By making them non-inline on nt, a stub could be added.
  // This problem does not show up on nsk since inline functions
  // are really inline out there.
  void incrementTimeoutChangeCounter();
  UInt32 getTimeoutChangeCounter();

  void* &catmanInfo() {return catmanInfo_;}

  ////////////////////////////////////////////////////
  // Used to communicate with the embedded ARKCMP.
  ////////////////////////////////////////////////////

  NABoolean isEmbeddedArkcmpInitialized()
                { return isEmbeddedArkcmpInitialized_;}
  void setEmbeddedArkcmpIsInitialized(NABoolean val)
                { isEmbeddedArkcmpInitialized_ = val;}
  CmpContext *getEmbeddedArkcmpContext()
                { return embeddedArkcmpContext_; }
  void setEmbeddedArkcmpContext(CmpContext * cntx)
                { embeddedArkcmpContext_ = cntx; }

  ////////////////////////////////////////////////////
  // Used to communicate with the ARKCMP process.
  ////////////////////////////////////////////////////

  void setArkcmp(ExSqlComp *es)
  {
    short index = arkcmpArray_.entries();
    arkcmpArray_.insertAt(index, es);
  }
  void setArkcmpFailMode(ContextCli::ArkcmpFailMode afm)
  {
   short index = arkcmpInitFailed_.entries();
   arkcmpInitFailed_.insertAt(index, afm); 
  }
  ExSqlComp * getArkcmp(short index = 0)   
  {
    return arkcmpArray_[index];
  }
  ArkcmpFailMode & arkcmpInitFailed(short index = 0)	
  { 
    return (ContextCli::ArkcmpFailMode &)arkcmpInitFailed_[index];
  }

  short getNumArkcmps()
  {
    return arkcmpArray_.entries(); 
  }
  Lng32 setOrStartCompiler(short mxcmpVersionToUse, char *remoteNodeName,
			  short &indexIntoCompilerArray);

  inline short getVersionOfCompiler() {return versionOfMxcmp_;}
  inline void setVersionOfMxcmp(short version)
  { versionOfMxcmp_ = version; }
  inline void setIndexToCompilerArray(short index)
  { indexIntoCompilerArray_ = index; }
  inline short getIndexToCompilerArray()
    {
      return indexIntoCompilerArray_;
    }
  inline const char * getMxcmpNodeName() {return mxcmpNodeName_;}
  inline void setMxcmpNodeName( char *mxcmpNodeName)
    { mxcmpNodeName_ = mxcmpNodeName; }

  inline NABoolean sendSettingsToCompiler (const short index) const
    // Send controls if current compiler is the default compiler, or if caller asks
    // for the current compiler
    { return ( (indexIntoCompilerArray_ == 0) || (indexIntoCompilerArray_ == index) ); };

  // Methods to switch to different CmpContext
  Int32 switchToCmpContext(Int32 cmpCntxtType);
  Int32 switchToCmpContext(void *cmpCntxt);
  Int32 switchBackCmpContext(void);
  void copyDiagsAreaToPrevCmpContext();
  NABoolean isDropInProgress() { return dropInProgress_; }
  void setDropInProgress() { dropInProgress_ = TRUE; };

  // Method to acquire a reference to a UDR server associated with
  // a given set of JVM startup options
  ExUdrServer *acquireUdrServer(const char *runtimeOptions,
                                const char *optionDelimiters,
				NABoolean dedicated = FALSE);

  // Here are methods to manage the UDR runtime option strings that
  // can be set dynamically by the calling application. These strings
  // can only be set via an internal CLI function and catman is the
  // only caller of that function.
  const char *getUdrRuntimeOptions() const
  {
    return udrRuntimeOptions_;
  }
  const char *getUdrRuntimeOptionDelimiters() const
  {
    return udrRuntimeOptionDelimiters_;
  }
  Lng32 setUdrRuntimeOptions(const char *options, ULng32 optionsLen,
                            const char *delimiters, ULng32 delimsLen);

  ExTransaction * getTransaction()	{ return transaction_; }

  NABoolean &ddlStmtsExecuted() { return ddlStmtsExecuted_; }

  Lng32 setAuthID(
   const char * externalUsername,
   const char * databaseUsername,
   const char * authToken,
   Int32        authTokenLen,
   Int32        effectiveUserID,
   Int32        sessionUserID);
   
  void completeSetAuthID(
     Int32        userID,
     Int32        sessionUserID,
     const char  *logonUserName,
     const char  *authToken,
     Int32        authTokenLen,
     const char  *databaseUserName,
     bool         eraseCQDs,
     bool         recreateMXCMP,
     bool         releaseUDRServers,
     bool         dropVolatileSchema,
     bool         resetCQDs);
        
  char * getAuthID() 
  {
    if (authIDType_ == SQLAUTHID_TYPE_ASCII_USERROLE ||
        authIDType_ == SQLAUTHID_TYPE_ASCII_USERNAME )
      return authID_;
    else
      return NULL;
  }

  Lng32 boundsCheckMemory(void *startAddress, ULng32 length);

  inline SQLCTX_HANDLE getContextHandle() const {return contextHandle_;}

  void reset(void *contextMsg);

  void closeAllStatementsAndCursors(); // Close all statements

  void retrieveContextInfo(void *contextMsg);
  
  inline ULng32 getSqlParserFlags() const { return sqlParserFlags_; }
  inline void setSqlParserFlags(ULng32 flagbits)
                                        { sqlParserFlags_ |= flagbits; }
  inline void resetSqlParserFlags(ULng32 flagbits)
                                        { sqlParserFlags_ &= ~flagbits; }
  inline void assignSqlParserFlags(ULng32 flagbits) { sqlParserFlags_ = flagbits; }

  inline void semaphoreLock(){cancelSemaphore_.get();}
  inline void semaphoreRelease(){cancelSemaphore_.release();}

  void removeFromCloseStatementList(Statement *statement,
				    NABoolean forOpen);

  // Reclaim statements if it is available
  NABoolean reclaimStatements();

  // Dealocate statement space based on least recently used rule.
  NABoolean reclaimStatementSpace();

  // returns the current DEFINE context.
  unsigned short getCurrentDefineContext();

  unsigned short &defineContext() { return defineContext_;};

  // returns TRUE, if define context has changed.
  // Sets the current define context.
  NABoolean checkAndSetCurrentDefineContext();

  inline CliGlobals * getCliGlobals(void)
    { return cliGlobals_; } ;

  NABoolean statsCopy()      { return (flags_ & STATS_COPY_)    != 0; }
  void setStatsCopy(NABoolean v)      
  { (v ? flags_ |= STATS_COPY_ : flags_ &= ~STATS_COPY_); }

  NABoolean statsInSharedSegment()      { return (flags_ & STATS_IN_SHARED_SEGMENT_)    != 0; }
  void setStatsInSharedSegment(NABoolean v)      
  { (v ? flags_ |= STATS_IN_SHARED_SEGMENT_ : flags_ &= ~STATS_IN_SHARED_SEGMENT_); }

  inline Statement * pendingNoWaitPrepare() const
  { return pendingNoWaitPrepare_; }
  NABoolean inMemoryObjectDefn()
    { return (flags_ & IN_MEMORY_OBJECT_DEFN) != 0; }
  void setInMemoryObjectDefn(NABoolean v)
    { (v ? flags_ |= IN_MEMORY_OBJECT_DEFN : flags_ &= ~IN_MEMORY_OBJECT_DEFN); }
  

  inline void setPendingNoWaitPrepare(Statement *statement)
    { pendingNoWaitPrepare_ = statement; };

  inline void resetPendingNoWaitPrepare()
    { pendingNoWaitPrepare_ = NULL; };
  void logReclaimEvent(Lng32 freeSize, Lng32 totalSize);

  SessionDefaults * getSessionDefaults() { return sessionDefaults_; }
  HashQueue * getBDRConfigInfoList()     { return bdrConfigInfoList_; }
  void resetBDRConfigInfoList(); 

  AQRInfo * aqrInfo() { return (sessionDefaults_ 
				? sessionDefaults_->aqrInfo() : NULL); }

  void addToStatementWithEspsList(Statement *statement);
  void removeFromStatementWithEspsList(Statement *);
  bool unassignEsps(bool force = false);

  void beginSession(char * userSpecifiedSessionName);
  Lng32 reduceEsps();
  void endSession(NABoolean cleanupEsps = FALSE,	
                  NABoolean cleanupEspsOnly = FALSE,
		  NABoolean cleanupOpens = FALSE);
  void dropSession(NABoolean clearCmpCache = FALSE);
  void endMxcmpSession(NABoolean cleanupEsps, NABoolean clearCmpCache = FALSE);
  void resetAttributes();

  void createMxcmpSession();
  Int32 updateMxcmpSession();

  void resetVolatileSchemaState();

  void closeAllTables();

  char * getSessionId() { return sessionID_; }
  void   setSessionId(char * si);
  void   genSessionId();

  NABoolean sessionInUse()       { return sessionInUse_; }
  NABoolean mxcmpSessionInUse()  { return mxcmpSessionInUse_; }

  NABoolean volatileSchemaCreated() { return volatileSchemaCreated_;}
  void setVolatileSchemaCreated(NABoolean v)  
  { volatileSchemaCreated_ = v; }

  HashQueue * getVolTabList() { return volTabList_;}
  void initVolTabList();
  void resetVolTabList();

  void killIdleMxcmp();
  void killAndRecreateMxcmp();

#ifdef _DEBUG
public:
  void StmtListPrintf(const Statement *s, const char *formatString, ...) const;
#endif
  ExStatisticsArea *getMergedStats() 
  {
    return mergedStats_;
  }

  void setMergedStats(ExStatisticsArea *stats)
  {
    mergedStats_ = stats;
  }
  ExStatisticsArea *getMergedStats(
            /* IN */  	short statsReqType,
	    /* IN */  	char *statsReqStr,
	    /* IN */  	Lng32 statsReqStrLen,
	    /* IN */	short activeQueryNum,
	    /* IN */ 	short statsMergeType,
            /*IN/out */ short &retryAttempts);

  Lng32 GetStatistics2(
            /* IN */  	short statsReqType,
	    /* IN */  	char *statsReqStr,
	    /* IN */  	Lng32 statsReqStrLen,
	    /* IN */	short activeQueryNum,
	    /* IN */ 	short statsMergeType,
	    /* OUT */ 	short *statsCollectType,
	    /* IN/OUT */ 	SQLSTATS_DESC sqlstats_desc[],
	    /* IN */ 	Lng32 max_stats_desc,
	    /* OUT */	Lng32 *no_returned_stats_desc);
  StmtStats *getPrevStmtStats()
  {
    return prevStmtStats_;
  }

  void setPrevStmtStats(StmtStats *ss)
  {
    prevStmtStats_ = ss;
  }

  Lng32 setSecInvalidKeys( 
           /* IN */    Int32 numSiKeys,
           /* IN */    SQL_QIKEY siKeys[]);

  Lng32 holdAndSetCQD(const char * defaultName, const char * defaultValue);
  Lng32 restoreCQD(const char * defaultName);

  Lng32 setCS(const char * csName, char * csValue);
  Lng32 resetCS(const char * csName);
  inline IpcTimeout getEspReleaseTimeout() const
  { return espReleaseTimeout_; }

  // Private method to initialize the context's user identity based on
  // OS user identity. Should be called before any query processing
  // begins. This step requires a fully initialized CliGlobals so
  // should not be called before CliGlobals initialization completes.
  void initializeUserInfoFromOS();
  hdfsFS getHdfsServerConnection(char *hdfsServer, Int32 port);
  void disconnectHdfsConnections();
}; // class ContextCli

/* ContextTidMap - Maps contextCli to  a thread id
 * 1. Only one mapping entry is possible for a given thread id.
 * 2. A thread can work on only one ContextCli object at a time. 
 * 3. Multiple threads in the same process can work on the same ContextCli. 
 * `
*/

class ContextTidMap 
{
public:
   ContextTidMap(pid_t tid, ContextCli *context)
   {
     tid_ = tid;
     context_ = context;
   }
public:
   pid_t tid_;
   ContextCli *context_;
};



inline HashQueue *
ContextCli::getStatementList() const
{
  return statementList_;
}

inline HashQueue *
ContextCli::getCursorList() const
{
  return cursorList_;
}

inline HashQueue *
ContextCli::getOpenStatementList() const
{
  return openStatementList_;
}

struct hdfsConnectStruct
{
  hdfsFS hdfsHandle_;
  Int32 hdfsPort_;
  char  hdfsServer_[256]; // max length determined by dfs.namenode.fs-limits.max-component-length(255) 
};

#endif

Lng32 parse_statsReq(short statsReqType,char *statsReqPtr, Lng32 statsReqStrLen,
                     char *nodeName, short &cpu, pid_t &pid, Int64 &timeStamp,
                     Lng32 &queryNumber);
