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; }
/* // // 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; }