📄 oracle_db8.c
字号:
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 + -