📄 tpcc.c
字号:
/***************************
tpcc.c
***************************/
/*+ FILE: TPCC.C
* Microsoft TPC-C Kit Ver. 3.00.000
* Audited 08/23/96 By Francois Raab
*
* Copyright Microsoft, 1996
* Copyright Digital Equipment Corp., 1997
*
* PURPOSE: Main module for TPCC.DLL which is an ISAPI
service dll.
* Author: Philip Durr
* philipdu@Microsoft.com
*
* MODIFICATIONS:
*
* Routines substantially modified by:
* Anne Bradley Digital Equipment
Corp.
* Bill Carr Digital Equipment Corp.
*
*/
/*+****************************************************************
**********
*
*
* COPYRIGHT (c) 1997 BY
*
* DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASSACHUSETTS.
*
* ALL RIGHTS RESERVED.
*
*
*
* THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED *
* ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE *
* INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER *
* COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY *
* OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY *
* TRANSFERRED.
*
*
*
* THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE *
* AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT *
* CORPORATION.
*
*
*
* DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS *
* SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
*
*
*
*
*
*******************************************************************
*********/
/*
*
*
* Modification history:
*
*
* 08/01/2002 Andrew Bond, HP
* - Conversion to run under Linux and Apache
*
*/
#include <stdio.h>
#include <stdarg.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "apr_thread_mutex.h"
#include <oci.h>
#include <ocidfn.h>
#include <ociapr.h>
#define TPCC_C
#include <tpccerr.h>
#include <tpccstruct.h>
#include <oracle_db8.h>
#include <tpccapi.h>
#include <tpcc.h>
#include <mod_tpcc.h>
#define _strupr(x) { \
int strupr_pos; \
for (strupr_pos=0; strupr_pos <
strlen(x);strupr_pos++) \
x[strupr_pos] = toupper(x[strupr_pos]); \
}
/* FUNCTION: void FormatString(char *szDest, char *szPic, char *szSrc)
*
* PURPOSE: This function formats a character string for inclusion in the
* HTML formatted page being constructed.
*
* ARGUMENTS: char *szDest Destination buffer where
*
formatted string is to be * placed
* char *szPic picture string which describes
* how character value is to be
* formatted.
* char *szSrc character string value.
*
* RETURNS: None
*
* COMMENTS: This functions is used to format TPC-C phone and zip value
* strings.
*
*/
void FormatString(char *szDest, char *szPic, char *szSrc)
{
while( *szPic )
{
if ( *szPic == 'X' )
{
if ( *szSrc )
*szDest++ = *szSrc++;
else
*szDest++ = ' ';
}
else
*szDest++ = *szPic;
szPic++;
}
*szDest = 0;
return;
}
/* FUNCTION: int ParseNewOrderQuery( char *pProcessedQuery[],
* NewOrderData
*pNewOrderData )
*
* PURPOSE: This function extracts and validates the new order query
* from an http command string.
*
* ARGUMENTS: char *pProcessedQuery[] array of char*
that points to
* the value of each name-value
* pair.
* NewOrderData *pNewOrderData pointer to new order data
* structure
*
* RETURNS: int ERR_SUCCESS input data successfully parsed
* error_code reason for failure
*
* COMMENTS: None
*
*/
int ParseNewOrderQuery(char *pQueryString, NewOrderData *pNewOrderData)
{
char *ptr;
int i;
short items;
char *pProcessedQuery[MAXNEWORDERVALS];
PARSE_QUERY_STRING(pQueryString, MAXNEWORDERVALS,newOrderStrs, pProcessedQuery);
if ( !GetValuePtr(pProcessedQuery, DID, &ptr) )
return ERR_NEWORDER_FORM_MISSING_DID;
GetNumeric(ptr, &pNewOrderData->d_id);
if(0 == pNewOrderData->d_id)
return ERR_NEWORDER_DISTRICT_INVALID;
if ( !GetValuePtr(pProcessedQuery, CID, &ptr) )
return ERR_NEWORDER_CUSTOMER_KEY;
if( !GetNumeric(ptr, &pNewOrderData->c_id))
return ERR_NEWORDER_CUSTOMER_INVALID;
pNewOrderData->o_all_local = 1;
for(i=0, items=0; i<15; i++)
{
if( !GetValuePtr(pProcessedQuery, i*3+IID00, &ptr))
return ERR_NEWORDER_MISSING_IID_KEY;
if(*ptr != '&' && *ptr)
{
if(!GetNumeric(ptr, &pNewOrderData->o_ol[items].ol_i_id))
return ERR_NEWORDER_ITEMID_INVALID;
if(!GetValuePtr(pProcessedQuery, i*3+SP00, &ptr))
return ERR_NEWORDER_MISSING_SUPPW_KEY;
if(!GetNumeric(ptr, &pNewOrderData->o_ol[items].ol_supply_w_id))
return ERR_NEWORDER_SUPPW_INVALID;
if ( pNewOrderData->o_all_local && pNewOrderData->o_ol[items].ol_supply_w_id !=pNewOrderData->w_id )
pNewOrderData->o_all_local = 0;
if(!GetValuePtr(pProcessedQuery, i*3+QTY00, &ptr))
return ERR_NEWORDER_MISSING_QTY_KEY;
if(!GetNumeric(ptr, &pNewOrderData->o_ol[items].ol_quantity))
return ERR_NEWORDER_QTY_INVALID;
if ( pNewOrderData->o_ol[items].ol_i_id >= 1000000 || pNewOrderData->o_ol[items].ol_i_id < 1 )
return ERR_NEWORDER_ITEMID_RANGE;
if ( pNewOrderData->o_ol[items].ol_quantity >= 100 || pNewOrderData->o_ol[items].ol_quantity < 1 )
return ERR_NEWORDER_QTY_RANGE;
items++;
}
else
{
if(!GetValuePtr(pProcessedQuery, i*3+SP00, &ptr))
return ERR_NEWORDER_MISSING_SUPPW_KEY;
if(*ptr != '&' && *ptr)
return ERR_NEWORDER_SUPPW_WITHOUT_ITEMID;
if(!GetValuePtr(pProcessedQuery, i*3+QTY00, &ptr))
return ERR_NEWORDER_MISSING_QTY_KEY;
if(*ptr != '&' && *ptr)
return ERR_NEWORDER_QTY_WITHOUT_ITEMID;
}
}
if ( items == 0 )
return ERR_NEWORDER_NOITEMS_ENTERED;
pNewOrderData->o_ol_cnt = items;
return ERR_SUCCESS;
}
/* FUNCTION: int ParseOrderStatusQuery( char *pProcessedQuery[],
* OrderStatusData *pOrderStatusData )
*
* PURPOSE: This function extracts and validates the order status query
* from an http command string.
*
* ARGUMENTS: char *pProcessedQuery[] array of char
* that points to
* the value of each name-value
* pair.
* OrderStatusData *pOrderStatusData pointer to new order data
* structure
*
* RETURNS: int ERR_SUCCESS input data successfully parsed
* error_code reason for failure
*
* COMMENTS: None
*
*/
int ParseOrderStatusQuery(char *pQueryString,OrderStatusData *pOrderStatusData)
{
char szTmp[26];
char *ptr;
char *pSzTmp;
char *pProcessedQuery[MAXORDERSTATUSVALS];
PARSE_QUERY_STRING(pQueryString, MAXORDERSTATUSVALS,orderStatusStrs, pProcessedQuery);
if ( !GetValuePtr(pProcessedQuery, DID, &ptr) )
return ERR_ORDERSTATUS_MISSING_DID_KEY;
if ( !GetNumeric(ptr, &pOrderStatusData->d_id) )
return ERR_ORDERSTATUS_DID_INVALID;
if ( !GetValuePtr(pProcessedQuery, CID, &ptr) )
return ERR_ORDERSTATUS_MISSING_CID_KEY;
if ( *ptr == '&' || !(*ptr))
{
pSzTmp = szTmp;
pOrderStatusData->c_id = 0;
if ( !GetValuePtr(pProcessedQuery, CLT_O, &ptr) )
return ERR_ORDERSTATUS_MISSING_CLT_KEY;
while(*ptr != '&' && *ptr)
{
*pSzTmp = *ptr;
pSzTmp++;
ptr++;
}
*pSzTmp = '\0';
_strupr( szTmp );
strcpy(pOrderStatusData->c_last, szTmp);
if ( strlen(pOrderStatusData->c_last) > 16 )
return ERR_ORDERSTATUS_CLT_RANGE;
}
else
{
if (!GetNumeric(ptr, &pOrderStatusData->c_id))
return ERR_ORDERSTATUS_CID_INVALID;
if ( !GetValuePtr(pProcessedQuery, CLT_O, &ptr) )
return ERR_ORDERSTATUS_MISSING_CLT_KEY;
if ( *ptr != '&' && *ptr)
return ERR_ORDERSTATUS_CID_AND_CLT;
}
return ERR_SUCCESS;
}
/* FUNCTION: int ParsePaymentQuery( char *pProcessedQuery[],
* PaymentData *pPaymentData )
*
* PURPOSE: This function extracts and validates the payment query
* from an http command string.
*
* ARGUMENTS: char *pProcessedQuery[] array of char*that points to
* the value of each name-value
* pair.
* PaymentData *pPaymentData pointer to payment data
* structure
*
* RETURNS: int ERR_SUCCESS input data successfully parsed
* error_code reason for failure
*
* COMMENTS: None
*
*/
int ParsePaymentQuery(char *pQueryString, PaymentData *pPaymentData)
{
char szTmp[26];
char *ptr;
char *pPtr;
char *pSzTmp;
char *pProcessedQuery[MAXPAYMENTVALS];
PARSE_QUERY_STRING(pQueryString, MAXPAYMENTVALS,paymentStrs, pProcessedQuery);
if ( !GetValuePtr(pProcessedQuery, DID, &ptr) )
return ERR_PAYMENT_MISSING_DID_KEY;
if ( !GetNumeric(ptr, &pPaymentData->d_id) )
return ERR_PAYMENT_DISTRICT_INVALID;
if ( !GetValuePtr(pProcessedQuery, CID, &ptr) )
return ERR_PAYMENT_MISSING_CID_KEY;
if(*ptr == '&' || !(*ptr))
{
pPaymentData->c_id = 0;
pSzTmp = szTmp;
if ( !GetValuePtr(pProcessedQuery, CLT_P, &ptr) )
return ERR_PAYMENT_MISSING_CLT;
if (*ptr == '&' || !(*ptr))
return ERR_PAYMENT_MISSING_CID_CLT;
while(*ptr != '&' && *ptr)
{
*pSzTmp = *ptr;
pSzTmp++;
ptr++;
}
*pSzTmp = '\0';
_strupr( szTmp );
strcpy(pPaymentData->c_last, szTmp);
if ( strlen(pPaymentData->c_last) > 16 )
return ERR_PAYMENT_LAST_NAME_TO_LONG;
}
else
{
if (!GetNumeric(ptr, &pPaymentData->c_id))
return ERR_PAYMENT_CUSTOMER_INVALID;
if ( !GetValuePtr(pProcessedQuery, CLT_P, &ptr) )
return ERR_PAYMENT_MISSING_CLT_KEY;
if(*ptr != '&' && *ptr)
return ERR_PAYMENT_CID_AND_CLT;
}
if ( !GetValuePtr(pProcessedQuery, CDI, &ptr) )
return ERR_PAYMENT_MISSING_CDI_KEY;
if ( !GetNumeric(ptr, &pPaymentData->c_d_id) )
return ERR_PAYMENT_CDI_INVALID;
if ( !GetValuePtr(pProcessedQuery, CWI, &ptr) )
return ERR_PAYMENT_MISSING_CWI_KEY;
if ( !GetNumeric(ptr, &pPaymentData->c_w_id) )
return ERR_PAYMENT_CWI_INVALID;
if ( !GetValuePtr(pProcessedQuery, HAM, &ptr) )
return ERR_PAYMENT_MISSING_HAM_KEY;
pPtr = ptr;
while( *pPtr != '&' && *pPtr)
{
if ( *pPtr == '.' )
{
pPtr++;
if ( !*pPtr )
break;
if ( *pPtr < '0' || *pPtr > '9' )
return ERR_PAYMENT_HAM_INVALID;
pPtr++;
if ( !*pPtr )
break;
if ( *pPtr < '0' || *pPtr > '9' )
return ERR_PAYMENT_HAM_INVALID;
if ( !*pPtr )
return ERR_PAYMENT_HAM_INVALID;
}
else if ( *pPtr < '0' || *pPtr > '9' )
return ERR_PAYMENT_HAM_INVALID;
pPtr++;
}
pPaymentData->h_amount = atof(ptr);
if ( pPaymentData->h_amount >= 10000.00 || pPaymentData->h_amount< 0 )
return ERR_PAYMENT_HAM_RANGE;
return ERR_SUCCESS;
}
/* FUNCTION: BOOL ReadRegistrySettings(void)
*
* PURPOSE: This function reads the Linux TPCC configuration file for
* startup parameters.
*
* ARGUMENTS: None
*
* RETURNS: None
*
* COMMENTS: This function also sets up required operation variables to
* their default value so if registry is not setup the default
* values will be used.
*
*/
int ReadRegistrySettings(void)
{
char szTmp[FILENAMESIZE];
int status;
int iTmp;
status = GetConfigValue("PATH", (char *)&szTmp);
if ( status != ERROR_SUCCESS )
return ERR_CANT_FIND_PATH_VALUE;
strcpy(szTpccLogPath, szTmp);
status = GetConfigValue("Server", (char *)&szTmp);
if ( status != ERROR_SUCCESS )
/* required */
return ERR_CANT_FIND_SERVER_VALUE;
strcpy(gszServer, szTmp);
status = GetConfigValue("Database", (char *)&szTmp);
if ( status != ERROR_SUCCESS )
/* required */
return ERR_CANT_FIND_DATABASE_VALUE;
strcpy(gszDatabase, szTmp);
status = GetConfigValue("User", (char *)&szTmp);
if ( status != ERROR_SUCCESS )
/* required */
return ERR_CANT_FIND_USER_VALUE;
strcpy(gszUser, szTmp);
status = GetConfigValue("Password", (char *)&szTmp);
if ( status != ERROR_SUCCESS )
/* required */
return ERR_CANT_FIND_PASSWORD_VALUE;
strcpy(gszPassword, szTmp);
status = GetConfigValue("LOG", (char *)&szTmp);
if ( status == ERROR_SUCCESS && 0 == strcmp(szTmp, "ON") )
bLog = TRUE;
status = GetConfigValue("MaxConnections", (char *)&szTmp);
if ( status == ERROR_SUCCESS && 0 != (iTmp = atoi(szTmp)) )
iMaxConnections = iTmp;
return ERR_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -