/******************************************************************************
*
* File:         ExRsInfo.h
* Description:  A container class for Statment globals Result Set info
*
* Created:      October 2005
* 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 @@@
*
******************************************************************************
*/
#ifndef EX_RS_INFO_H
#define EX_RS_INFO_H

#include "Platform.h"
#include "NABoolean.h"
#include "NABasicObject.h"
#include "Collections.h"
#include "ComSmallDefs.h"
#include "Ipc.h"
#include "ComRtUtils.h"

// Contents of this file
class RsInfo;
class ExRsInfo;

// Forward declarations
class NAMemory;
class ExUdrServer;
class Statement;
class ExExeStmtGlobals;
class UdrClientControlStream;

// Some data members such as the NAArray come from outside this
// DLL. The Windows compiler generates a warning about them requiring
// a DLL interface in order to be used by ExRsInfo clients. We
// will suppress such warnings.

//------------------------------------------------------------------------
// class RsInfo
//
// This class is a container for Result Set info 
// and is instantiated by ExRsInfo
//
//------------------------------------------------------------------------
class RsInfo : public NABasicObject
{
  friend class ExRsInfo;

private:
  RsInfo();
  virtual ~RsInfo();

  //Accessors
  Statement * getStatement() const {return statement_;} 
  NABoolean getOpenAttempted() const {return openAttempted_;} 
  NABoolean getCloseAttempted() const {return closeAttempted_;} 
  NABoolean isPrepared() const {return prepared_;}
  char * getProxySyntax() const { return proxySyntax_;} 
  
  //Mutators
  void setStatement(Statement *statement) {statement_ = statement;}
  void setOpenAttempted(NABoolean flag) {openAttempted_ = flag;}
  void setCloseAttempted(NABoolean flag) {closeAttempted_ = flag;}
  void setPrepared(NABoolean flag) {prepared_ = flag;}
  void setProxySyntax(char *proxySyntax) {proxySyntax_ = proxySyntax;}  

  //Class data members
  Statement *statement_;
  NABoolean openAttempted_;
  NABoolean closeAttempted_;
  NABoolean prepared_;
  char *proxySyntax_;
}; //RsInfo

//------------------------------------------------------------------------
// class ExRsInfo
//
// This class is a wrapper around a collection of RsInfo objects. 
//
//------------------------------------------------------------------------
class ExRsInfo : public NABasicObject
{
public:
  ExRsInfo();
  virtual ~ExRsInfo();

  void populate(ULng32 index,   
                const char * proxySyntax);   
  void bind(ULng32 index,       
            Statement * statement);   
  void unbind(Statement *statement);   
  void setOpenAttempted(ULng32 index);  
  void setCloseAttempted(ULng32 index);  
  void setPrepared(ULng32 index); 
  void reset();
  NABoolean statementExists(ULng32 index) const; 
  NABoolean openAttempted(ULng32 index) const;
  NABoolean closeAttempted(ULng32 index) const;
  NABoolean isPrepared(ULng32 index) const;
  NABoolean getRsInfo(ULng32 position,    // IN
                      Statement *&statement,     // OUT
                      const char *&proxySyntax,  // OUT
                      NABoolean &openAttempted,  // OUT
                      NABoolean &closeAttempted, // OUT
                      NABoolean &isPrepared)     // OUT
    const;
  ULng32 getIndex(Statement * statement) const;

  ExUdrServer * getUdrServer() const {return udrServer_;}
  const IpcProcessId & getIpcProcessId() const {return ipcProcessId_;} 
  Int64 getUdrHandle() const {return udrHandle_;}
  void setUdrServer(ExUdrServer *udrServer) {udrServer_ = udrServer;}
  void setIpcProcessId(const IpcProcessId &ipcProcessId);
  void setUdrHandle(Int64 udrHandle) {udrHandle_ = udrHandle;}

  ULng32 getNumReturnedByLastCall() const
  { return numReturnedByLastCall_; }
  ULng32 getNumClosedSinceLastCall() const
  { return numClosedSinceLastCall_; }

  NABoolean allResultsAreClosed() const
  {
    return (numClosedSinceLastCall_ >= numReturnedByLastCall_ ? TRUE : FALSE);
  }

  // Methods to get and set the maximum number of RS entries this
  // object can hold. 
  // 
  // If the user of this object calls setNumEntries(N) to set the max,
  // the object may actually raise the limit internally and
  // getNumEntries() may return a value higher than N.
  //
  // Users of this class should not rely on this "non-exact"
  // behavior. It is a side-effect of using NAArray in the
  // implementation of this class, and may change in the future.
  void setNumEntries(ComUInt32 maxEntries);
  const ULng32 getNumEntries() const
  {
    ULng32 n = rsInfoArray_.getSize();
    // We return (n-1) to account for the never-used entry in slot 0
    return (n > 0 ? n - 1 : 0);
  }

  // Methods to bring the UDR server into and out of a transaction for
  // a single CALL operation that can potentially return result
  // sets. To bring the server into a transaction we will send an
  // ENTER TX request. To temporarily bring the server out we send a
  // SUSPEND TX request. To bring the server fully out we send an EXIT
  // TX request. The stmtGlobals object passed in will have its diags
  // area populated if IPC errors are encountered.
  void enterUdrTx(ExExeStmtGlobals &stmtGlobals);
  void suspendUdrTx(ExExeStmtGlobals &stmtGlobals);
  void exitUdrTx(ExExeStmtGlobals &stmtGlobals);

  UdrClientControlStream *getEnterTxStream() const { return enterTxStream_; }
  UdrClientControlStream *getExitOrSuspendStream() const
  { return exitOrSuspendStream_; }

  // Message streams for ENTER, EXIT, and SUSPEND TX messages will use
  // this method to inform the ExRsInfo that the message interaction
  // has completed.
  void reportCompletion(UdrClientControlStream *);

private:

  enum TxMsgType { ENTER, SUSPEND, EXIT };

  enum TxState { IDLE, ACTIVE, SUSPENDED };

  static const char *getTxMsgTypeString(TxMsgType t)
  {
    switch (t)
    {
      case ENTER: return "ENTER";
      case SUSPEND: return "SUSPEND";
      case EXIT: return "EXIT";
      default: return ComRtGetUnknownString((Int32) t);
    }
  }

  static const char *getTxStateString(TxState s)
  {
    switch (s)
    {
      case IDLE: return "IDLE";
      case ACTIVE: return "ACTIVE";
      case SUSPENDED: return "SUSPENDED";
      default: return ComRtGetUnknownString((Int32) s);
    }
  }

  // A private method to do IPC for TX requests
  void sendTxMessage(ExExeStmtGlobals &, TxMsgType);

  ARRAY(RsInfo*) rsInfoArray_;
  ExUdrServer *udrServer_;
  IpcProcessId ipcProcessId_;
  Int64 udrHandle_;
  TxState txState_;

  // When an ENTER TX message is sent we need to keep a pointer to the
  // stream. This allows the ENTER TX to later be abandoned if the
  // EXIT TX or SUSPEND TX cannot be successfully sent.
  UdrClientControlStream *enterTxStream_;

  // We also need a pointer to the EXIT TX or SUSPEND TX stream. This
  // allows the ExRsInfo destructor to inform the stream when the
  // ExRsInfo instance is going away.
  UdrClientControlStream *exitOrSuspendStream_;

  ULng32 numReturnedByLastCall_;
  ULng32 numClosedSinceLastCall_;

#ifdef _DEBUG
public:
  void ExRsPrintf(const char *formatString, ...) const;
  NABoolean debugEnabled() const { return debug_; }
private:
  NABoolean debug_;
  NABoolean txDebug_;
  void displayList() const;
#endif
}; // class ExRsInfo

#endif // EX_RS_INFO_H
