/**********************************************************************
// @@@ 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 @@@
**********************************************************************/

#define _SPUTIL_SP_DLL_
#include "CmpISPStd.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <iostream>


SP_STATUS SP_FILEINFO_Compile (SP_COMPILE_ACTION /* action */,
			      SP_COMPILE_HANDLE* /* compHandle */,
			      SP_HANDLE /* spHandle */,
			      SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_FILEINFO_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				   Lng32 numFields,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* error )
{
  if ( numFields != 4 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "SP2");
      error->optionalInteger[0] = 4;
      return SP_FAIL;
    }
  strcpy(&(format++->COLUMN_DEF[0]), "filename char(9) character set iso88591");
  strcpy(&(format++->COLUMN_DEF[0]), "counter INT");
  strcpy(&(format++->COLUMN_DEF[0]), "descpt varchar(64) character set iso88591");
  strcpy(&(format++->COLUMN_DEF[0]), "dt1 timestamp");

  return SP_SUCCESS;
}


SP_STATUS SP_FILEINFO_NumOutputs ( Lng32* num,
				  SP_COMPILE_HANDLE,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* /* error */)
{
  *num = 3;
  return SP_SUCCESS;
}

SP_STATUS SP_FILEINFO_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				   SP_KEYDESC_STRUCT*  keyFields ,
				   Lng32*  numKeyFields ,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "DATA varchar(128) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "descpt char(64) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "dt timestamp");


  return SP_SUCCESS;
}

SP_STATUS SP_FILEINFO_Process(SP_PROCESS_ACTION action,
			     SP_ROW_DATA  inputData ,
			     SP_EXTRACT_FUNCPTR  eFunc ,
			     SP_ROW_DATA outputData ,
			     SP_FORMAT_FUNCPTR fFunc,
			     SP_KEY_VALUE,
			     SP_KEYVALUE_FUNCPTR,
			     SP_PROCESS_HANDLE*  spProcHandle,
			     SP_HANDLE /* spHandle */,
			     SP_ERROR_STRUCT*  error
			     )
{
  struct SP_FILEINFO_STRUCT
  {
    FILE* fd;
    char desc[256];
    char dt1[64];
  };

  SP_FILEINFO_STRUCT* fileInfo = 0;
  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    *spProcHandle = 0;
    FILE* fd=0;
    char fileName[256];
    Int32 counter;
    char desc[66];
    char tempStr[64];
    char dt1[64];
    if ( eFunc(0, inputData, 10, tempStr, 0) != SP_NO_ERROR )
      return SP_FAIL;
    else
      // int as input parameter
      if ( eFunc(1, inputData, 4, &counter, 0) != SP_NO_ERROR )
        return SP_FAIL;
      else
        if (eFunc(2, inputData, 66, desc, 0) != SP_NO_ERROR )
          return SP_FAIL;
        else
          if (eFunc(3, inputData, 64, dt1, 0) != SP_NO_ERROR )
            return SP_FAIL;
          else
          {

            // char as input parameter
            tempStr[9] = '\0';
            sprintf(fileName, "%s%d", tempStr, counter);
            if ( !(fd = fopen(fileName,"r") )  )
            {
              error->error = -19021;
              strcpy(error->optionalString[0], "FILEINFO");
              sprintf(error->optionalString[1], "%s does not exist", fileName);
              spStatus = SP_FAIL;
            }
            fileInfo = new SP_FILEINFO_STRUCT;
            fileInfo->fd = fd;

            // varchar as input parameter
            memset(fileInfo->desc, ' ', 255);
            short len;
            memcpy(&len, &desc[0], sizeof(len));
            memcpy(fileInfo->desc, &desc[2], len);
            fileInfo->desc[len] = 0;

            // datetime as input parameter
            memcpy(fileInfo->dt1, dt1, 64);
          }

    *spProcHandle =(SP_PROCESS_HANDLE) fileInfo;
    return spStatus;
  }
  if (action == SP_PROC_FETCH)
  {
    SP_FILEINFO_STRUCT* fileInfo = (SP_FILEINFO_STRUCT*) (*spProcHandle);
    FILE* fd = fileInfo->fd;

    // varchar as output
    char tempstr[128];
    char* p = &tempstr[2];
    if ( fd && fgets(p, 126, fd) )
    {
      char* nlptr = strchr(p, '\n');
      if (nlptr) *nlptr = '\0';
#pragma nowarn(1506)   // warning elimination
      short len = strlen(p);
#pragma warn(1506)  // warning elimination
      memcpy(&tempstr[0], &len, sizeof(len));
#pragma nowarn(1506)   // warning elimination
      fFunc(0, outputData, strlen(p) + 2, tempstr, 0);
#pragma warn(1506)  // warning elimination

      // error when fetching output
      if (strncmp(&tempstr[2], "errors", 6) == 0)
      {
        error->error = -19021;
        strcpy(error->optionalString[0], "FILEINFO");
        strcpy(error->optionalString[1], "found an error token");
        (error+1)->error = -19021;
        strcpy((error+1)->optionalString[0], "FILEINFO");
        strcpy((error+1)->optionalString[1], "found an error token");
        (error+2)->error = -19021;
        strcpy((error+2)->optionalString[0], "FILEINFO");
        strcpy((error+2)->optionalString[1], "found an error token");
        return SP_FAIL;
      }
      else if (strncmp(&tempstr[2], "error", 5) == 0)
      {
        error->error = -19021;
        strcpy(error->optionalString[0], "FILEINFO");
        strcpy(error->optionalString[1], "found an error token");
        return SP_FAIL;
      }
      // char as output
#pragma nowarn(1506)   // warning elimination
      fFunc(1, outputData, strlen(fileInfo->desc), fileInfo->desc, 0);
#pragma warn(1506)  // warning elimination

      // datetime as output
      fFunc(2, outputData, 64, fileInfo->dt1, 0);

      return SP_MOREDATA;
    }
    else
      return SP_SUCCESS;
  }
  if (action == SP_PROC_CLOSE)
  {
    SP_FILEINFO_STRUCT* fileInfo = (SP_FILEINFO_STRUCT*)(*spProcHandle);
    FILE* fd = fileInfo->fd;
    if (fd)
    {
      if ( fclose(fd)  )
      {
        error->error = -19021;
        strcpy(error->optionalString[0], "FILEINFO");
	strcpy(error->optionalString[1], "Can not close file");
	return SP_FAIL;
      }
    }
    else
    {
      error->error = -19021;
      strcpy(error->optionalString[0], "FILEINFO");
      strcpy(error->optionalString[1], "no file opened ");
      return SP_FAIL;
    }
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

SP_STATUS SP_CASTING_Compile (SP_COMPILE_ACTION /* action */,
			      SP_COMPILE_HANDLE* /* compHandle */,
			      SP_HANDLE /* spHandle */,
			      SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_CASTING_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				   Lng32 numFields,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* error )
{
  if ( numFields != 4 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "CASTING");
      error->optionalInteger[0] = 4;
      return SP_FAIL;
    }
  strcpy(&((format++)->COLUMN_DEF[0]), "I1 smallint");
  strcpy(&((format++)->COLUMN_DEF[0]), "d1file char(16) character set iso88591 ");
  strcpy(&((format++)->COLUMN_DEF[0]), "description varchar(20) character set iso88591 ");
  strcpy(&((format++)->COLUMN_DEF[0]), "dt timestamp" );

  return SP_SUCCESS;
}


SP_STATUS SP_CASTING_NumOutputs ( Lng32* num,
				  SP_COMPILE_HANDLE,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* /* error */)
{
  *num = 4;
  return SP_SUCCESS;
}

SP_STATUS SP_CASTING_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				   SP_KEYDESC_STRUCT*  keyFields ,
				   Lng32*  numKeyFields ,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "DATA int");
  strcpy(&((format++)->COLUMN_DEF[0]), "datetime1 timestamp");
  strcpy(&((format++)->COLUMN_DEF[0]), "description varchar(256) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "tag char(64) character set iso88591");

  return SP_SUCCESS;
}

inline void varchar2String(char* varchar, short size, char*& string, short& len)
{
  // This inline will convert the sql varchar format string into a
  // C/C++ style string ( null terminated if enough length )
  memcpy(&len, varchar, sizeof(short));
  string = &varchar[sizeof(short)];
  if ((UInt32)len + sizeof(short) < (UInt32)size )
    string[len] = 0;
}

inline short string2Varchar(char* string, char* varchar, short size)
{
  if ((UInt32)strlen(string) + sizeof(short) > (UInt32)size )
    return 0;
#pragma nowarn(1506)   // warning elimination
  short len = strlen(string);
#pragma warn(1506)  // warning elimination
  memcpy(varchar, &len, sizeof(short));
  memcpy(varchar+sizeof(short), string, len);
  return 1;
}

SP_STATUS SP_CASTING_Process(SP_PROCESS_ACTION action,
			     SP_ROW_DATA  inputData ,
			     SP_EXTRACT_FUNCPTR  eFunc ,
			     SP_ROW_DATA outputData ,
			     SP_FORMAT_FUNCPTR fFunc,
			     SP_KEY_VALUE,
			     SP_KEYVALUE_FUNCPTR,
			     SP_PROCESS_HANDLE*  spProcHandle,
			     SP_HANDLE /* spHandle */,
			     SP_ERROR_STRUCT*  error
			     )
{
  struct CounterStruct
  {
    FILE* fd;
    Int32 max;
    Int32 current;
    char desc[256];
    char tag[40];
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    char counter[16];
    memset(counter, ' ', 15);
    counter[15] = 0;
    short len;
    if ( eFunc(0, inputData, 16, counter, 1) == SP_NO_ERROR )
    {
      char* cp;
      varchar2String(counter, 16, cp, len);
      Int32 iCounter = atoi(cp);
      CounterStruct* counterStruct = new CounterStruct();
      counterStruct->max = iCounter;
      counterStruct->current = 0;
      char fileName[64];
      if (eFunc(1, inputData, 64, fileName, 1) == SP_NO_ERROR)
      {
        char* fp;
        varchar2String(fileName, 64, fp, len);
        if ( !(counterStruct->fd = fopen(fp,"r") )  )
        {
          error->error = -19021;
          strcpy(error->optionalString[0], "CASTING");
          sprintf(error->optionalString[1], "%s does not exist", fileName);
          delete counterStruct;
          return SP_FAIL;
        }
        char tempStr[256];
        if ( eFunc(2, inputData, 256, tempStr, 1) != SP_NO_ERROR)
        {
          delete counterStruct;
          return SP_FAIL;
		}
        char* tp;
        varchar2String(tempStr, 256, tp, len);
        strcpy(counterStruct->desc, tp);
        if ( eFunc(3, inputData, 40, tempStr, 1) != SP_NO_ERROR)
        {
          error->error = -19021;
          strcpy(error->optionalString[0], "CASTING");
          strcpy(error->optionalString[1], "can't get the 4th parameter");
		  delete counterStruct;
          return SP_FAIL;
        }
        varchar2String(tempStr, 40, tp, len);
        strcpy(counterStruct->tag, tp);
        *spProcHandle =(SP_PROCESS_HANDLE) counterStruct;
      }
      else
	  {
	    delete counterStruct;
              return SP_FAIL;

	  }
	 delete counterStruct;
      return spStatus;
    }
    else
      return SP_FAIL;
  }
  if (action == SP_PROC_FETCH)
  {
    char string[256] = "";
    CounterStruct* counter = (CounterStruct *)(*spProcHandle);
    if ( counter )
    {
      if ( counter->current >= counter->max ||
        (counter->fd && !fgets(string, 256, counter->fd) ) )
        return SP_SUCCESS;
      else
      {
        char* lnPtr = strchr(string, '\n');
        if (lnPtr) *lnPtr='\0';
        char tempStr[1024];
        char id[64];
        sprintf(id, "%d", counter->current++);
        string2Varchar(id, tempStr, 1024);
        fFunc(0, outputData, 1024, tempStr, 1);
        string2Varchar(string, tempStr, 1024);
        fFunc(1, outputData, 1024, tempStr, 1);
        string2Varchar(counter->desc, tempStr, 1024);
        fFunc(2, outputData, 1024, tempStr, 1);
        string2Varchar(counter->tag, tempStr, 1024);
        fFunc(3, outputData, 1024, tempStr, 1);
        return SP_MOREDATA;
      }
    }
    else
    {
      error->error = -19021;
      strcpy(error->optionalString[0], "CASTING");
      strcpy(error->optionalString[1], "Not a valid CounterStruct*");
      return SP_FAIL;
    }
  }
  if (action == SP_PROC_CLOSE)
  {
    CounterStruct* counter = (CounterStruct *) (*spProcHandle);
    if ( counter->fd )
      fclose(counter->fd);
    delete counter;
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

SP_STATUS SP_NOINPUT_Compile (SP_COMPILE_ACTION /* action */,
			      SP_COMPILE_HANDLE* /* compHandle */,
			      SP_HANDLE /* spHandle */,
			      SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_NOINPUT_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				   Lng32 numFields,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* error )
{
  if ( numFields != 0 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "CASTING");
      error->optionalInteger[0] = 0;
      return SP_FAIL;
    }

  return SP_SUCCESS;
}


SP_STATUS SP_NOINPUT_NumOutputs ( Lng32* num,
				  SP_COMPILE_HANDLE,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* /* error */)
{
  *num = 0;
  return SP_SUCCESS;
}

SP_STATUS SP_NOINPUT_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				   SP_KEYDESC_STRUCT*  /*keyFields */ ,
				   Lng32*  /*numKeyFields */ ,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* /* error */  )
{
  return SP_SUCCESS;
}

SP_STATUS SP_NOINPUT_Process(SP_PROCESS_ACTION action,
			     SP_ROW_DATA  inputData ,
			     SP_EXTRACT_FUNCPTR  eFunc ,
			     SP_ROW_DATA outputData ,
			     SP_FORMAT_FUNCPTR fFunc,
			     SP_KEY_VALUE,
			     SP_KEYVALUE_FUNCPTR,
			     SP_PROCESS_HANDLE*  spProcHandle,
			     SP_HANDLE /* spHandle */,
			     SP_ERROR_STRUCT*  error
			     )
{
  struct InfoStruct
  {
    char varchar[256];
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    InfoStruct* is = new InfoStruct;
    char data[6];
    strcpy (data, "1000");
    string2Varchar(data, is->varchar, 256);
    *spProcHandle =(SP_PROCESS_HANDLE) is;
    cout << "In SP_NOINPUT_PROCESS, open" << endl << flush;
    return spStatus;
  }
  if (action == SP_PROC_FETCH)
  {
    return SP_SUCCESS;
  }
  if (action == SP_PROC_CLOSE)
  {
    cout << "In SP_NOINPUT_PROCESS, close" << endl << flush;
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

SP_STATUS SP_PARSING_Compile (SP_COMPILE_ACTION action,
			      SP_COMPILE_HANDLE*  cmpHandle ,
			      SP_HANDLE /* spHandle */,
			      SP_ERROR_STRUCT* /* error */ )
{
  if ( action == SP_COMP_INIT )
  {
    *cmpHandle = (SP_COMPILE_HANDLE) new Int32(0);
    cout << "in SP_PARSING_Compile SP_COMP_INIT" << endl;
  }
  if ( action == SP_COMP_EXIT )
  {
    delete ((Int32*)(*cmpHandle));
    cout << "in SP_PARSING_COMPILE SP_COMP_EXIT" << endl;
  }
  return SP_SUCCESS;
}

SP_STATUS SP_PARSING_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				   Lng32 numFields,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* error )
{
  if ( numFields != 2 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "PARSING");
      error->optionalInteger[0] = 2;
      return SP_FAIL;
    }

  strcpy(&((format++)->COLUMN_DEF[0]), "string varchar(40) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "i1 int");
  return SP_SUCCESS;
}

SP_STATUS SP_PARSING_PARSER (
     char* param, /* input, null terminated */
     SP_COMPILE_HANDLE cmpHandle, /* input */
     SP_HANDLE spHandle, /* input */
     SP_ERROR_STRUCT* error /* output */
     )
{
  if (strcmp(param, "1")==0)
    *((Int32*)cmpHandle) = 1;
  else if (strcmp(param, "2") == 0 )
    *((Int32*)cmpHandle) = 2;
  else
  {
    error->error = -19021;
    strcpy(error->optionalString[0], "SP_PARSING_PARSER ");
    sprintf(error->optionalString[1], " invalid parameter : %s ", param);
    error->error = -19021;
    return SP_FAIL;
  }
  return SP_SUCCESS;
}


SP_STATUS SP_PARSING_NumOutputs ( Lng32* num,
				  SP_COMPILE_HANDLE cmpHandle,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* /* error */)
{
  Int32 param = *( (Int32*)cmpHandle );
  if ( param == 1 || param == 2)
    *num = param;
  else
    return SP_FAIL;
  return SP_SUCCESS;
}

SP_STATUS SP_PARSING_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				   SP_KEYDESC_STRUCT*  /*keyFields */ ,
				   Lng32*  /*numKeyFields */ ,
				   SP_COMPILE_HANDLE cmpHandle,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* /* error */  )
{

  Int32 param = *( ( Int32*)cmpHandle );
  if ( param == 1 )
  {
    strcpy ( &((format++)->COLUMN_DEF[0]), "i1 int" );
    return SP_SUCCESS;
  }
  if ( param == 2 )
  {
    strcpy ( &((format++)->COLUMN_DEF[0]), "i1 int");
    strcpy ( &((format++)->COLUMN_DEF[0]), "c2 char(5) character set iso88591");
    return SP_SUCCESS;
  }

  return SP_FAIL;
}

SP_STATUS SP_PARSING_Process(SP_PROCESS_ACTION action,
			     SP_ROW_DATA  inputData ,
			     SP_EXTRACT_FUNCPTR  eFunc ,
			     SP_ROW_DATA outputData ,
			     SP_FORMAT_FUNCPTR fFunc,
			     SP_KEY_VALUE,
			     SP_KEYVALUE_FUNCPTR,
			     SP_PROCESS_HANDLE*  spProcHandle,
			     SP_HANDLE /* spHandle */,
			     SP_ERROR_STRUCT*  error
			     )
{
  struct InfoStruct
  {
    Int32 param; // 1 or 2
    Int32 max;
    Int32 counter;
    char string[5];
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    char p[64];
    if (eFunc(0, inputData, 42, p, 0) == SP_NO_ERROR)
    {
      char* ptr;
      short len;
      varchar2String(p, 64, ptr, len);
      Int32 param = atoi(ptr);
      if ( param != 1 && param != 2 )
        return SP_FAIL;
      InfoStruct* is = new InfoStruct;
      is->param = param;
      is->counter = 0;
      eFunc(1, inputData, sizeof(Int32), &(is->max), 0);
      memcpy(is->string, "12345", 5);
      *spProcHandle = is;
      return spStatus;
    }
  }
  if (action == SP_PROC_FETCH)
  {
    InfoStruct* is = (InfoStruct *)(*spProcHandle);
    if ( is )
    {
      if ( is->counter > is->max )
        return SP_SUCCESS;
      fFunc(0, outputData, sizeof(Int32), &(is->counter), 0);
      is->counter++;

      if ( is->param == 2 )
      {
        fFunc(1, outputData, 5, &is->string[0], 0);
      }
      return SP_MOREDATA;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_CLOSE)
  {
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

SP_STATUS SP_DELAY_Compile (SP_COMPILE_ACTION action,
			    SP_COMPILE_HANDLE*  cmpHandle ,
			    SP_HANDLE /* spHandle */,
			    SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_DELAY_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				   Lng32 numFields,
				   SP_COMPILE_HANDLE,
				   SP_HANDLE /* spHandle */,
				   SP_ERROR_STRUCT* error )
{
  if ( numFields != 2 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "DELAY");
      error->optionalInteger[0] = 2;
      return SP_FAIL;
    }

  strcpy(&((format++)->COLUMN_DEF[0]), "i1 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "i2 int");
  return SP_SUCCESS;
}

SP_STATUS SP_DELAY_NumOutputs ( Lng32* num,
				SP_COMPILE_HANDLE cmpHandle,
				SP_HANDLE /* spHandle */,
				SP_ERROR_STRUCT* /* error */)
{
  *num = 1;
  return SP_SUCCESS;
}

SP_STATUS SP_DELAY_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				 SP_KEYDESC_STRUCT*  /*keyFields */ ,
				 Lng32*  /*numKeyFields */ ,
				 SP_COMPILE_HANDLE cmpHandle,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "c1 int");

  return SP_SUCCESS;
}

SP_STATUS SP_DELAY_Process(SP_PROCESS_ACTION action,
			   SP_ROW_DATA  inputData ,
			   SP_EXTRACT_FUNCPTR  eFunc ,
			   SP_ROW_DATA outputData ,
			   SP_FORMAT_FUNCPTR fFunc,
			   SP_KEY_VALUE,
			   SP_KEYVALUE_FUNCPTR,
			   SP_PROCESS_HANDLE*  spProcHandle,
			   SP_HANDLE /* spHandle */,
			   SP_ERROR_STRUCT*  error
			   )
{
  struct InfoStruct
  {
    Int32 delay;
    Int32 max;
    Int32 counter;
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    Int32 tempi;
    if (eFunc(0, inputData, sizeof(Int32), &tempi, 0) == SP_NO_ERROR)
    {
      Int32 tempi2;
      if (eFunc(1, inputData, sizeof(Int32), &tempi2, 0) == SP_NO_ERROR )
      {
        InfoStruct* is = new InfoStruct;
        is->delay = tempi;
        is->max = tempi2;
        is->counter = 0;
        *spProcHandle = is;
        return spStatus;
      }
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_FETCH)
  {
    InfoStruct* is = (InfoStruct *)(*spProcHandle);
    if ( is )
    {
      if ( is->counter > is->max )
        return SP_SUCCESS;
      //Sleep(is->delay);
      for ( Int32 i=0; i < is->delay; i++ ) i = (i * 10) / 10;
      fFunc(0, outputData, sizeof(Int32), &(is->counter), 0);
      is->counter++;

      return SP_MOREDATA;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_CLOSE)
  {
    delete (InfoStruct *)(*spProcHandle);
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

// ERROR is a stored procedure to test the CMPASSERT feature,
// It is to test that once exception happens in compilation, the
// SP_ERROR_Compile routine will be called for SP_COMP_EXIT.
// If exception happens in execution time, the
// SP_ERROR_Process routine will be called to close the ISP.
// To test this feature, you need
// 1. the following ISP implementation.
// 2. testing code in arkcmp/CmpStoredProc.cpp, search for SP_ERROR_
// 3. testing code in arkcmp/CmpISPUtils.cpp, seach for SP_ERROR_
//    The above 2 places are commented out for now, need to uncomment
//    them to test this feature.
// 4. from sqlci, run
//    select * from table(tdmsip('ERROR', 'TestCMPASSERT'));
//    should trigger the CMPASSERT in compilation time.
// 5. from sqlci, run
//    select * from table(tdmisp('ERROR', 'TestCMPASSERTEXE'));
//    should trigger the CMPASSERT in execution time.
SP_STATUS SP_ERROR_Compile (SP_COMPILE_ACTION action,
			    SP_COMPILE_HANDLE*  cmpHandle ,
			    SP_HANDLE /* spHandle */,
			    SP_ERROR_STRUCT* error )
{
  static Int32 parserCalled = 0;
  if ( action == SP_COMP_EXIT )
  {
    if ( parserCalled )
      return SP_SUCCESS;
    error->error = -19021;
    strcpy(error->optionalString[0], "SP_ERROR_Compile ");
    sprintf(error->optionalString[1], " SP_COMP_EXIT called ");
    return SP_FAIL;
  }
  else
  {
    parserCalled = 0;
    *cmpHandle = &parserCalled;
    return SP_SUCCESS;
  }
}

SP_STATUS SP_ERROR_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				 Lng32 numFields,
				 SP_COMPILE_HANDLE,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* error )
{
  if ( numFields != 1 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "ERROR");
      error->optionalInteger[0] = 1;
      return SP_FAIL;
    }

  strcpy(&((format++)->COLUMN_DEF[0]), "i1 char(16) character set iso88591");
  return SP_SUCCESS;
}

SP_STATUS SP_ERROR_PARSER (
     char* param, /* input, null terminated */
     SP_COMPILE_HANDLE cmpHandle, /* input */
     SP_HANDLE spHandle, /* input */
     SP_ERROR_STRUCT* error /* output */
     )
{
  Int32* parserFlag;
  parserFlag = ((Int32*)cmpHandle);
  *parserFlag = 1;
  return SP_SUCCESS;
}

SP_STATUS SP_ERROR_NumOutputs ( Lng32* num,
				SP_COMPILE_HANDLE cmpHandle,
				SP_HANDLE /* spHandle */,
				SP_ERROR_STRUCT* /* error */)
{
  *num = 1;
  return SP_SUCCESS;
}

SP_STATUS SP_ERROR_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				 SP_KEYDESC_STRUCT*  /*keyFields */ ,
				 Lng32*  /*numKeyFields */ ,
				 SP_COMPILE_HANDLE cmpHandle,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "i1 char(16) character set iso88591");
  return SP_SUCCESS;
}

SP_STATUS SP_ERROR_Process(SP_PROCESS_ACTION action,
			   SP_ROW_DATA  inputData ,
			   SP_EXTRACT_FUNCPTR  eFunc ,
			   SP_ROW_DATA outputData ,
			   SP_FORMAT_FUNCPTR fFunc,
			   SP_KEY_VALUE,
			   SP_KEYVALUE_FUNCPTR,
			   SP_PROCESS_HANDLE*  spProcHandle,
			   SP_HANDLE /* spHandle */,
			   SP_ERROR_STRUCT*  error
			   )
{

  if (action == SP_PROC_OPEN)
  {
    static Int32 withData = 0;
    *spProcHandle = &withData;
    return SP_SUCCESS;
  }
  if (action == SP_PROC_FETCH)
  {
    char temp[16];
    if (eFunc(0, inputData, 16, temp, 0) == SP_NO_ERROR)
    {
      *( (Int32*)(*spProcHandle) ) = 1;
      fFunc(0, outputData, 16, temp, 0);
      return SP_SUCCESS;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_CLOSE)
  {
    if ( * ((Int32*)(*spProcHandle)) != 1 )
    {
      error->error = -19021;
      strcpy(error->optionalString[0], "SP_ERROR_PROCESS ");
      sprintf(error->optionalString[1], " SP_PROC_CLOSE called ");
      return SP_FAIL;
    }
    //delete (InfoStruct *)(*spProcHandle);
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

// COL16 is a internal stored procedure that will return with 16 columns
// of data. This is used to do performance testing. QA is using a test case
// with 13 cols of int and 3 cols of char(52) to test performance.
// input : counter int;  -- number of rows returned.
//         filename varchar(64) -- input file name.
// output : col1 - col13 int; -- sequence number starting from 1
//          col14 - col16 char(52); -- if filename exists, read from filename,
//                                  -- otherwise, some constant value.
SP_STATUS SP_COL16_Compile (SP_COMPILE_ACTION action,
			    SP_COMPILE_HANDLE*  cmpHandle ,
			    SP_HANDLE /* spHandle */,
			    SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_COL16_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				 Lng32 numFields,
				 SP_COMPILE_HANDLE,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* error )
{
  if ( numFields != 2 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "COL16");
      error->optionalInteger[0] = 2;
      return SP_FAIL;
    }

  strcpy(&((format++)->COLUMN_DEF[0]), "maxCounter int");
  strcpy(&((format++)->COLUMN_DEF[0]), "fname varchar(64) character set iso88591");
  return SP_SUCCESS;
}

SP_STATUS SP_COL16_NumOutputs ( Lng32* num,
				SP_COMPILE_HANDLE cmpHandle,
				SP_HANDLE /* spHandle */,
				SP_ERROR_STRUCT* /* error */)
{
  *num = 16;
  return SP_SUCCESS;
}

SP_STATUS SP_COL16_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				 SP_KEYDESC_STRUCT*  /*keyFields */ ,
				 Lng32*  /*numKeyFields */ ,
				 SP_COMPILE_HANDLE cmpHandle,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "c1 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c2 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c3 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c4 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c5 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c6 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c7 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c8 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c9 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c10 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c11 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c12 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c13 int");
  strcpy(&((format++)->COLUMN_DEF[0]), "c14 char(52) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "c15 char(52) character set iso88591");
  strcpy(&((format++)->COLUMN_DEF[0]), "c16 char(52) character set iso88591");

  return SP_SUCCESS;
}

SP_STATUS SP_COL16_Process(SP_PROCESS_ACTION action,
			   SP_ROW_DATA  inputData ,
			   SP_EXTRACT_FUNCPTR  eFunc ,
			   SP_ROW_DATA outputData ,
			   SP_FORMAT_FUNCPTR fFunc,
			   SP_KEY_VALUE,
			   SP_KEYVALUE_FUNCPTR,
			   SP_PROCESS_HANDLE*  spProcHandle,
			   SP_HANDLE /* spHandle */,
			   SP_ERROR_STRUCT*  error
			   )
{
  struct InfoStruct
  {
    Int32 max;
    Int32 counter;
    FILE* fd;
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    Int32 tempi;
    if (eFunc(0, inputData, sizeof(Int32), &tempi, 0) == SP_NO_ERROR)
    {
      char p[65];
      if (eFunc(1, inputData, 64, p, 0) == SP_NO_ERROR)
      {
        char* ptr;
        short len;
        varchar2String(p, 64, ptr, len);
        InfoStruct* is = new InfoStruct;
        is->max = tempi;
        is->counter = 0;
        is->fd = fopen ( ptr, "r");
        *spProcHandle = is;
        return spStatus;
      }
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_FETCH)
  {
    InfoStruct* is = (InfoStruct *)(*spProcHandle);
    if ( is )
    {
      if ( is->counter > is->max )
        return SP_SUCCESS;
      for ( Int32 i=0; i < 13; i++ )
        fFunc(i, outputData, sizeof(Int32), &(is->counter), 0);
      char temp[64];
      const char tempConst[] =
        "Constant String                                            ";
      char* pch = &temp[0];
      if ( is->fd )
      {
        memset (temp, ' ', 63);
        fgets(temp, 64, is->fd);
        char* lnPtr = strchr(temp, '\n');
        if (lnPtr) *lnPtr = '\0';
      }
      else
        pch = (char*)(&tempConst[0]);
      fFunc(13, outputData, 52, pch, 0);
      fFunc(14, outputData, 52, pch, 0);
      fFunc(15, outputData, 52, pch, 0);

      is->counter++;

      return SP_MOREDATA;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_CLOSE)
  {
    delete (InfoStruct *)(*spProcHandle);
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

SP_STATUS SP_ROW998_Compile (SP_COMPILE_ACTION action,
			     SP_COMPILE_HANDLE*  cmpHandle ,
			     SP_HANDLE /* spHandle */,
			     SP_ERROR_STRUCT* /* error */ )
{
  return SP_SUCCESS;
}

SP_STATUS SP_ROW998_InputFormat ( SP_FIELDDESC_STRUCT* format ,
				  Lng32 numFields,
				  SP_COMPILE_HANDLE,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* error )
{
  if ( numFields != 1 )
    {
      error->error = -19020;
      strcpy(error->optionalString[0], "ROW998");
      error->optionalInteger[0] = 1;
      return SP_FAIL;
    }

  strcpy(&((format++)->COLUMN_DEF[0]), "maxCounter int");
  return SP_SUCCESS;
}

SP_STATUS SP_ROW998_NumOutputs ( Lng32* num,
				 SP_COMPILE_HANDLE cmpHandle,
				 SP_HANDLE /* spHandle */,
				 SP_ERROR_STRUCT* /* error */)
{
  *num = 1;
  return SP_SUCCESS;
}

SP_STATUS SP_ROW998_OutputFormat (SP_FIELDDESC_STRUCT* format ,
				  SP_KEYDESC_STRUCT*  /*keyFields */ ,
				  Lng32*  /*numKeyFields */ ,
				  SP_COMPILE_HANDLE cmpHandle,
				  SP_HANDLE /* spHandle */,
				  SP_ERROR_STRUCT* /* error */  )
{
  strcpy(&((format++)->COLUMN_DEF[0]), "c1 char(998) character set iso88591");

  return SP_SUCCESS;
}

SP_STATUS SP_ROW998_Process(SP_PROCESS_ACTION action,
			    SP_ROW_DATA  inputData ,
			    SP_EXTRACT_FUNCPTR  eFunc ,
			    SP_ROW_DATA outputData ,
			    SP_FORMAT_FUNCPTR fFunc,
			    SP_KEY_VALUE,
			    SP_KEYVALUE_FUNCPTR,
			    SP_PROCESS_HANDLE*  spProcHandle,
			    SP_HANDLE /* spHandle */,
			    SP_ERROR_STRUCT*  error
			   )
{
  struct InfoStruct
  {
    Int32 max;
    Int32 counter;
  };

  if (action == SP_PROC_OPEN)
  {
    SP_STATUS spStatus = SP_SUCCESS;
    Int32 tempi;
    if (eFunc(0, inputData, sizeof(Int32), &tempi, 0) == SP_NO_ERROR)
    {
      InfoStruct* is = new InfoStruct;
      is->max = tempi;
      is->counter = 0;
      *spProcHandle = is;
      return spStatus;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_FETCH)
  {
    InfoStruct* is = (InfoStruct *)(*spProcHandle);
    if ( is )
    {
      if ( is->counter > is->max )
        return SP_SUCCESS;
      char temp[998];
      const char tempConst[] =
        "Constant String                                            ";
      sprintf(temp, "%s %d", tempConst, is->counter);
      fFunc(0, outputData, 998, temp, 0);

      is->counter++;

      return SP_MOREDATA;
    }
    return SP_FAIL;
  }
  if (action == SP_PROC_CLOSE)
  {
    delete (InfoStruct *)(*spProcHandle);
    return SP_SUCCESS;
  }

  return SP_SUCCESS;
}

Int32 SQLISP_INIT(SP_REGISTER_FUNCPTR rFunc, SP_DLL_HANDLE* h)
{
  if (!rFunc)
  {
    return 0;
  }

  char funcName[SP_STRING_MAX_LENGTH];
  strcpy(funcName, "FILEINFO");
  rFunc(funcName,
	  SP_FILEINFO_Compile,
	  SP_FILEINFO_InputFormat,
	  0,
	  SP_FILEINFO_NumOutputs,
	  SP_FILEINFO_OutputFormat,
	  SP_FILEINFO_Process,
	  0,
	  CMPISPVERSION);
  strcpy(funcName, "CASTING");
  rFunc(funcName,
	  SP_CASTING_Compile,
	  SP_CASTING_InputFormat,
	  0,
	  SP_CASTING_NumOutputs,
	  SP_CASTING_OutputFormat,
	  SP_CASTING_Process,
	  0,
	  CMPISPVERSION);
  strcpy(funcName, "NOINPUT");
  rFunc(funcName,
    SP_NOINPUT_Compile,
    SP_NOINPUT_InputFormat,
    0,
    SP_NOINPUT_NumOutputs,
    SP_NOINPUT_OutputFormat,
    SP_NOINPUT_Process,
    0,
    CMPISPVERSION);
  strcpy(funcName, "PARSING");
  rFunc(funcName,
    SP_PARSING_Compile,
    SP_PARSING_InputFormat,
    SP_PARSING_PARSER,
    SP_PARSING_NumOutputs,
    SP_PARSING_OutputFormat,
    SP_PARSING_Process,
    0,
    CMPISPVERSION);
  strcpy(funcName, "DELAY");
  rFunc(funcName,
    SP_DELAY_Compile,
    SP_DELAY_InputFormat,
    0,
    SP_DELAY_NumOutputs,
    SP_DELAY_OutputFormat,
    SP_DELAY_Process,
    0,
    CMPISPVERSION);
  strcpy(funcName, "ERROR");
  rFunc(funcName,
    SP_ERROR_Compile,
    SP_ERROR_InputFormat,
    SP_ERROR_PARSER,
    SP_ERROR_NumOutputs,
    SP_ERROR_OutputFormat,
    SP_ERROR_Process,
    0,
    CMPISPVERSION);
  strcpy(funcName, "COL16");
  rFunc(funcName,
    SP_COL16_Compile,
    SP_COL16_InputFormat,
    0,
    SP_COL16_NumOutputs,
    SP_COL16_OutputFormat,
    SP_COL16_Process,
    0,
    CMPISPVERSION);
  strcpy(funcName, "ROW998");
  rFunc(funcName,
    SP_ROW998_Compile,
    SP_ROW998_InputFormat,
    0,
    SP_ROW998_NumOutputs,
    SP_ROW998_OutputFormat,
    SP_ROW998_Process,
    0,
    CMPISPVERSION);

  return 1;
}

Int32 SQLISP_EXIT(SP_DLL_HANDLE)
{
  //cout << "in SQLISP_EXIT" << endl;
  return 1;
}
