/**********************************************************************
// @@@ 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:         ComTdbUdr.cpp
* Description:  
*
* Created:      2/8/2000
* Language:     C++
*
*
*
****************************************************************************
*/

#include "ComTdbUdr.h"

// ---------------------------------------------------------------------
// ComTdbUdr::ComTdbUdr()
// ---------------------------------------------------------------------
ComTdbUdr::ComTdbUdr(char *sqlName,
                     char *routineName,
                     char *routineSignature,
                     char *containerName,
                     char *externalPath,
                     char *librarySqlName,
                     
                     char *runtimeOptions,
                     char *runtimeOptionDelimiters,

                     ULng32 flags,
		     ULng32 numInputValues,
                     ULng32 numOutputValues,
                     ULng32 numParams,
                     ULng32 maxResultSets,
                     ULng32 stateAreaSize,
                     short udrType,
                     short languageType,
                     short paramStyle,
                     short sqlAccessMode,
                     short transactionAttrs,
                     UInt16 externalSecurity,
                     Int32 routineOwnerId,
                     Cardinality estimatedRowCount,
		     ex_cri_desc *criDescParent,
		     ex_cri_desc *criDescReturned,	
		     ex_cri_desc *workCriDesc,
                     queue_index downQueueMaxSize,
                     queue_index upQueueMaxSize,

                     Lng32 numOutputBuffers,
                     ULng32 outputBufferSize,
                     ULng32 requestBufferSize,
                     ULng32 replyBufferSize,

                     ex_expr *inputExpr,
		     ex_expr *outputExpr,
		     ex_expr *scanExpr,
		     ex_expr *projExpr,

                     unsigned short requestTuppIndex,
                     unsigned short replyTuppIndex,
                     ULng32 requestRowLen,
                     ULng32 replyRowLen,
                     ULng32 outputRowLen,

                     ULng32 numChildInputs,
                     ex_expr ** childInputExprs,
                     ComTdb ** childTdbs, 

                     Queue *optionalData,

                     Int32 udrSerInvocationInfoLen,
                     char *udrSerInvocationInfo,
                     Int32 udrSerPlanInfoLen,
                     char *udrSerPlanInfo,

                     Int32 javaDebugPort,
                     Int32 javaDebugTimeout,

                     Space *space
                     )
: ComTdb(ex_UDR, eye_UDR, estimatedRowCount, criDescParent,
         criDescReturned, downQueueMaxSize, upQueueMaxSize,
         numOutputBuffers, outputBufferSize),

  sqlName_(sqlName),
  routineName_(routineName),
  routineSignature_(routineSignature),
  containerName_(containerName),
  externalPath_(externalPath),
  librarySqlName_(librarySqlName),

  runtimeOptions_(runtimeOptions),
  runtimeOptionDelimiters_(runtimeOptionDelimiters),

  flags_(flags),
  numInputValues_(numInputValues),
  numOutputValues_(numOutputValues),
  numParams_(numParams),
  maxResultSets_(maxResultSets),
  stateAreaSize_(stateAreaSize),
  udrType_(udrType),
  languageType_(languageType),
  paramStyle_(paramStyle),
  sqlAccessMode_(sqlAccessMode),
  transactionAttrs_(transactionAttrs),
  externalSecurity_(externalSecurity),
  routineOwnerId_(routineOwnerId),
  requestSqlBufferSize_(requestBufferSize),
  replySqlBufferSize_(replyBufferSize),
  
  workCriDesc_(workCriDesc),
  inputExpr_(inputExpr),
  outputExpr_(outputExpr),
  scanExpr_(scanExpr),
  projExpr_(projExpr),
  requestTuppIndex_(requestTuppIndex),
  replyTuppIndex_(replyTuppIndex),
  requestRowLen_(requestRowLen),
  replyRowLen_(replyRowLen),
  outputRowLen_(outputRowLen),
  optionalData_(optionalData),
  udrSerInvocationInfoLen_(udrSerInvocationInfoLen),
  udrSerInvocationInfo_(udrSerInvocationInfo),
  udrSerPlanInfoLen_(udrSerPlanInfoLen),
  udrSerPlanInfo_(udrSerPlanInfo),
  javaDebugPort_(javaDebugPort),
  javaDebugTimeout_(javaDebugTimeout),

  numChildTableInputs_((Int16) numChildInputs),
  childInputExprs_(space,(void **)childInputExprs,numChildInputs),
  childTdbs_(space,(void **)childTdbs,numChildInputs)
{
  //
  // Allocate an array of pointers to the param info objects
  //
  paramInfo_ = (UdrFormalParamInfoPtr *)
    (space->allocateAlignedSpace(numParams_ * sizeof(UdrFormalParamInfoPtr)));
  for (UInt32 i = 0; i < numParams_; i++)
  {
    paramInfo_[i] = (UdrFormalParamInfoPtrPtr)NULL;
  }

  //
  // Allocate an array of pointers to the Child Table info objects
  //
  udrChildTableDescInfo_ = (UdrTableDescInfoPtr *)
    (space->allocateAlignedSpace(numChildInputs * sizeof(UdrTableDescInfoPtr)));
  for (UInt32 i = 0; i < numChildInputs; i++)
  {
    udrChildTableDescInfo_[i] = (UdrFormalParamInfoPtrPtr)NULL;
  }
}

ComTdbUdr::~ComTdbUdr()
{
}

Long ComTdbUdr::pack(void *space)
{
  sqlName_.pack(space);
  routineName_.pack(space);
  routineSignature_.pack(space);
  containerName_.pack(space);
  externalPath_.pack(space);
  librarySqlName_.pack(space);
  runtimeOptions_.pack(space);
  runtimeOptionDelimiters_.pack(space);
  workCriDesc_.pack(space);
  inputExpr_.pack(space);
  outputExpr_.pack(space);
  scanExpr_.pack(space);
  projExpr_.pack(space);

  //
  // The NAVersionedObject array templates use long values to index
  // into the array, so we cast numParams_ to long here. This is assumed
  // not to be a problem because other parts of the system do not store 
  // param count as unsigned long. E.g. the PARAMS table stores column
  // number as INT.
  //
  paramInfo_.pack(space, (Lng32) numParams_);

  optionalData_.pack(space);
  udrSerInvocationInfo_.pack(space);
  udrSerPlanInfo_.pack(space);
  udrChildTableDescInfo_.pack(space,(Lng32)numChildTableInputs_);
  childInputExprs_.pack(space,(Lng32)numChildTableInputs_);
  childTdbs_.pack(space,(Lng32)numChildTableInputs_);
  
  return ComTdb::pack(space);
}

Lng32 ComTdbUdr::unpack(void *base, void *reallocator)
{
  if (sqlName_.unpack(base)) return -1;
  if (routineName_.unpack(base)) return -1;
  if (routineSignature_.unpack(base)) return -1;
  if (containerName_.unpack(base)) return -1;
  if (externalPath_.unpack(base)) return -1;
  if (librarySqlName_.unpack(base)) return -1;
  if (runtimeOptions_.unpack(base)) return -1;
  if (runtimeOptionDelimiters_.unpack(base)) return -1;
  if (workCriDesc_.unpack(base, reallocator)) return -1;
  if (inputExpr_.unpack(base, reallocator)) return -1;
  if (outputExpr_.unpack(base, reallocator)) return -1;
  if (scanExpr_.unpack(base, reallocator)) return -1;
  if (projExpr_.unpack(base, reallocator)) return -1;
  
  //
  // The NAVersionedObject array templates use long values to index
  // into the array, so we cast numParams_ to long here. This is assumed
  // not to be a problem because other parts of the system do not store 
  // param count as unsigned long. E.g. the PARAMS table stores column
  // number as INT.
  //
  if (paramInfo_.unpack(base, (Lng32) numParams_, reallocator))
    return -1;

  if (optionalData_.unpack(base, reallocator))
    return -1;
  if (udrChildTableDescInfo_.unpack(base,(Lng32)numChildTableInputs_,reallocator))
    return -1;
  if (childInputExprs_.unpack(base,(Lng32)numChildTableInputs_,reallocator))
    return -1;
  if (childTdbs_.unpack(base,(Lng32)numChildTableInputs_,reallocator))
    return -1;
  if (udrSerInvocationInfo_.unpack(base))
    return -1;
  if (udrSerPlanInfo_.unpack(base))
    return -1;

  return ComTdb::unpack(base, reallocator);
}

void ComTdbUdr::displayContents(Space *space, ULng32 flag)
{
  ComTdb::displayContents(space, flag & 0xFFFFFFFE);

  if (flag & 0x00000008)
  {
    const size_t sz = sizeof(short);
    char buf[512];

    str_sprintf(buf, "\nFor ComTdbUdr :");
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    Lng32 lowFlags = (Lng32) (flags_ % 65536);
    Lng32 highFlags = (Lng32) ((flags_ - lowFlags) / 65536);
    str_sprintf(buf, "flags = %x%x", highFlags, lowFlags);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    if (sqlName_)
    {
      char *s = sqlName_;
      str_sprintf(buf, "routineName = %s", s);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    if (routineName_)
    {
      char *s = routineName_;
      str_sprintf(buf, "externalName = %s", s);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    if (containerName_)
    {
      char *s = containerName_;
      str_sprintf(buf, "externalFile = %s", s);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    if (externalPath_)
    {
      char *s = externalPath_;
      str_sprintf(buf, "externalPath = %s", s);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    if (librarySqlName_)
    {
      char *s = librarySqlName_;
      str_sprintf(buf, "librarySqlName = %s", s);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    // Some strings come from the user and there is no limit on the
    // maximum length. For these strings we will print two lines, the
    // first a header line and the second the actual string. For
    // example, the Java signature will look like this in the SHOWPLAN
    // output:
    //
    // signature =
    // (Ljava/lang/Float;[Ljava/lang/Float;)V
    //
    const char *s1;
    const char *s2;

    if (routineSignature_)
    {
      s1 = "\nsignature = ";
      s2 = routineSignature_;
      space->allocateAndCopyToAlignedSpace(s1, str_len(s1), sz);
      space->allocateAndCopyToAlignedSpace(s2, str_len(s2), sz);
    }

    if (runtimeOptions_)
    {
      s1 = "\nruntimeOptions = ";
      s2 = runtimeOptions_;
      space->allocateAndCopyToAlignedSpace(s1, str_len(s1), sz);
      space->allocateAndCopyToAlignedSpace(s2, str_len(s2), sz);
    }

    if (runtimeOptionDelimiters_)
    {
      s1 = "\noptionDelimiters = ";
      s2 = runtimeOptionDelimiters_;
      space->allocateAndCopyToAlignedSpace(s1, str_len(s1), sz);
      space->allocateAndCopyToAlignedSpace(s2, str_len(s2), sz);
    }

    str_sprintf(buf, "\nnumParameters = %d, maxResultSets = %d",
                numParams_, maxResultSets_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    
    str_sprintf(buf, "numInputValues = %d, numOutputValues = %d",
                numInputValues_, numOutputValues_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    
    str_sprintf(buf, "requestBufferSize = %d, replyBufferSize = %d",
                requestSqlBufferSize_, replySqlBufferSize_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    
    str_sprintf(buf, "requestRowLength = %d, replyRowLength = %d",
                requestRowLen_, replyRowLen_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    
    str_sprintf(buf, "outputRowLen = %d, stateAreaSize = %d",
                outputRowLen_, stateAreaSize_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    
    str_sprintf(buf, "requestTuppIndex = %d, replyTuppIndex = %d",
                (Int32) requestTuppIndex_, (Int32) replyTuppIndex_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    str_sprintf(buf, "udrType = %d, languageType = %d",
                (Int32) udrType_, (Int32) languageType_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    str_sprintf(buf, "parameterStyle = %d, sqlAccessMode = %d",
                (Int32) paramStyle_, (Int32) sqlAccessMode_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    str_sprintf(buf, "transactionAttributes = %d", (Int32) transactionAttrs_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    str_sprintf(buf, "externalSecurity = %d, routineOwnerId = %d",
                (Int32) externalSecurity_, (Int32) routineOwnerId_);
    space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

    UInt32 i;
    for (i = 0; i < numParams_; i++)
    {
      const UdrFormalParamInfo *p = paramInfo_[i];

      str_sprintf(buf, "\nParameter %d", (Int32) i);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

      str_sprintf(buf, "  name [%s]", p->getParamName());
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

      str_sprintf(buf, "  flags %x, type %d", p->getFlags(),
                  (Int32) p->getType());
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

      str_sprintf(buf, "  precision %d, scale %d, charset %d, collation %d",
                  (Int32) p->getPrecision(), (Int32) p->getScale(),
                  (Int32) p->getEncodingCharSet(), (Int32) p->getCollation());
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

    Queue *optData = getOptionalData();
    if (optData)
    {
      UInt32 dataElems = optData->numEntries();
      str_sprintf(buf, "\nNumber of optional data elements: %d",
                  (Int32) dataElems);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

      const char *s = NULL;
      i = 0;

      optData->position();
      while ((s = (const char *) optData->getNext()) != NULL)
      {
        // Each data element is prefixed by a 4-byte length field
        UInt32 len = 0;
        str_cpy_all((char *)&len, s, 4);

        str_sprintf(buf, "\nOptional data %d (length %d):",
                    (Int32) i++, (Int32) len);
        space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);

        if (len > 0)
        {
          // Create a buffer containing at most 200 bytes of data
          if (len > 200)
            len = 200;
          char truncatedBuf[201];
          str_cpy_all(truncatedBuf, s + 4, len);
          truncatedBuf[len] = 0;

          // Change NULL bytes and non-ASCII characters to '.' for
          // display purposes
          for (UInt32 j = 0; j < len; j++)
          {
            if (truncatedBuf[j] == 0 || !isascii(truncatedBuf[j]))
              truncatedBuf[j] = '.';
          }
          
          space->allocateAndCopyToAlignedSpace(truncatedBuf, len, sz);
        }
      }
    }
    if (javaDebugPort_ > 0)
    {
      str_sprintf(buf, "\njavaDebugPort = %d, javaDebugTimeout = %d",
                  javaDebugPort_, javaDebugTimeout_);
      space->allocateAndCopyToAlignedSpace(buf, str_len(buf), sz);
    }

  } // if (flag & 0x00000008)

  if (flag & 0x00000001)
  {
    displayExpression(space,flag);
    displayChildren(space,flag);
  }
}



