⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tpcc.c

📁 oracle数据库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 + -