home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: Product
/
Product.zip
/
DBDEMO.ZIP
/
DEMOFLS.ZIP
/
RBLOCK.SQC
< prev
next >
Wrap
Text File
|
1991-06-30
|
7KB
|
187 lines
/************************************************************************/
/* DATABASE PERFORMANCE CONCEPTS AND TECHNIQUES DEMONSTRATION PROGRAM */
/* MODULE: RECORD BLOCKING */
/* source file: RBLOCK.SQC */
/************************************************************************/
/************************************************************************/
/* HEADER FILES - USER DEFINED */
/************************************************************************/
#include "db.h"
/************************************************************************/
/* FUNCTION PROTOTYPES */
/************************************************************************/
short far rblockno();
int exit_err(void);
int blocking(void);
struct timeb dbeg, dend;
extern double qtime_noblock; // filled in rblockno()
double qtime_block;
/***************************************************************************/
/* 1. rblock */
/* 2. block */
/***************************************************************************/
/*************************************************/
/* SQL HOST VARIABLE DECLARATIONS */
/*************************************************/
EXEC SQL BEGIN DECLARE SECTION;
double balance;
short num_rows;
EXEC SQL END DECLARE SECTION;
/************************************************************************/
/* FUNCTION rblock() */
/* This function calls the functions blocking() and noblock(), */
/* num_run times. */
/* gets the timing info from external variables qtime_block and */
/* qtime_noblock and applies the averaging logic, depending upon */
/* user entered variable num_runs. */
/* i.e. if num_runs = 1 then q1avg = qtime_block and q2avg=qtime_noblock*/
/* otherwise, it disregards the first value and averages the rest */
/************************************************************************/
short far rblock()
{
short i;
qtime_block = 0.0; // initialize timing variable
q1avg = 0.0;
q2avg = 0.0;
// call the functions num_runs time
for (i=1; i<=num_runs; i++)
{
if (blocking())
return(3);
if (i!=1)
q1avg =q1avg + qtime_block;
}/*end for */
if (num_runs==1)
q1avg = qtime_block;
else
q1avg = q1avg/(num_runs-1);
// SET THE NUMBER OF DEMOS FOR THIS SECTION = 2 !!!!
Timetext[0].test_num = 2;
// FILL UP TIMETEXT STRUCTURE FOR DEMO 1
strcpy(Timetext[0].demoname,"Record Blocking");
Timetext[0].demotime = q1avg;
Timetext[0].rows = num_rows;
qtime_noblock = 0.0;
for (i=1; i<=num_runs; i++)
{
if (rblockno())
return(3);
if (i!=1)
q2avg =q2avg + qtime_noblock;
}/*end for */
if (num_runs==1)
q2avg = qtime_noblock;
else
q2avg = q2avg/(num_runs-1);
// SET THE NUMBER OF DEMOS FOR THIS SECTION 1 OR 2.. 2 IS MAX!!!!
// FILL UP TIMETEXT STRUCTURE FOR DEMO 2
strcpy(Timetext[1].demoname,"No Blocking ");
Timetext[1].demotime = q2avg;
Timetext[1].rows = num_rows;
/* sqlestop(&sqlca); */ /* stop databse manager */
return(0);
}/* end main */
/***************************************************************************/
/* blocking */
/***************************************************************************/
/************************************************************************/
/* FUNCTION blocking */
/* Calculates the median value of CU_ENDBAL column from CHECKING TABLE */
/* uses record blocking because this module has been precompiled and */
/* bound with /K= ALL option */
/************************************************************************/
int blocking()
{
char error_from[20]; // used for debugging to chk which query errored
short cur_row; // which row the cursor is on
qtime_block = 0.0; // initialize timing variable
/*** SQL error handling ***/
EXEC SQL WHENEVER SQLERROR GO TO error;
EXEC SQL WHENEVER NOT FOUND GO TO ext;
/*** Find the total number of rows ***/
strcpy(error_from,"select count * ");
ftime (&dbeg);
EXEC SQL SELECT COUNT(*)
INTO :num_rows
FROM BMCHUGH.CHECKING;
ftime(&dend);
qtime_block += delta(dbeg.time, dend.time, dbeg.millitm, dend.millitm);
/* printf("\ntotal number of rows = %d", num_rows);
*/
/****** DECLARE CURSOR *********/
strcpy(error_from," declare cursor");
ftime (&dbeg);
EXEC SQL DECLARE CBLOCK CURSOR FOR
SELECT C_ENDBAL FROM BMCHUGH.CHECKING
ORDER BY C_ENDBAL;
ftime(&dend);
qtime_block += delta(dbeg.time, dend.time, dbeg.millitm, dend.millitm);
/****** OPEN CURSOR *********/
strcpy(error_from," open cursor");
ftime (&dbeg);
EXEC SQL OPEN CBLOCK;
ftime(&dend);
qtime_block += delta(dbeg.time, dend.time, dbeg.millitm, dend.millitm);
cur_row = 1;
/****** FETCH num_rows/2 ROWS *********/
while ((sqlca.sqlcode == 0) && (cur_row <= num_rows/2) ) {
cur_row++;
ftime (&dbeg);
EXEC SQL FETCH CBLOCK
INTO :balance;
ftime(&dend);
qtime_block += delta(dbeg.time, dend.time, dbeg.millitm, dend.millitm);
/* printf("%7.3f\n", balance);
*/
}/*end while more rows */
/****** CLOSE CURSOR *********/
ftime (&dbeg);
EXEC SQL CLOSE CBLOCK;
ftime(&dend);
qtime_block += delta(dbeg.time, dend.time, dbeg.millitm, dend.millitm);
/* printf("\nmedian balance = %7.3f",balance);
printf("\ntotal time = %7.3f", qtime_block);
*/
ext:
return(0);
error:
/* get_error( &sqlca, error_from);
*/
error_sql = sqlca.sqlcode;
return(-1);
}/* end blocking */