Annotation of 43BSD/ingres/source/iutil/batch.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <aux.h>
        !             3: # include      <catalog.h>
        !             4: # include      <symbol.h>
        !             5: # include      <access.h>
        !             6: # include      <batch.h>
        !             7: # include      <btree.h>
        !             8: # include      <sccs.h>
        !             9: 
        !            10: SCCSID(@(#)batch.c     8.2     1/17/85)
        !            11: 
        !            12: /*
        !            13: **     Open batch prepares for batch processing.
        !            14: **     1. If the batch is already open, return an error
        !            15: **     2. Create the batch file.
        !            16: **     3. clear domain flags.
        !            17: **     4. If the relation is indexed, Identify all the domains
        !            18: **             which must be saved to speed the index update.
        !            19: **     5. Set up specifics for each type of update.
        !            20: **     6. Write out the batch structure.
        !            21: **
        !            22: **     The following itemizes what is saved (in bytes):
        !            23: **     f(si) means it's a function of the secondary index keys
        !            24: **     space for newtid is saved only if there is a sec. index.
        !            25: **
        !            26: **                     mdDEL   mdREPL  mdAPP
        !            27: **
        !            28: **     oldtid          4       4       0
        !            29: **     oldtuple        f(si)   f(si)   0
        !            30: **     newtuple        0       tupwid  tupwid
        !            31: **     newtid          0       4       4
        !            32: */
        !            33: 
        !            34: openbatch(rel_desc, index_desc, mode)
        !            35: DESC   *rel_desc, *index_desc;
        !            36: int    mode;
        !            37: {
        !            38:        register struct si_doms *sp;
        !            39:        register DESC           *rel, *indx;
        !            40:        int                     i, j, saveoff, dom;
        !            41:        char                    *p, *batchname();
        !            42:        TID                     lotid, hitid;
        !            43:        struct index            itup;
        !            44:        extern char             *Database;
        !            45: 
        !            46:        if (Batchhd.mode_up)
        !            47:                return (-1);    /* batch already open */
        !            48:        rel = rel_desc;
        !            49:        indx = index_desc;
        !            50:        p = batchname();        /* form batch name */
        !            51: #      ifdef xATR1
        !            52:        if (tTf(25, -1))
        !            53:                printf("Openbatch %s\n", p);
        !            54: #      endif
        !            55:        if ((Batch_fp = creat(p, FILEMODE)) < 0)
        !            56:                syserr("openbatch:can't creat %s,%d", p, Batch_fp);
        !            57:        Batch_cnt = 0;
        !            58: 
        !            59:        /* copy the important info */
        !            60:        smove(Fileset, Batchbuf.file_id);
        !            61:        smove(Database, Batchhd.db_name);
        !            62:        bmove(rel->reldum.relid, Batchhd.rel_name, MAXNAME);
        !            63:        bmove(rel->reldum.relowner, Batchhd.userid, 2);
        !            64:        Batchhd.mode_up = mode;
        !            65:        Batchhd.num_updts = 0;
        !            66: 
        !            67:        /* clear out the secondary index domain flags */
        !            68:        sp = Batchhd.si;        /* sp points to the structure */
        !            69:        for (i = 1; i <= MAXDOM; i++)
        !            70:        {
        !            71:                sp->dom_size = 0;
        !            72:                sp++;
        !            73:        }
        !            74:        Batchhd.si_dcount = 0;
        !            75: 
        !            76:        /* set up the tid and tuple sizes by type of update */
        !            77:        /* assume size of tido, tidn, and tupn */
        !            78:        Batchhd.tido_size = 4;  /* assume old tid is needed */
        !            79:        Batchhd.tupo_size = 0;  /* assume old tuple isn't needed */
        !            80:        Batchhd.tupn_size = rel->reldum.relwid; /* assume new tuple is needed */
        !            81:        Batchhd.tidn_size = 4;  /* assume space is needed for new tid */
        !            82:        switch(Batchhd.mode_up)
        !            83:        {
        !            84: 
        !            85:          case mdDEL:
        !            86:                Batchhd.tupn_size = 0;  /* new tuple isn't needed */
        !            87:                Batchhd.tidn_size = 0;  /* new tid isn't needed */
        !            88: 
        !            89:          case mdREPL:
        !            90:                break;
        !            91: 
        !            92:          case mdAPP:
        !            93:                Batchhd.tido_size = 0;  /* old tid isn't needed */
        !            94:                break;
        !            95: 
        !            96:          default:
        !            97:                syserr("openbatch:mode %d", Batchhd.mode_up);
        !            98:        }
        !            99:        /* if there are no secondary indexes then tipn isn't needed, unless 
        !           100:        ** relation is ordered
        !           101:        */
        !           102:        if (rel->reldum.relindxd <= 0 && rel->reldum.reldim <= 0)
        !           103:                Batchhd.tidn_size = 0;
        !           104: 
        !           105:        /* if this relation has a secondary index or an ordered relation,
        !           106:        ** figure out what to save 
        !           107:        */
        !           108:        if ((rel->reldum.relindxd > 0 || rel->reldum.reldim > 0) && mode != mdAPP)
        !           109:        {
        !           110:                if (rel->reldum.relindxd > 0)
        !           111:                {
        !           112:                        setkey(indx, (char *) &itup, rel->reldum.relid, IRELIDP);
        !           113:                        setkey(indx, (char *) &itup, rel->reldum.relowner, IOWNERP);
        !           114:        
        !           115:                        if (find(indx, EXACTKEY, &lotid, &hitid, (char *) &itup))
        !           116:                                syserr("openbatch:bad find %.12s", rel);
        !           117:        
        !           118:                        /* check each entry in "index" relation for useful index */
        !           119:                        while(!(i = get(indx, &lotid, &hitid, (char *) &itup, TRUE)))
        !           120:                        {
        !           121:                                if (!bequal(itup.irelidp, rel->reldum.relid, MAXNAME) ||
        !           122:                                    !bequal(itup.iownerp, rel->reldum.relowner, 2))
        !           123:                                        continue;
        !           124:                                /* found one. copy the used domains */
        !           125:                                p = itup.idom;          /* get address of first */
        !           126:                                i = 6;
        !           127:                                while (i--)
        !           128:                                {
        !           129:                                        if ((dom = *p++) == 0)
        !           130:                                                break;  /* no more domains */
        !           131:                                        sp = &Batchhd.si[dom];
        !           132:                                        if (sp->dom_size != 0)
        !           133:                                                continue;       /* domain has already been done once */
        !           134:                                        Batchhd.si_dcount++;
        !           135:                                        Batchhd.tupo_size += rel->relfrml[dom] & I1MASK;
        !           136:                                        sp->rel_off = rel->reloff[dom];
        !           137:                                        sp->dom_size = rel->relfrml[dom] & I1MASK;
        !           138:                                }
        !           139:                        }
        !           140:                }
        !           141:                for (j = rel->reldum.reldim - 1; j >= 0; --j)
        !           142:                {
        !           143:                        /* point to lid field */
        !           144:                        sp = &Batchhd.si[rel->reldum.relatts - j];
        !           145:                        Batchhd.si_dcount++;
        !           146:                        Batchhd.tupo_size += LIDSIZE;
        !           147:                        sp->rel_off = rel->reloff[rel->reldum.relatts - j];
        !           148:                        sp->dom_size = LIDSIZE;
        !           149:                }
        !           150:                if (i < 0)
        !           151:                        syserr("openbatch:bad get index %d", i);
        !           152:                /* compute offsets of domains in saved "oldtuple" */
        !           153:                saveoff = 0;
        !           154:                sp = Batchhd.si;
        !           155:                i = Batchhd.si_dcount;
        !           156:                while (i--)
        !           157:                {
        !           158:                        /* skip to next domain */
        !           159:                        while (sp->dom_size == 0)
        !           160:                                sp++;
        !           161:                        sp->tupo_off = saveoff;
        !           162:                        saveoff += sp->dom_size;
        !           163:                        sp++;
        !           164:                }
        !           165:        }
        !           166:        wrbatch((char *) &Batchhd, sizeof Batchhd);
        !           167:        return (0);
        !           168: }
        !           169: /*
        !           170: **  ADDBATCH -- add to batch file
        !           171: */
        !           172: 
        !           173: addbatch(oldtid, newtuple, oldtuple)
        !           174: TID    *oldtid;
        !           175: char   *newtuple, *oldtuple;
        !           176: {
        !           177:        TID                     newtid;
        !           178:        register int            i;
        !           179:        register struct si_doms *sp;
        !           180:        register char           *old;
        !           181: 
        !           182: #      ifdef xATR1
        !           183:        if (tTf(25,3))
        !           184:                printf("addbatch\n");
        !           185: #      endif
        !           186:        if (Batchhd.mode_up == 0)
        !           187:                return (-1);
        !           188:        Batchhd.num_updts++;    /* increment the number of add batches */
        !           189:        old = oldtuple;
        !           190:        /* write out the old tid */
        !           191:        wrbatch((char *) oldtid, Batchhd.tido_size);
        !           192: 
        !           193:        /* write out each of the old tuple domains */
        !           194:        i = Batchhd.si_dcount;  /* i get the number of domains */
        !           195:        sp = Batchhd.si;        /* sp points to the domain structures */
        !           196: 
        !           197:        while (i--)
        !           198:        {
        !           199:                /* skip to the next domain */
        !           200:                while (sp->dom_size == 0)
        !           201:                        sp++;
        !           202: 
        !           203:                wrbatch(&old[sp->rel_off], sp->dom_size);
        !           204:                sp++;
        !           205:        }
        !           206: 
        !           207:        /* write out the new tuple */
        !           208:        wrbatch(newtuple, Batchhd.tupn_size);
        !           209: 
        !           210:        /* reserve space for the new tid. Init to -1 */
        !           211:        *((long *) &newtid) = -1;
        !           212:        wrbatch((char *) &newtid, Batchhd.tidn_size);
        !           213:        return (0);
        !           214: }
        !           215: /*
        !           216: **  CLOSEBATCH -- close batch file
        !           217: */
        !           218: 
        !           219: closebatch()
        !           220: {
        !           221:        register int    i;
        !           222:        extern long     lseek();
        !           223: 
        !           224:        if (Batchhd.mode_up == 0)
        !           225:                return (-1);
        !           226:        flushbatch();   /* write out any remainder */
        !           227:        if ((i = lseek(Batch_fp, 0l, 0)) == -1)
        !           228:                syserr("closebatch:seek %d", i);
        !           229:        wrbatch((char *) &Batchhd, sizeof Batchhd);     /* update num_updts */
        !           230:        flushbatch();
        !           231:        if (i = close(Batch_fp))
        !           232:                syserr("closebatch:close %d", i);
        !           233:        Batchhd.mode_up = 0;
        !           234:        return (0);
        !           235: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.