home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / iutil / scan_dups.c < prev    next >
Encoding:
C/C++ Source or Header  |  1985-01-23  |  2.2 KB  |  112 lines

  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. }
  112.