/* TPCB_nsp v.1.0.1 Programma per effettuare la transazione standard (TPC-B) senza stored procedures Il suo utilizzo consente di effettuare prove parametriche sull'utilizzo di Oracle in parallelo da parte di piu' utenti. Questo test utilizza statement SQL, lo standard consente l'utilizzo di stored procedures che sono piu' efficenti, questo programma consente di valutare l'impatto dell'uso diretto di statement SQL in embedded C. Si tratta di 5 statement a transazione. Copyright (C) meo@bogliolo.name */ #include #include #include EXEC SQL BEGIN DECLARE SECTION; /* Branch ID */ int Bid; /* Teller ID */ int Tid; /* Account ID */ int Aid; /* Delta Money!!! */ int delta; /* Current Money */ double Abalance; VARCHAR username[40]; VARCHAR passwd[40]; VARCHAR connstr[40]; EXEC SQL END DECLARE SECTION; int i; int ntimes; int sleeptime; int logging; int scale; /* EXEC SQL INCLUDE ; */ void sqlerror(); main(argc, argv) int argc; char **argv; { if (argc != 7) { if (argc != 8) { printf("TPC-B for Oracle database: version 1.0.1 - SQL\n"); printf("Usage: submit user passwd connect sleeptime times log [scale] \n"); exit(2); } } sscanf(argv[4], "%d", &sleeptime); sscanf(argv[5], "%d", &ntimes); sscanf(argv[6], "%d", &logging); if (argc == 7) { scale=1; } else { sscanf(argv[7], "%d", &scale); } if ( ntimes < 1 ) { printf("Usage: submit user passwd connect sleeptime times log [scale] \n"); printf("times must be more than 0\n"); exit(2); } if ( sleeptime < 0 ) { printf("Usage: submit user passwd connect sleeptime times log [scale] \n"); printf("sleeptime must be more or equal than 0\n"); exit(2); } if ( scale < 1 ) { printf("Usage: submit user passwd connect sleeptime times log [scale] \n"); printf("scale must be more than 0\n"); exit(2); } srand(getpid()); strcpy(username.arr, argv[1]); /* copy the username */ username.len = strlen(username.arr); strcpy(passwd.arr, argv[2]); /* copy the password */ passwd.len = strlen(passwd.arr); strcpy(connstr.arr, argv[3]); /* copy the connection string */ connstr.len = strlen(connstr.arr); EXEC SQL WHENEVER SQLERROR DO sqlerror(); EXEC SQL CONNECT :username IDENTIFIED BY :passwd USING :connstr; while (ntimes--) { sleep(sleeptime); Bid = rand(); Bid = Bid - Bid/scale*scale; Tid = rand(); Tid = Tid - Tid/10*10; Tid = Tid + 10*Bid; Aid = rand(); Aid = Aid - Aid/100000*100000; Aid = Aid + 100000*Bid; delta = rand(); delta = delta - delta/2000000*2000000; delta = delta - 1000000; EXE SQL UPDATE accounts SET Abalance = Abalance + :delta WHERE Aid = :Aid; EXE SQL SELECT Abalance INTO :Abalance FROM accounts WHERE Aid = :Aid; EXE SQL UPDATE tellers SET Tbalance = Tbalance + :delta WHERE Tid = :Tid; EXE SQL UPDATE branches SET Bbalance = Bbalance + :delta WHERE Bid = :Bid ; EXE SQL INSERT INTO history (Tid,Bid,Aid,delta,Xtime) VALUES (:Tid, :Bid, :Aid, :delta, SYSDATE); EXEC SQL COMMIT WORK; } EXEC SQL COMMIT WORK RELEASE; exit(0); } void sqlerror() { EXEC SQL WHENEVER SQLERROR CONTINUE; printf("\nORACLE error detected:\n"); printf("\n% .70s \n", sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK RELEASE; exit(1); }