コード例 #1
0
ファイル: mvtest.c プロジェクト: carriercomm/opensource-cobol
int
main (int iArgc, char **ppcArgv)
{
	int	iResult,
		iLoop,
		iLoop2,
		iLoop3,
		iHandle;
	unsigned char
		cRecord [256];
	struct	keydesc
		sKeydesc;
	char	cLogfileName [100],
		cCommand [100];
	char	cFileName [] = "IsamTest";

	memset (&sKeydesc, 0, sizeof (sKeydesc));
	sKeydesc.k_flags = COMPRESS;
	sKeydesc.k_nparts = 1;
	sKeydesc.k_start = 0;
	sKeydesc.k_leng = 2;
	sKeydesc.k_type = CHARTYPE;

	if (iArgc == 1) {
		printf ("Usage:\n\t%s create\nOR\n\t%s <#iterations>\n", ppcArgv [0], ppcArgv [0]);
		exit (1);
	}

	if (iArgc > 1 && strcmp (ppcArgv [1], "create") == 0) {
		iserase (cFileName);
		iHandle = isbuild (cFileName, 255, &sKeydesc, ISINOUT+ISFIXLEN+ISEXCLLOCK);
		if (iHandle < 0) {
			printf ("Error creating database: %d\n", iserrno);
			exit (-1);
		}
		sKeydesc.k_flags |= ISDUPS;
	sKeydesc.k_start = 3;
	sKeydesc.k_leng = 4;
		for (sKeydesc.k_start = 1; sKeydesc.k_start < 2; sKeydesc.k_start++) {
			if (isaddindex (iHandle, &sKeydesc)) {
				printf ("Error %d adding index %d\n", iserrno, sKeydesc.k_start);
			}
		}
		isclose (iHandle);
		sprintf (cLogfileName, "RECOVER");
#ifdef	_WIN32
		sprintf (cCommand, "del /f /q %s", cLogfileName);
#else
		sprintf (cCommand, "rm -f %s; touch %s", cLogfileName, cLogfileName);
#endif
		system (cCommand);
		return (0);
	}
	sprintf (cLogfileName, "RECOVER");
#ifdef	_WIN32
	iResult = open("RECOVER", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0666);
#else
	iResult = open("RECOVER", O_CREAT | O_TRUNC | O_RDWR, 0666);
#endif
	close(iResult);
	iResult = islogopen (cLogfileName);
	if (iResult < 0) {
		printf ("Error opening log: %d\n", iserrno);
		exit (-1);
	}

/*
	srand (time (NULL));
*/
	srand (9);
	for (iLoop = 0; iLoop < atoi (ppcArgv [1]); iLoop++)
	{
		if (!(iLoop % 100)) {
			printf ("iLoop=%d\n", iLoop);
			fflush(stdout);
		}

		iVBDlCount = 0;
		iVBRdCount = 0;
		iVBUpCount = 0;
		iVBWrCount = 0;
		iResult = isbegin ();
		if (iResult < 0) {
			printf ("Error begin transaction: %d\n", iserrno);
			exit (-1);
		}
		iHandle = isopen (cFileName, ISINOUT+ISFIXLEN+ISTRANS+ISAUTOLOCK);
		if (iHandle < 0) {
			printf ("Error opening database: %d\n", iserrno);
			exit (-1);
		}

		for (iLoop2 = 0; iLoop2 < 100; iLoop2++)
		{
			for (iLoop3 = 0; iLoop3 < 256; iLoop3++) {
				cRecord [iLoop3] = rand () % 256;
			}

			iResult =rand () % 4;
/*
			fprintf(stderr, "I %d\n", iResult);
*/
			switch (iResult) {
			case	0:
				if ((iResult = iswrite (iHandle, (char *) cRecord)) != 0) {
					if (iserrno != EDUPL && iserrno != ELOCKED) {
						printf ("Error writing: %d\n", iserrno);
						goto err;
					}
				} else {
					iVBWrCount++;
				}
				break;

			case	1:
				if ((iResult = isread (iHandle, (char *)cRecord, ISEQUAL)) != 0) {
					if (iserrno == ELOCKED) {
						; /* printf ("Locked during deletion\n"); */
					} else if (iserrno != ENOREC) {
						printf ("Error reading: %d\n", iserrno);
						goto err;
					}
				} else {
					iVBRdCount++;
				}
				break;

			case	2:
				for (iLoop3 = 0; iLoop3 < 256; iLoop3++) {
					cRecord [iLoop3] = rand () % 256;
				}
				if ((iResult = isrewrite (iHandle, (char *)cRecord)) != 0) {
					if (iserrno == ELOCKED) {
						; /* printf ("Locked during rewrite\n"); */
					} else if (iserrno != ENOREC) {
						printf ("Error rewriting: %d\n", iserrno);
						goto err;
					}
				} else {
					iVBUpCount++;
				}
				break;

			case	3:
				if ((iResult = isdelete (iHandle, (char *)cRecord)) != 0) {
					if (iserrno == ELOCKED) {
						; /* printf ("Locked during deletion\n"); */
					} else if (iserrno != ENOREC) {
						printf ("Error deleting: %d\n", iserrno);
						goto err;
					}
				}
				else
					iVBDlCount++;
				break;
			}
		}

		iResult = isflush (iHandle);
		if (iResult < 0) {
			printf ("Error flush: %d\n", iserrno);
			exit (-1);
		}
		iResult = isclose (iHandle);
		if (iResult < 0) {
			printf ("Error closing database: %d\n", iserrno);
			exit (-1);
		}

		iVBDlTotal += iVBDlCount;
		iVBRdTotal += iVBRdCount;
		iVBUpTotal += iVBUpCount;
		iVBWrTotal += iVBWrCount;
		switch (rand () % 2) {
		case	0:
			iVBDlCommit += iVBDlCount;
			iVBRdCommit += iVBRdCount;
			iVBUpCommit += iVBUpCount;
			iVBWrCommit += iVBWrCount;
			iResult = iscommit ();
			if (iResult < 0) {
				printf ("Error commit: %d\n", iserrno);
				exit (-1);
			}
			break;

		case	1:
			iResult = isrollback ();
			if (iResult < 0) {
				if (iserrno == EDUPL || iserrno == ENOREC) {
					printf ("Same BUG (%d) as in C-ISAM!\n", iserrno);
				} else {
					printf ("Error rollback: %d\n", iserrno);
					exit (-1);
				}
			}
			break;
		}
	}
err:
	printf ("                 Total Commited\n");
	printf ("              -------- --------\n");
	printf ("Delete Count: %8d %8d\n", iVBDlTotal, iVBDlCommit);
	printf ("Read   Count: %8d %8d\n", iVBRdTotal, iVBRdCommit);
	printf ("Update Count: %8d %8d\n", iVBUpTotal, iVBUpCommit);
	printf ("Write  Count: %8d %8d\n", iVBWrTotal, iVBWrCommit);
	printf ("              -------- --------\n");
	printf ("OPS OVERALL : %8d %8d\n", (iVBDlTotal + iVBRdTotal + iVBUpTotal + iVBWrTotal), (iVBDlCommit + iVBRdCommit + iVBUpCommit + iVBWrCommit));
	printf ("                       ========\n");
	printf ("ROWS ADDED THIS RUN:   %8d\n", (iVBWrCommit - iVBDlCommit));
	printf ("                       ========\n");
	return (iResult);
}
コード例 #2
0
ファイル: fileisam.c プロジェクト: cooljeanius/tinycobol
/*
//
//  ISAM rewrite
//
*/
int tcob_rewrite_idx(struct file_desc *f, struct fld_desc *rectofrom_desc, char *rectofrom_buf,
                     struct fld_desc *reclen_desc, char *reclen_buf) 
{
  int iresult, r=0, reclen;
  tcb_fileio_vbidx_handle *h;
  char *crecord;

#ifdef DEBUG_FILEISAM_RTS7
  fprintf(stderr, "debug : tcob_rewrite_idx 100.080 : \n");
#endif                                       

  /* ERROR check : File is open */
  if (f->dbp == NULL)
     RETURN_STATUS(49);
  
  /* ERROR check : Record length is valid - unknown error */
  if (f->reclen == -1)
     RETURN_STATUS(99);
  
  /* ERROR check : Must in IO mode */
  if (f->open_mode != TCB_FILE_OPEN_MODE_IO)
     RETURN_STATUS(49);
  
  /* Check that we didn't already hit eof */
  if ((f->open_mode == TCB_FILE_OPEN_MODE_IO) && f->flags.eof_hit)
     RETURN_STATUS(43);
  
  /* Error check : If access mode is SEQUENTIAL the read done flag must be set to TRUE */
  if ((f->access_mode == TCB_FILE_ACCESS_MODE_SEQUENTIAL) && 
      (f->flags.read_done == 0))  
     RETURN_STATUS(39);

  h = (tcb_fileio_vbidx_handle *)f->dbp;
  crecord = h->buf->buf[0]; 

  /* Error check : Access mode SEQUENTIAL and primary KEY */
  /* The PREVIOUS READ primary KEY must be equal to primary KEY in record */
  if (f->access_mode == TCB_FILE_ACCESS_MODE_SEQUENTIAL) { 
     int sresult, startpos, poslen;
     tcob_file_key *k;
      
     k = f->keys;
     startpos = k->offset;
     poslen   = k->key_desc->len;    
     
     /* Compare keys */
     sresult = strncmp(crecord+startpos, f->record+startpos, poslen);
     if (sresult != 0)
        RETURN_STATUS(30);
  }
  
  /* Variable length record */                  
  if (reclen_desc != NULL) {
     /* Convert record to int type */
     tcob_move(reclen_desc, reclen_buf, &_generic_4binary, (char *)&reclen);     
     if (reclen > f->reclen) 
        RETURN_STATUS(99);
     isreclen = reclen;
  }
  else {
     reclen = f->reclen;
  }

  /* Copy write buffer data to record and FROM identifier buffer */
  if (rectofrom_desc != NULL) {
     memset(f->record, ' ', f->reclen);
     if (rectofrom_desc->len > f->reclen) 
        memcpy(f->record, rectofrom_buf, f->reclen);
     else
        memcpy(f->record, rectofrom_buf, rectofrom_desc->len);
  }
  memcpy(crecord, f->record, reclen);

  /* rewrite record */
  iresult = isrewrite(h->ifilehandle, crecord);
  /* Set return code depending on VB iserrno */
  if (iresult != 0) 
     r = tcob_eisam2ecob(0);

#ifdef DEBUG_FILEISAM_RTS7
  fprintf(stderr, "debug : tcob_rewrite_idx 100.080 : file status(r)=%d, iserrno=%d\n", r, iserrno);
#endif

  f->flags.read_done = 0;
  f->flags.start_record = 0; 

  RETURN_STATUS(r);

}