blob: 37b8498d34c6994c1425bc0242dec430ab44d641 [file] [log] [blame]
/**********************************************************************
// @@@ 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: SqlciRWSimulator.cpp
* Description: Methods to implement RW_MXCI commands until the real code
* from RW is available.
*
*
* Created: 6/6/2003
* Language: C++
* Status:
*
*
*
*
*****************************************************************************
*/
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include "sqlcmd.h"
#include "SqlciRWCmd.h"
#include "RWInterface.h"
#include "Formatter.h"
class ReportWriterEnv
{
public:
ReportWriterEnv();
~ReportWriterEnv();
char* &headingRow() { return headingRow_; };
char* &footingRow() { return footingRow_; };
char* &underline() { return underline_; };
char* &inputRow() { return inputRow_; };
Lng32 &headingRowNum() { return headingRowNum_; }
Lng32 &footingRowNum() { return footingRowNum_; }
private:
char * headingRow_;
char * underline_;
char * inputRow_;
Lng32 headingRowNum_;
char * footingRow_;
Lng32 footingRowNum_;
};
ReportWriterEnv::ReportWriterEnv()
: headingRow_(NULL), underline_(NULL),
headingRowNum_(-1),
footingRow_(NULL), footingRowNum_(-1)
{
}
ReportWriterEnv::~ReportWriterEnv()
{
if (headingRow_)
delete headingRow_;
if (footingRow_)
delete footingRow_;
if (underline_)
delete underline_;
}
Lng32 RW_MXCI_Constructor (void* &RWEnv, void *SqlciEnv)
{
ReportWriterEnv * rwEnv = new ReportWriterEnv();
RWEnv = rwEnv;
return 0;
}
Lng32 RW_MXCI_Destructor (void* &RWEnv, void *sqlciEnv)
{
SqlciEnv * sqlci_env = (SqlciEnv *)sqlciEnv;
delete (ReportWriterEnv *)RWEnv;
return SUCCESS;
}
Lng32 RW_MXCI_sendQuery (void* &RWEnv, void *sqlciEnv, char *query, Lng32 len)
{
ReportWriterEnv * rwEnv = (ReportWriterEnv *)RWEnv;
SqlciEnv * sqlci_env = (SqlciEnv *)sqlciEnv;
if (strncmp(query, "rw reset_list", 13) == 0)
return RESET_LIST;
else
return SEND_QUERY;
}
Lng32 RW_MXCI_sendInputRow (void* &RWEnv, void* sqlciEnv, char *input_row, Lng32 len)
{
ReportWriterEnv * rwEnv = (ReportWriterEnv *)RWEnv;
SqlciEnv * sqlci_env = (SqlciEnv *)sqlciEnv;
rwEnv->inputRow() = input_row;
return GET_OUTPUT_ROW;
}
static Lng32 RWformatRow(void* &RWEnv,
void *sqlciEnv, char* &output_row, Lng32 &len)
{
ReportWriterEnv * rwEnv = (ReportWriterEnv *)RWEnv;
Lng32 max;
ErrorValue *e = NULL;
char * buf;
char * tgt;
Lng32 error = MXCI_RW_allocateHeap (sqlciEnv, 200, buf);
Lng32 error1 = MXCI_RW_allocateHeap (sqlciEnv, 600, tgt);
if (error)
return ERR;
MXCI_RW_getMaxColumns (sqlciEnv, max, e);
Lng32 curpos = 0;
AttributeDetails * entry = NULL;
for (short column=1; column <= max; column++)
{
MXCI_RW_getColInfo(sqlciEnv, column,
entry, e);
char * ptr = NULL;
MXCI_RW_getColAddr (sqlciEnv, column, rwEnv->inputRow(),
len, ptr, e);
char dateFmtBuf[30];
if (getenv("RW_DATEFORMAT") &&
entry->dataType_ == 192)
{
char * d = getenv("RW_DATEFORMAT");
DateTimeFormat dt = EUROPEAN;
if (strcmp(d, "DEFAULT") == 0)
dt = DEFAULT;
else if (strcmp(d, "USA") == 0)
dt = USA;
else if (strcmp(d, "EUROPEAN") == 0)
dt = EUROPEAN;
error = MXCI_RW_convertToDateFormat(sqlciEnv, ptr, entry,
dateFmtBuf, entry,
dt,
e);
ptr = dateFmtBuf;
}
Formatter::buffer_it((SqlciEnv *)sqlciEnv, ptr,
entry->dataType_,
entry->length_,
entry->precision_,
entry->scale_,
NULL,
entry->displayLen_,
entry->displayLen_,
entry->nullable_,
&buf[curpos], &curpos,
column < max, //separatorNeeded
TRUE); //checkShowNonPrinting
}
/*//Unicode test case # 1
NAWchar Buf1[50];
Buf1[0]=0x00F8; // from 11_lt2u.h
Buf1[1]=0x0042; // regular ascii character
long input_len1 = 4 ; // 2 * 2 = 4 ; 2 bytes per wide char
NAWchar out_buf1[6];
long out_len1 = 6;
long retcode = MXCI_RW_unicodeConvertToUpper(sqlciEnv,(char*)Buf1,input_len1, (char*)out_buf1, out_len1, e);
// Unicode test case # 2
NAWchar *Buf2 = L"ABCD EFG";
long input_len2 = wcslen(Buf2);
NAWchar out_buf2[100];
long out_len2 = 100;
long retcode2 = MXCI_RW_unicodeConvertToUpper(sqlciEnv,(char*)Buf2,input_len2, (char*)out_buf2, out_len2, e);
// Unicode test case # 3
NAWchar Buf3[50];
Buf3[0]=0x00D8; // from 11_ut2l.h
Buf3[1]=0x0042; // regular ascii character
long input_len3 = 4 ; // 2 * 2 = 4 ; 2 bytes per wide char
NAWchar out_buf3[6];
long out_len3 = 6;
long retcode3 = MXCI_RW_unicodeConvertToLower(sqlciEnv,(char*)Buf3,input_len3, (char*)out_buf3, out_len3, e);
// Unicode test case # 4
NAWchar *Buf4 = L"ABCD EFG";
long input_len4 = wcslen(Buf2);
NAWchar out_buf4[100];
long out_len4 = 100;
long retcode4 = MXCI_RW_unicodeConvertToLower(sqlciEnv,(char*)Buf4,input_len4, (char*)out_buf4, out_len4, e);
*/
/* // ConvDoIt test case
AttributeDetails *srcEntry = new AttributeDetails;
AttributeDetails *tgtEntry = new AttributeDetails;
char srcPtr[20] = "FAN";
char tgtPtr[20] ;
ErrorValue *err = NULL;
srcEntry->nullable_= 1;
srcEntry->dataType_= 0;
srcEntry->precision_=0;
srcEntry->scale_=0;
tgtEntry->nullable_=1;
tgtEntry->dataType_=0;
tgtEntry->precision_=0;
tgtEntry->scale_=0;
short formatting = 0;
long retcode = MXCI_RW_convDoIt(sqlciEnv, srcPtr, srcEntry, tgtPtr, tgtEntry, formatting, err);
*/
buf[curpos] = 0;
output_row = buf; // memory leak here but who cares, this is a simulator.
len = curpos;
if (e)
{
delete e;
e = NULL;
}
return 0;
}
Lng32 RW_MXCI_getOutputRow (void* &RWEnv, void *sqlciEnv, char* &output_row, Lng32 &len)
{
SqlciEnv * sqlci_env = (SqlciEnv *)sqlciEnv;
ReportWriterEnv * rwEnv = (ReportWriterEnv *)RWEnv;
if (rwEnv->headingRowNum() == 0)
{
output_row = rwEnv->headingRow();
len = strlen(rwEnv->headingRow());
rwEnv->headingRowNum()++;
return GET_OUTPUT_ROW;
}
else if (rwEnv->headingRowNum() == 1)
{
output_row = rwEnv->underline();
len = strlen(rwEnv->underline());
rwEnv->headingRowNum() = -1;
return SEND_INPUT_ROW;
}
else if (rwEnv->footingRowNum() == 0)
{
output_row = rwEnv->footingRow();
len = strlen(rwEnv->footingRow());
rwEnv->footingRowNum() = -1;
return DONE;
}
/*
PrepStmt * prepStmt = sqlci_env->sqlciRWEnv()->rwExe()->prepStmt();
SqlCmd::displayRow(sqlci_env, prepStmt);
output_row = prepStmt->outputBuf();
len = prepStmt->outputBuflen();
*/
RWformatRow(RWEnv, sqlciEnv, output_row, len);
return SEND_INPUT_ROW;
}
Lng32 RW_MXCI_sendSelectStatus (void* &RWEnv, void *sqlciEnv, Lng32 num_rows, SelectStatus status)
{
Lng32 retcode = 0;
ReportWriterEnv * rwEnv = (ReportWriterEnv *)RWEnv;
SqlciEnv * sqlci_env = (SqlciEnv *)sqlciEnv;
ErrorValue * e = NULL;
if (getenv("RW_SEND_SELECT_STATUS_ERR"))
{
return ERR;
}
if ((status == LIST_FIRST_STARTED) ||
(status == LIST_ALL_STARTED))
{
// compute heading
PrepStmt * prepStmt = sqlci_env->sqlciRWEnv()->rwExe()->prepStmt();
Lng32 output_buflen = prepStmt->outputBuflen();
rwEnv->headingRow() = new char[output_buflen + 1];
rwEnv->underline() = new char[output_buflen + 1];
retcode =
SqlCmd::getHeadingInfo(sqlci_env, prepStmt,
rwEnv->headingRow(), rwEnv->underline());
rwEnv->headingRowNum() = 0;
return GET_OUTPUT_ROW;
}
if (status == LIST_ENDED)
return SEND_QUERY;
else if (status == SELECT_ENDED)
return DONE;
else if (status == SELECT_CANCELLED)
{
rwEnv->footingRow() = new char[78];
strcpy(rwEnv->footingRow(), "Report Cancelled!");
rwEnv->footingRowNum() = 0;
return GET_OUTPUT_ROW;
}
else
return SEND_INPUT_ROW;
}
Lng32 RW_MXCI_getErrorInfo (void* &RWEnv, void *sqlciEnv, ErrorValue *e)
{
e->errorCode_ = 666;
return SUCCESS;
}
Lng32 RW_MXCI_sendOutputDevice (void* &RWEnv, void *sqlciEnv, OutputDevice device)
{
if (device == LOG_FILE || device == SCREEN)
return SUCCESS;
else
return ERR;
}