1: # include   <ingres.h>
   2: # include   <symbol.h>
   3: # include   <access.h>
   4: # include   <lock.h>
   5: # include   <sccs.h>
   6: 
   7: SCCSID(@(#)scan_dups.c	8.1	12/31/84)
   8: 
   9: 
  10: /*
  11: **	Scan for duplicates. Start with the page
  12: **	specified by tid and
  13: **	continue until there are no more pages
  14: **
  15: **	Scan_dups guarantees that the same page will
  16: **	be in the buffer on entry and exit
  17: **
  18: **	returns:
  19: **		<0 if fatal error
  20: **		0  if not duplicate
  21: **		1  if duplicate
  22: */
  23: 
  24: scan_dups(d, tid, tuple)
  25: DESC        *d;
  26: register TID    *tid;
  27: char        *tuple;
  28: {
  29:     register int    dup, pagerr;
  30:     TID     savetid;
  31: 
  32:     stuff_page(&savetid, &Acc_head->thispage);
  33: 
  34:     Acclock = FALSE;    /* turn concurrency off */
  35:     dup = 0;    /* assume success */
  36: 
  37:     do
  38:     {
  39:         if (pagerr = get_page(d, tid))
  40:             break;  /* fatal error */
  41: 
  42:         if (dup = dup_check(d, tid, tuple))
  43:             break;  /* found duplicate */
  44: 
  45:         stuff_page(tid, &Acc_head->ovflopg);
  46:     } while (Acc_head->ovflopg);
  47: 
  48:     if (pagerr || (pagerr = get_page(d, &savetid)))
  49:         dup = pagerr;   /* return fatal page error */
  50: 
  51:     Acclock = TRUE;     /* turn concurency on */
  52:     return (dup);
  53: }
  54: /*
  55: **  DUP_CHECK -- check current page for a duplicate of tuple;
  56: **
  57: **	returns:
  58: **		0 if not duplicate
  59: **		1 if duplicate
  60: */
  61: 
  62: dup_check(d, tid, tuple1)
  63: register DESC   *d;
  64: TID     *tid;
  65: char        *tuple1;
  66: {
  67:     register int    i, dom;
  68:     short       *lp;
  69:     int     len, lastline, tups_equal;
  70:     char        *tup1, *tup2;
  71:     char        tuple2[MAXTUP];
  72:     char        *getint_tuple();
  73: 
  74:     /* determine starting and ending points */
  75:     lastline = Acc_head->nxtlino;
  76:     lp = Acc_head->linetab;
  77: 
  78:     /* check each tuple for duplication */
  79:     for (i = 0; i < lastline; i++)
  80:     {
  81:         /* is this line used? */
  82:         if (*lp--)
  83:         {
  84:             /* yes. get tuple and check it */
  85:             tid->line_id = i;
  86:             tup2 = getint_tuple(d, tid, tuple2);
  87:             tup1 = tuple1;
  88:             tups_equal = TRUE;  /* assume equal */
  89: 
  90:             /* now check each domain for duplication */
  91:             for (dom = 1; dom <= d->reldum.relatts; dom++)
  92:             {
  93:                 len = d->relfrml[dom] & I1MASK;
  94:                 if (d->relfrmt[dom] == CHAR)
  95:                     tups_equal = scompare(tup1, len, tup2, len) == 0;
  96:                 else
  97:                     tups_equal = bequal(tup1, tup2, len);
  98:                 if (!tups_equal)
  99:                 {
 100:                     /* not duplicates */
 101:                     break;
 102:                 }
 103:                 tup1 += len;
 104:                 tup2 += len;
 105:             }
 106:             if (tups_equal)
 107:                 return (1); /* duplicate */
 108:         }
 109:     }
 110:     return (0); /* no duplicate */
 111: }

Defined functions

dup_check defined in line 62; used 2 times
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 765
Valid CSS Valid XHTML 1.0 Strict