# include # include # include # include # include SCCSID(@(#)insert.c 8.1 12/31/84) /* ** INSERT - add a new tuple to a relation ** ** Insert puts a given tuple into a relation in ** the "correct" position. ** ** If insert is called with checkdups == TRUE then ** the tuple will not be inserted if it is a duplicate ** of some already existing tuple. If the relation is a ** heap then checkdups is made false. ** ** Tid will be set to the tuple id where the ** tuple is placed. ** ** returns: ** <0 fatal error ** 0 success ** 1 tuple was a duplicate ** 2 bad lid */ insert(d, tid, tuple, checkdups) register DESC *d; register TID *tid; char *tuple; bool checkdups; { register int i, j; int need; char *tp; long lid[MAXLID], l; char btree[MAXNAME + 4]; TID tidpos; struct locator tidloc; short nolid; # ifdef xATR1 if (tTf(24, 0)) { printf("insert:%.14s,", d->reldum.relid); dumptid(tid); printup(d, tuple); } # endif if (d->reldum.reldim != 0) checkdups = FALSE; /* determine how much space is needed for tuple */ need = canonical(d, tuple); /* find the "best" page to place tuple */ if (i = findbest(d, tid, tuple, need, checkdups)) return (i); if (d->reldum.reldim > 0) /* get lids and check for errors */ { btreename(d->reldum.relid, btree); tp = tuple + d->reldum.relwid - LIDSIZE * d->reldum.reldim; bmove(tp, lid, LIDSIZE * d->reldum.reldim); nolid = 0; for (i = 0; i < d->reldum.reldim; ++i) { if (lid[i] < 0 || (lid[i] > 0 && nolid)) return(2); nolid = !(lid[i]); } } if (d->reldum.reldim > 0) { if (insert_mbtree(d, btree, lid, tid, &tidpos) < 0) return(2); tp = tuple + d->reldum.relwid - LIDSIZE * d->reldum.reldim; bmove(lid, tp, d->reldum.reldim * LIDSIZE); } /* put tuple in position "tid" */ put_tuple(tid, Acctuple, need); d->reladds++; return (0); }