Example #1
0
int
idxopen (unit *ftnunit, char *name, int create, flag idxerr)
{
   struct dictinfo info;
   int             mode =(ftnunit->ureadonly ? ISINPUT : ISINOUT) +
   (ftnunit->ushared ? ISAUTOLOCK : ISEXCLLOCK);
   register int    i;

   keys = ftnunit->ukeys;
   if (create) {
      if (ftnunit->url == 0)
	 err (idxerr, 153, "indexed open");
      if (ftnunit->unkeys == 0 || keys == NULL)
	 err (idxerr, 161, "indexed open");
      onekey.k_flags = ISNODUPS;
      KEYOFF (0)--;
      KEYEND (0)--;
      dokey (0, ONEKEY);
      if (ftnunit->unkeys == 1) {
	/* DLAI: need to change isbuild 2nd arg to XINT */
	 if ((ftnunit->isfd = isbuild (name, ftnunit->url, &onekey, mode)) < SUCCESS)
	    ierr (idxerr, iserrno, "indexed open");
      } else {
	 if ((ftnunit->isfd =
	      isbuild (name, ftnunit->url, &onekey, ISINOUT + ISEXCLLOCK)) < SUCCESS)
	    ierr (idxerr, iserrno, "indexed open");
	 onekey.k_flags = ISDUPS;
	 for (i = 1; i < ftnunit->unkeys; i++) {
	    KEYOFF (i)--;
	    KEYEND (i)--;
	    dokey (i, ONEKEY);
	    if (isaddindex (ftnunit->isfd, &onekey) < SUCCESS)
	       ierr (idxerr, iserrno, "indexed open");
	 }
	 if (ftnunit->ushared) {
	    if (isclose (ftnunit->isfd) < SUCCESS)
	       ierr (idxerr, iserrno, "indexed open");
	    if ((ftnunit->isfd = isopen (name, mode)) < SUCCESS)
	       ierr (idxerr, iserrno, "indexed open");
	 }
      }
   } else {
      if ((ftnunit->isfd = isopen (name, mode)) < SUCCESS)
	 ierr (idxerr, iserrno, "indexed open");
      if (isindexinfo (ftnunit->isfd, &info, 0) < SUCCESS)
	 ierr (idxerr, iserrno, "indexed open");
      if (ftnunit->unkeys != info.di_nkeys) {
	 if (ftnunit->unkeys) {
	    err (idxerr, 148, "indexed open");
	 } else
	    ftnunit->unkeys = info.di_nkeys;
      }
      if (!keys)
	 keys = (Keyspec *) malloc (sizeof (Keyspec) * info.di_nkeys);
      for (i = 0; i < info.di_nkeys; i++) {
	 if (isindexinfo (ftnunit->isfd, &onekey, i + 1) < SUCCESS)
	    ierr (idxerr, iserrno, "indexed open");
/* LHL 5/4/89
 * To fix bug 4428, problem about trying to open an existing indexed file.
 * This is put here because when the indexed file is created, the keys
 * are being stored like this.  Refer to the above code.
 */
	 KEYOFF (i)--;
	 KEYEND (i)--;
/* end of fix */
	 if (ftnunit->ukeys && dokey (i, NOMATCH)) {
	    err (idxerr, 148, "indexed open");
	 } else
	    dokey (i, UNITKEY);
      }
      ftnunit->url = info.di_recsize;
      ftnunit->ukeys = keys;
   }
   return SUCCESS;
}
Example #2
0
/*
//
//  ISAM - verify ISAM structures
//
*/
int tcob_verify_vbidx(struct file_desc *f, int ifilehandle)
{
  int r=0, /*numkeys,*/ i;
  short numkeys=0;
  //tcb_fileio_vbidx_handle *h;
  tcob_file_key *k;   
  struct dictinfo info;
  struct keydesc wkeydesc;  
  
  //h = (tcb_fileio_vbidx_handle *)f->dbp;

  isindexinfo(ifilehandle, &info, 0);

  /* NOTE: First test assumes 1 byte (ASCII) char-set */
  /* Verify the record length */
#ifdef DEBUG_FILEISAM_RTS10
  fprintf(stderr, "debug : tcob_verify_vbidx 250.100 : f->reclen=%d, f->reclen_min=%d, isreclen=%d, info.di_recsize=%d;\n", 
                   f->reclen, f->reclen_min, isreclen, info.di_recsize);
#endif                                       
  if (f->reclen != info.di_recsize) 
     r = 1;
      
  /* NOTE: When the record type is variable the MSB is set.
     The xISAM manual uses 0x7fff as a mask, but VB-ISAM requires 0xff7f on x86-32. */
  /* Verify the record type (variable or fixed) structure */
  if (r == 0) {
     /* Verify the record type has a variable type structure */
     if (f->reclen_min != 0) {
        /* numkeys = info.di_nkeys & 0x7fff; */ 
        numkeys = info.di_nkeys & 0xff7f; 
        if (f->reclen_min != isreclen) 
           r = 2;
     }
     /* Verify the record type has a fixed type structure */
     else {
        numkeys = info.di_nkeys;
        if (f->reclen != isreclen) 
           r = 3;
     }
#ifdef DEBUG_FILEISAM_RTS10
     fprintf(stderr, "debug : tcob_verify_vbidx 250.300 : f->nkeys=%d, numkeys=%d;\n", f->nkeys, numkeys);
#endif                                       
  }

  /* Verify the number of keys */
  if (r == 0) {
    if (f->nkeys != numkeys) 
       r = 5;
  }
     
  /* Verify the key structure */
  if (r == 0) {
     k = f->keys;
     for (i=1; i<=numkeys; i++, k++) {
        /* Get the index structure */
        isindexinfo (ifilehandle, &wkeydesc, i);

        /* Verify the key structure duplicate flag */
#ifdef DEBUG_FILEISAM_RTS10
        fprintf(stderr, "debug : tcob_verify_vbidx 250.410 : key=%d, k->flag=%d, wkeydesc.k_flags=%d;\n", i, k->flag, wkeydesc.k_flags);
#endif                                       
        if (((k->flag == TCB_FILE_KEY_FLAG_INDEXED_DUPLICATES) &&
             (wkeydesc.k_flags == ISNODUPS)
            )  ||
            ((k->flag == TCB_FILE_KEY_FLAG_INDEXED_UNIQUE) &&
             (wkeydesc.k_flags == ISDUPS)))  {
           r=6;
           break; 
        }

#ifdef DEBUG_FILEISAM_RTS10
        fprintf(stderr, "debug : tcob_verify_vbidx 250.420 : key=%d, k->offset=%d, wkeydesc.k_start=%d;\n", i, k->offset, wkeydesc.k_start);
#endif                                       
        /* Verify the key structure record offset */
        if (k->offset != wkeydesc.k_start) {
           r=7;
           break; 
        }

#ifdef DEBUG_FILEISAM_RTS10
        fprintf(stderr, "debug : tcob_verify_vbidx 250.430 : key=%d, k->key_desc->len=%ld, wkeydesc.k_leng=%d;\n", i, k->key_desc->len, wkeydesc.k_leng);
#endif                                       
        /* Verify the key structure key length */
        if (k->key_desc->len != wkeydesc.k_leng ) {
           r=8;
           break; 
        }
     }     
  }

  return r;
}