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

📄 oracle_db8.c

📁 oracle数据库tpcc(在线事务处理能力)测试的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
      dbproc->del_init = 0;
   }
   OCIHandleFree((dvoid *)dbproc->tpcusr, OCI_HTYPE_SESSION);
   OCIHandleFree((dvoid *)dbproc->tpcsvc, OCI_HTYPE_SVCCTX);
   OCIHandleFree((dvoid *)dbproc->errhp, OCI_HTYPE_ERROR);
   OCIHandleFree((dvoid *)dbproc->datecvterrhp, OCI_HTYPE_ERROR);
   OCIHandleFree((dvoid *)dbproc->tpcsrv, OCI_HTYPE_SERVER);
   OCIHandleFree((dvoid *)dbproc->tpcenv, OCI_HTYPE_ENV);
   #ifdef BATCH_DEL
      if (lfp) 
      {
	 fclose (lfp);
	 lfp = NULL;
      }
   #endif /* BATCH_DEL */
   return ERR_DB_SUCCESS;
}

/* FUNCTION: TPCCStockLevelDB(CallersContext *pCC, int
iTermId, int iSyncId, OraContext *dbproc, int deadlock_retry,
StockLevelData *pStockLevel)
*
* PURPOSE: This function handles the stock level transaction.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* StockLevelData *pStockLevel stock level input / output data structure
* int deadlock_retry retry count if deadlocked
*
* RETURNS: int ERR_DB_SUCCCESS if successfull
* error value if deadlocked
*
* COMMENTS: None
*
*/

int TPCCStockLevelDB(OraContext *dbproc, pStockLevelData pStockLevel)
{
   int tries,status;
   StockLevelData *pbindvars;
   pbindvars = &dbproc->bindvars.info.stockLevel;
   memcpy(pbindvars, pStockLevel, sizeof(StockLevelData));
   for ( tries = 0,status = RECOVERR;tries < DEADLOCKRETRIES && status == RECOVERR; tries++)
   {
      status = tkvcs(dbproc);
   }
   pStockLevel->low_stock = dbproc->bindvars.info.stockLevel.low_stock;
   if (status == RECOVERR) return ERR_DB_DEADLOCK_LIMIT;
   else return (status);
}
/* FUNCTION: int TPCCNewOrderDB(CallersContext *pCC, int iTermId,
int iSyncId, int iTermId, int iSyncId, OraContext *dbproc, int
deadlock_retry, NewOrderData *pNewOrder)
*
* PURPOSE: This function handles the new order transaction.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* NewOrderData *pNewOrder pointer to new order structure for input/output data
* int deadlock_retry retry count if deadlocked
*
* RETURNS: int ERR_DB_SUCCESS transaction committed
* ERR_DB_NOT_COMMITTED item number is not valid
* ERR_DB_DEADLOCK_LIMIT deadlock max retry reached
* ERR_DB_ERROR
*
*
* COMMENTS: None
*
*/
#pragma message ("FIXME: return code is overloaded. How to report invalid item number?")
int TPCCNewOrderDB( OraContext *dbproc, pNewOrderData pNewOrder)
{
   int tries,status;
   int ii;
   int jj;
   int datebufsize;
   OCIError *datecvterrhp = dbproc->datecvterrhp;
   unsigned char localcr_date[7];
   NewOrderData *pbindvars = &(dbproc->bindvars.info.newOrder);
   newctx *nctx = &(dbproc->nctx);
   newtemp *ntemp = &(dbproc->tempvars.new);
   /* vgetdate(&ntemp->cr_date); */
   vgetdate(localcr_date);
   cvtdmyhms(localcr_date,ntemp->entry_date);
   OCIDateFromText(datecvterrhp,ntemp->entry_date,strlen(ntemp->entry_date),"DD-MM-YYYY HH24:MI:SS",21,(text *) 0,0,&ntemp->cr_date);
   ntemp->n_retry = 0;
   memcpy(pbindvars, pNewOrder, sizeof(NewOrderData));
   for(jj= 0; jj<MAX_OL; jj++)
   {
      ntemp->nol_i_id[jj] = pbindvars->o_ol[jj].ol_i_id;
      ntemp->nol_supply_w_id[jj] = pbindvars->o_ol[jj].ol_supply_w_id;
      ntemp->nol_quantity[jj] = pbindvars->o_ol[jj].ol_quantity;
   }
   for ( tries = 0,status = RECOVERR;tries < DEADLOCKRETRIES && status == RECOVERR; tries++)
   {
      status = tkvcn(&dbproc->bindvars.info.newOrder, dbproc);
   }
   memcpy(pNewOrder, pbindvars, sizeof(NewOrderData));
   /* convert and/or copy data to our structure format */
   pNewOrder->c_discount = ntemp->c_discount*100.0;
   pNewOrder->w_tax = (float)ntemp->w_tax*100.0;
   pNewOrder->d_tax = (float)ntemp->d_tax*100.0;
   for (ii = 0; ii < pNewOrder->o_ol_cnt; ii++)
   {
      pNewOrder->o_ol[ii].ol_i_id = ntemp->nol_i_id[ii];
      pNewOrder->o_ol[ii].ol_supply_w_id = ntemp->nol_supply_w_id[ii];
      pNewOrder->o_ol[ii].ol_quantity = ntemp->nol_quantity[ii];
      strncpy(pNewOrder->o_ol[ii].i_name, ntemp->i_name[ii], 24);
      pNewOrder->o_ol[ii].s_quantity = ntemp->s_quantity[ii];
      pNewOrder->o_ol[ii].i_price = ntemp->i_price[ii]/100.0;
      pNewOrder->o_ol[ii].ol_amount = ntemp->nol_amount[ii]/100.0;
      pNewOrder->o_ol[ii].b_g[0]=ntemp->brand_generic[ii];
   }
   /* datebufsize = the size of entry_date in newtemp struct */
   datebufsize=21;
   /* datebufsize=sizeof(ntemp->entry_date); */
   /* OCIDateToText(datecvterrhp, &ntemp->cr_date,(text *) "DD-MMYYYY
      HH:MM:SS", 19, (text *) 0, 0, &datebufsize, &ntemp->entry_date); */
   /* cvtdmyhms(ntemp->cr_date, ntemp->entry_date); */
   pNewOrder->o_entry_d.day = atoi(&(ntemp->entry_date[0]));
   pNewOrder->o_entry_d.month = atoi(&(ntemp->entry_date[3]));
   pNewOrder->o_entry_d.year = atoi(&(ntemp->entry_date[6]));
   pNewOrder->o_entry_d.hour = atoi(&(ntemp->entry_date[11]));
   pNewOrder->o_entry_d.minute = atoi(&(ntemp->entry_date[14]));
   pNewOrder->o_entry_d.second = atoi(&(ntemp->entry_date[17]));
   if (status == RECOVERR) return ERR_DB_DEADLOCK_LIMIT;
   else return (status);
}
/* FUNCTION: int TPCCPaymentDB(CallersContext *pCC, int iTermId,
int iSyncId, OraContext *dbproc, int deadlock_retry, PaymentData
*pPayment)
*
* PURPOSE: This function handles the payment transaction.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* PaymentData *pPayment pointer to payment input/output data structure
* int deadlock_retry deadlock retry count
*
* RETURNS: int ERR_DB_SUCCESS success
* ERR_DB_DEADLOCK_LIMIT max deadlocked reached
* ERR_DB_NOT_COMMITED invalid data entry
*
* COMMENTS: None
*
*/
int TPCCPaymentDB(OraContext *dbproc, pPaymentData pPayment)
{
   int tries; 
   int status;
   int datebufsize;
   float ftmp;
   OCIError *datecvterrhp = dbproc->datecvterrhp;
   PaymentData *pbindvars = &(dbproc->bindvars.info.payment);
   payctx *pctx = &(dbproc->pctx);
   paytemp *ptemp = &(dbproc->tempvars.pay);
   ptemp->p_retry = 0;
   memcpy(pbindvars, pPayment, sizeof(PaymentData));
   /* the db is stored in pennies - convert input to cents. */
   ftmp=pbindvars->h_amount*100;
   ptemp->h_amount = (int)(ftmp);
   for ( tries = 0,status = RECOVERR;tries < DEADLOCKRETRIES && status == RECOVERR; tries++) 
   {
      if ((pbindvars->c_id) == 0) 
      {
         (pbindvars->byname) = TRUE;
      }
      else 
      {
	 (pbindvars->byname) = FALSE;
      }
      status = tkvcp(&dbproc->bindvars.info.payment, dbproc);
   }
   memcpy(pPayment, pbindvars, sizeof(PaymentData));
   /* datebufsize = the size of c_since_str in paytemp struct */
   datebufsize=11;
   /* convert date format */
   /* OCIDateToText(datecvterr, &ptemp->customer_sdate,(text *) 0,
   10, (text *) 0, 0, &datebufsize, &ptemp->c_since_str); */
   OCIDateToText(datecvterrhp, &ptemp->customer_sdate,(text *) "DDMM-YYYY", 10, (text *) 0, 0, &datebufsize, &ptemp->c_since_str);
   /* cvtdmy(ptemp->customer_sdate, ptemp->c_since_str); */
   /* datebufsize = the size of h_date string in paytemp struct */
   datebufsize=DATE_SIZ;
   /* OCIDateToText(datecvterrhp, &ptemp->cr_date,(text *) "DD-MMYYYY.
   HH24:MI:SS", 21, (text *) 0, 0, &datebufsize, &ptemp->h_date);*/
   pPayment->c_credit_lim = ptemp->c_credit_lim/100.0;
   pPayment->c_discount = ptemp->c_discount*100.0;
   pPayment->c_balance = pPayment->c_balance/100.0;
   pPayment->h_amount = ptemp->h_amount/100.0;
   pPayment->c_since.day = atoi(&(ptemp->c_since_str[0]));
   pPayment->c_since.month = atoi(&(ptemp->c_since_str[3]));
   pPayment->c_since.year = atoi(&(ptemp->c_since_str[6]));
   pPayment->h_date.day = atoi(&(ptemp->h_date[0]));
   pPayment->h_date.month = atoi(&(ptemp->h_date[3]));
   pPayment->h_date.year = atoi(&(ptemp->h_date[6]));
   pPayment->h_date.hour = atoi(&(ptemp->h_date[11]));
   pPayment->h_date.minute = atoi(&(ptemp->h_date[14]));
   pPayment->h_date.second = atoi(&(ptemp->h_date[17]));
   if (status == RECOVERR) return ERR_DB_DEADLOCK_LIMIT;
   else return (status);
}
/* FUNCTION: int TPCCOrderStatusDB(CallersContext *pCC, int
iTermId, int iSyncId, OraContext *dbproc, int deadlock_retry,
OrderStatusData *pOrderStatus)
*
* PURPOSE: This function processes the Order Status transaction.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* OrderStatusData *pOrderStatus pointer to Order Status data input/output structure
* int deadlock_retry deadlock retry count
*
* RETURNS: int ERR_DB_DEADLOCK_LIMIT max deadlock reached
* ERR_DB_NOT_COMMITED No orders found for customer
* ERR_DB_SUCCESS Transaction successfull
*
* COMMENTS: None
*
*/
int TPCCOrderStatusDB(OraContext *dbproc, pOrderStatusData pOrderStatus)
{
   int tries,status;
   int ii;
   OrderStatusData *pbindvars = &(dbproc->bindvars.info.orderStatus);
   ordtemp *otemp = &(dbproc->tempvars.ord);
   OCIError *datecvterrhp = dbproc->datecvterrhp;
   memcpy(pbindvars, pOrderStatus, sizeof(OrderStatusData));
   for ( tries = 0,status = RECOVERR;tries < DEADLOCKRETRIES && status == RECOVERR; tries++) 
   {
      if ((pbindvars->c_id) == 0) 
      {
         (pbindvars->byname) = TRUE;
      }
      else 
      {
         (pbindvars->byname) = FALSE;
      }
      status = tkvco(&dbproc->bindvars.info.orderStatus, dbproc);
   }
   if (status == ERR_DB_ERROR) return status;
   memcpy(pOrderStatus,pbindvars, sizeof(OrderStatusData));
   for (ii=0; ii < pOrderStatus->o_ol_cnt; ii++)
   {
      pOrderStatus->s_ol[ii].ol_supply_w_id = otemp->loc_ol_supply_w_id[ii];
      pOrderStatus->s_ol[ii].ol_i_id = otemp->loc_ol_i_id[ii];
      pOrderStatus->s_ol[ii].ol_quantity = otemp->loc_ol_quantity[ii];
      pOrderStatus->s_ol[ii].ol_amount = otemp->loc_ol_amount[ii]/100.0;
      pOrderStatus->s_ol[ii].ol_delivery_d.day = atoi(&(otemp->ol_delivery_date_str[ii][0]));
      pOrderStatus->s_ol[ii].ol_delivery_d.month = atoi(&(otemp->ol_delivery_date_str[ii][3]));
      pOrderStatus->s_ol[ii].ol_delivery_d.year = atoi(&(otemp->ol_delivery_date_str[ii][6]));
   }
   pOrderStatus->c_balance = pOrderStatus->c_balance/100.0;
   pOrderStatus->o_entry_d.day = atoi(&(otemp->entry_date_str[0]));
   pOrderStatus->o_entry_d.month = atoi(&(otemp->entry_date_str[3]));
   pOrderStatus->o_entry_d.year = atoi(&(otemp->entry_date_str[6]));
   pOrderStatus->o_entry_d.hour = atoi(&(otemp->entry_date_str[11]));
   pOrderStatus->o_entry_d.minute = atoi(&(otemp->entry_date_str[14]));
   pOrderStatus->o_entry_d.second = atoi(&(otemp->entry_date_str[17]));
   if (status == RECOVERR) return ERR_DB_DEADLOCK_LIMIT;
   else return (status);
}
/* FUNCTION: int TPCCDeliveryDB( CallersContext *pCC, int iConnectionID,
* int iSyncID, DBContext *pdbContext,
* int deadlock_retry, pDeliveryData pDelivery )
*
* PURPOSE: This function writes the delivery information to the
* delivery pipe. The information is sent as a long.
*
* ARGUMENTS: CallersContext *pCC passed in structure
* pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* int deadlock_retry deadlock retry count
* DeliveryData *pDelivery pointer to Delivery data
* input/output structure
*
* RETURNS: int ERR_DB_SUCCESS success
* ERR_DB_DEADLOCK_LIMIT max deadlocked reached
* ERR_DB_NOT_COMMITED other error
*
* COMMENTS: The pipe is initially created with 16K buffer size this
* should allow for up to 4096 deliveries
* to be queued before an overflow condition would occur.
* The only reason that an overflow would occur is if the delivery
* application stopped listening while deliveries were being
* posted.
*
*/
int TPCCDeliveryDB( OraContext *dbproc, pDeliveryData pDeliveryData)
{
   int retries = 0;
   int status;
   DeliveryData *pbindvars;
   pbindvars = &dbproc->bindvars.info.delivery;
   memcpy(pbindvars, pDeliveryData, sizeof(DeliveryData));
   for (retries = 0, status = RECOVERR;retries < DEADLOCKRETRIES &&status == RECOVERR; retries++)
   {
      status = tkvcd(pDeliveryData, dbproc);
   }
   if(status == RECOVERR) return ERR_DB_DEADLOCK_LIMIT;
   else return (status);
}
int TPCCGetLastDBErrorDB(OraContext *dbproc)
{
/* Add Oracle specific code */
return ERR_DB_SUCCESS;
}
/* FUNCTION: int TPCCCheckpointDB(CallersContext *pCC, int iTermId,
int iSyncId, OraContext *dbproc, int deadlock_retry, Checkpoint
*pCheckpoint
*
* PURPOSE: This function does a checkpoinnt transaction.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer
* from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext *dbproc connection db process id
* Checkpoint *Checkpoint pointer to Checkpoint data
* int deadlock_retry deadlock retry count
*
* RETURNS: int ERR_DB_DEADLOCK_LIMIT max deadlock reached
* ERR_DB_NOT_COMMITED No orders found for customer
* ERR_DB_SUCCESS Transaction successfull
*
* COMMENTS: None
*
*/
#define CHECKPOINT_TXT "alter system switch logfile"
int TPCCCheckpointDB (OraContext *dbproc, pCheckpointData pCheckpoint ) 
{
   text stmbuf[100];
   OCIHandleAlloc(dbproc->tpcenv, (dvoid **)&(dbproc->curi),OCI_HTYPE_STMT,0, (dvoid**)0);
   sprintf ((char *) stmbuf, CHECKPOINT_TXT);
   OCIERROR(dbproc, OCIStmtPrepare(dbproc->curi, dbproc->errhp,stmbuf,
            strlen((char *)stmbuf),OCI_NTV_SYNTAX,OCI_DEFAULT));
   if (RECOVERR != OCIERROR(dbproc,OCIStmtExecute(dbproc->tpcsvc,dbproc->curi,
						  dbproc->errhp,1, 0, 0, 0,OCI_DEFAULT)))
      return (ERR_DB_ERROR);
   OCIHandleFree(dbproc->curi, OCI_HTYPE_STMT);
   return ERR_DB_SUCCESS;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -