?? oracle_db8.c
字號(hào):
/***************************
oracle_db8.c
***************************/
/*+ file: oracle_db8.c based on Oracle file tpccpl.c */
/*+================================================================
=+
| Copyright (c) 1994 Oracle Corp, Redwood Shores, CA
|
| OPEN SYSTEMS PERFORMANCE GROUP
|
| All Rights Reserved
|
+==================================================================
+
| DESCRIPTION
| TPC-C transactions in PL/SQL.
+=================================================================-
*/
/*+****************************************************************
**********
*
*
* COPYRIGHT (c) 1998 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.
*
*
*
*
*
*******************************************************************
*********/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <asm/atomic.h>
#include <linux/spinlock.h>
#include <oci.h>
#include <ocidfn.h>
#include <ociapr.h>
#define ORACLE_DB_C
#include <tpccerr.h>
#include <tpccstruct.h>
#include <oracle_db8.h>
#include <tpccapi.h>
#include <tpcc.h>
#define DEADLOCKRETRIES 6
static int bTpccExit; /* exit delivery disconnect loop as dll exiting. */
static spinlock_t ErrorLogCriticalSection;
char szErrorLogName[256];
char szOraLogName[256];
char szOraErrorLogName[256];
/* prototypes */
int ORAReadRegistrySettings(void);
void vgetdate (unsigned char *oradt) ;
void cvtdmy (unsigned char *oradt, char *outdate);
void cvtdmyhms (unsigned char *oradt, char *outdate);
FILE *vopen(char *fnam, char *mode)
{
FILE *fd;
#ifdef DEBUG
TPCCErr("tkvuopen() fnam: %s, mode: %s\n", fnam, mode);
#endif
fd = fopen((char *)fnam,(char *)mode);
if (!fd)
{
TPCCErr(" fopen on %s failed %d\n",fnam,fd); /* exit(-1); */
}
return(fd);
}
int sqlfile(char *fnam, text *linebuf)
{
FILE *fd;
int nulpt = 0;
#ifdef DEBUG
TPCCErr("sqlfile() fnam: %s, linebuf: %#x\n", fnam, linebuf);
#endif
fd = vopen(fnam,"r");
if(NULLP == fd)
{
return(ERR_DB_ERROR);
}
while (fgets((char *)linebuf+nulpt, SQL_BUF_SIZE,fd))
{
nulpt = strlen((char *)linebuf);
}
return(nulpt);
}
int getfile(char *filename, text *filebuf)
{
text parsbuf[SQL_BUF_SIZE];
strcpy(parsbuf, szTpccLogPath);
strcat(parsbuf, filename);
return(sqlfile(parsbuf, filebuf));
}
int TPCCStartupDB()
{
#ifdef DEBUG_TPCCSTARTUPDB
_ASSERT(FALSE);
#endif
spin_lock_init(&ErrorLogCriticalSection);
return ERR_DB_SUCCESS;
}
int TPCCShutdownDB(void)
{
bTpccExit = TRUE; /* Add Oracle specific code */
return ERR_DB_SUCCESS;
}
int ocierror(char *fname, int lineno, OraContext *p, sword status)
{
text errbuf[512];
text tempbuf[512];
sb4 errcode;
OCIError *errhp;
errhp = p->errhp;
switch (status){
case OCI_SUCCESS:
return RECOVERR;
break;
case OCI_SUCCESS_WITH_INFO:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
strcat(errbuf, "Error - OCI_SUCCESS_WITH_INFO\r\n");
break;
case OCI_NEED_DATA:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
strcat(errbuf, "Error - OCI_NEED_DATA\r\n");
break;
case OCI_NO_DATA:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
sprintf(errbuf, "Error - OCI_NO_DATA\r\n");
break;
case OCI_ERROR:
(void) OCIErrorGet (errhp, (ub4) 1,(text *) NULL, &errcode, tempbuf,
(ub4) sizeof(errbuf),OCI_HTYPE_ERROR);
switch(errcode){
case NOT_SERIALIZABLE:
/* if error is NOT_SERIALIZABLE return without writing anything*/
return errcode;
case DEADLOCK:
TPCCErr("Warning Deadlock, being retried");
return RECOVERR;
case SNAPSHOT_TOO_OLD:/* SNAPSHOT_TOO_OLD is considered recoverable */
TPCCErr("Error snapshot too old: %s", tempbuf);
return RECOVERR;
default:/* else write a message *//* All else are irrecoverable */
TPCCErr("Module %s Line %d\r\nError - %s\r\n",fname, lineno, tempbuf);
return errcode;
}
/* vmm313 TPCCDisconnectDB(p); */
/* vmm313 exit(1); */
break;
case OCI_INVALID_HANDLE:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
strcat(errbuf, "Error - OCI_INVALID_HANDLE\r\n");
TPCCErr("%s", errbuf);
TPCCDisconnectDB(p, NULL);
return IRRECERR;
/* terminate(-1); */
/* exit(-1); */
break;
case OCI_STILL_EXECUTING:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
strcat(errbuf, "Error - OCI_STILL_EXECUTE\r\n");
break;
case OCI_CONTINUE:
sprintf(errbuf, "Module %s Line %d\r\n", fname, lineno);
strcat(errbuf, "Error - OCI_CONTINUE\r\n");
break;
default:
break;
}
TPCCErr("%s", errbuf);
return RECOVERR;
}
/* FUNCTION: int TPCCConnectDB(CallersContext *pCC, int iTermId,
int iSyncId,
* OraContext **dbproc, char *server, char *database, char *user,
* char *password, char *app, int *spid, long *pack_size)
*
* PURPOSE: This function opens the sql connection for use.
*
* ARGUMENTS: CallersContext *pCC passed in structure pointer from inetsrv.
* int iTermId terminal id of browser
* int iSyncId sync id of browser
* OraContext **dbproc pointer to returned OraContext
* char *server SQL server name
* char *database SQL server database
* char *user user name
* char *password user password
* char *app pointer to returned application array
* int *spid pointer to returned spid
* long *pack_size pointer to returned default pack size
*
* RETURNS: int 0 if successful
* 1 if an error occurs
*
* COMMENTS: None
*
*/
int TPCCConnectDB(OraContext **dbproc, pLoginData pLogin)
{
#define SERIAL_TXT "alter session set isolation_level =serializable"
#ifdef SQL_TRACE
#define SQLTXT1 "alter session set sql_trace = true"
#endif/* Add Oracle specific code */
text stmbuf[100];
OraContext *p;
char userstr[256];
*dbproc = (OraContext *) malloc(sizeof(OraContext));
p = *dbproc;/* initialize flags to not initialized */
p->new_init = 0;
p->pay_init = 0;
p->ord_init = 0;
p->sto_init = 0;
p->del_init = 0;
sprintf(userstr,"%s/%s@%s",pLogin->szUser,pLogin->szPassword,pLogin->szServer);
OCIEnvCreate(&(p->tpcenv), OCI_DEFAULT | OCI_OBJECT, NULL, NULL,NULL, NULL, (size_t) 0, NULL);
OCIHandleAlloc((dvoid *)p->tpcenv, (dvoid **)&(p->tpcsrv),OCI_HTYPE_SERVER,0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)p->tpcenv, (dvoid **)&(p->errhp),OCI_HTYPE_ERROR,0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)p->tpcenv, (dvoid **)&(p->datecvterrhp),OCI_HTYPE_ERROR,0 , (dvoid **)0);
OCIHandleAlloc((dvoid *)p->tpcenv, (dvoid **)&(p->tpcsvc),OCI_HTYPE_SVCCTX,0 , (dvoid **)0);
if (RECOVERR != (OCIERROR(p, OCIServerAttach(p->tpcsrv, p->errhp,(text *)0,0, OCI_DEFAULT))))
/* return IRRECERR; */
return ERR_DB_ERROR;
/*OCIERROR(p, OCIServerAttach(p->tpcsrv, p->errhp,userstr,
strlen(userstr),OCI_DEFAULT));*/
/*{
return IRRECERR;
}
*/
OCIAttrSet((dvoid *)p->tpcsvc, OCI_HTYPE_SVCCTX, (dvoid *)p->tpcsrv,(ub4)0, OCI_ATTR_SERVER, p->errhp);
OCIHandleAlloc((dvoid *)p->tpcenv, (dvoid **)&(p->tpcusr),OCI_HTYPE_SESSION,0 , (dvoid **)0);
OCIAttrSet((dvoid *)p->tpcusr, OCI_HTYPE_SESSION, (dvoid *)pLogin->szUser,
(ub4)strlen(pLogin->szUser),OCI_ATTR_USERNAME, p->errhp);
OCIAttrSet((dvoid *)p->tpcusr, OCI_HTYPE_SESSION,(dvoid *)pLogin->szPassword,
(ub4)strlen(pLogin->szPassword), OCI_ATTR_PASSWORD,p->errhp);
if (RECOVERR != (OCIERROR(p, OCISessionBegin(p->tpcsvc, p->errhp,p->tpcusr,OCI_CRED_RDBMS,OCI_DEFAULT))))
return (ERR_DB_ERROR);
OCIAttrSet(p->tpcsvc, OCI_HTYPE_SVCCTX, p->tpcusr, 0,OCI_ATTR_SESSION,p->errhp);
/* run all transaction in serializable mode */
OCIHandleAlloc(p->tpcenv, (dvoid **)&(p->curi), OCI_HTYPE_STMT, 0,(dvoid**)0);
sprintf ((char *) stmbuf, SERIAL_TXT);
OCIStmtPrepare(p->curi, p->errhp, stmbuf, strlen((char *)stmbuf),OCI_NTV_SYNTAX, OCI_DEFAULT);
if (RECOVERR != OCIERROR(p, OCIStmtExecute(p->tpcsvc, p->curi, p->errhp,1, 0, 0, 0,OCI_DEFAULT)))
return (ERR_DB_ERROR);
OCIHandleFree(p->curi, OCI_HTYPE_STMT);
#ifdef SQL_TRACE/* Turn on the SQL_TRACE */
OCIHandleAlloc(p->tpcenv, (dvoid **)&(p->curi), OCI_HTYPE_STMT,0, &xmem);
sprintf ((char *) stmbuf, TRACE_TXT);
OCIStmtPrepare(p->curi, p->errhp, stmbuf, strlen((char *)stmbuf),OCI_NTV_SYNTAX, OCI_DEFAULT);
if (RECOVERR != OCIERROR(p, OCIStmtExecute(p->tpcsvc, p->curi, p->errhp,1, 0, 0, 0,OCI_DEFAULT)))
return(ERR_DB_ERROR);
OCIHandleFree((dvoid *)p->curi, OCI_HTYPE_STMT);
#endif /* End SQL_TRACE */
/**** logon = 1;***/
if (tkvcninit (&(p->bindvars.info.newOrder), p))
{
TPCCDisconnectDB (p, NULL);
return ERR_DB_ERROR;
}
else
p->new_init = 1;
if (tkvcpinit (&(p->bindvars.info.payment), p))
{
TPCCDisconnectDB (p, NULL);
return ERR_DB_ERROR;
}
else
p->pay_init = 1;
if (tkvcoinit (&(p->bindvars.info.orderStatus), p))
{
TPCCDisconnectDB (p, NULL);
return ERR_DB_ERROR;
}
else
p->ord_init = 1;
if (tkvcsinit (&(p->bindvars.info.stockLevel), p))
{
TPCCDisconnectDB (p, NULL);
return ERR_DB_ERROR;
}
else
p->sto_init = 1;
if (tkvcdinit (&(p->bindvars.info.delivery), p))
{
TPCCDisconnectDB (p, NULL);
return ERR_DB_ERROR;
}
else
p->del_init = 1;
return ERR_DB_SUCCESS;
}
/* FUNCTION: int TPCCDisconnectDB(OraContext *dbproc)
*
* PURPOSE: This function closes the sql connection.
*
* ARGUMENTS:
* OraContext *dbproc pointer to OraContext
*
* RETURNS: int ERR_DB_SUCCESS if successfull
* error value if an error occurs
*
* COMMENTS: None
*
*/
int TPCCDisconnectDB(OraContext *dbproc, CallersContext *pCC)
{
/* Add Oracle specific code */
if (1 == dbproc->new_init)
{
tkvcndone(&(dbproc->nctx));
dbproc->new_init = 0;
}
if (1 == dbproc->pay_init)
{
tkvcpdone(&(dbproc->pctx));
dbproc->pay_init = 0;
}
if (1 == dbproc->ord_init)
{
tkvcodone(&(dbproc->octx));
dbproc->ord_init = 0;
}
if (1 == dbproc->sto_init)
{
tkvcsdone(&(dbproc->sctx));
dbproc->sto_init = 0;
}
if (1 == dbproc->del_init)
{
tkvcddone(&(dbproc->dctx));
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -