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

  1. # include    <ingres.h>
  2. # include    <aux.h>
  3. # include    <access.h>
  4. # include    <symbol.h>
  5. # include    <catalog.h>
  6. # include    <sccs.h>
  7.  
  8. SCCSID(@(#)openr.c    8.4    1/22/85)
  9.  
  10. /*
  11. **  OPENR -- Open a relation into a descriptor
  12. **
  13. **    Openr will open the named relation into the given descriptor
  14. **    according to the mode specified. When searching for a name,
  15. **    a relation owner by the current user will be searched for first.
  16. **    If none is found then one owned by the DBA will be search for.
  17. **
  18. **    There are several available modes for opening a relation. The
  19. **    most common are
  20. **        mode OR_READ    -- open for reading
  21. **        mode OR_WRITE   -- open for writing.
  22. **    Other modes which can be used to optimize performance:
  23. **        mode OR_RELTID  -- get relation-relation tuple and tid only.
  24. **                  Does not open the relation.
  25. **        mode OR_AREAD   -- open relation for reading after a previous
  26. **                  call of mode OR_RELTID.
  27. **        mode OR_AWRITE  -- open relation for writing after a previous
  28. **                  call of mode OR_RELTID.
  29. **        mode OR_REREAD  -- open relation for reading. Assumes that relation
  30. **                  was previously open (eg relation & attributed
  31. **                  have been filled) and file was closed by closer.
  32. **        mode OR_REWRITE -- open relation for writing. Same assumptions as
  33. **                  mode OR_REREAD.
  34. **
  35. **    Parameters:
  36. **        dx - a pointer to a struct descriptor (defined in ingres.h)
  37. **        mode - can be OR_READ -> OR_REWRITE
  38. **        name - a null terminated name (only first 12 chars looked at)
  39. **
  40. **    Returns:
  41. **        1 - relation does not exist
  42. **        0 - ok
  43. **        <0 - error. Refer to the error codes in access.h
  44. **
  45. **    Side Effects:
  46. **        Opens the physical file if required. Fill the
  47. **        descriptor structure. Initializes the access methods
  48. **        if necessary.
  49. **
  50. **    Trace Flags:
  51. **        90
  52. */
  53.  
  54.  
  55. openr(d, mode, name)
  56. register DESC    *d;
  57. int        mode;
  58. char        *name;
  59. {
  60.     int        i;
  61.     register int    retval, filemode;
  62.     char        filename[MAXNAME+3];
  63.     char        btree[MAXNAME];
  64.     char        btreefile[MAXNAME + 3];
  65. #    ifdef xATR1
  66.     if (tTf(21, 0))
  67.         printf("openr:%.12s,%d\n", name, mode);
  68. #    endif
  69.  
  70.     /* init admin */
  71.     acc_init();
  72.  
  73.     /* process according to mode */
  74.  
  75.     filemode = O_RDONLY;
  76.  
  77.     if (mode >= 0)
  78.         d->relbtree = NULL;
  79.  
  80.     switch (mode)
  81.     {
  82.  
  83.       case OR_RELTID:
  84.         retval = get_reltup(d, name);
  85.         break;
  86.  
  87.       case OR_WRITE:
  88.         filemode = O_RDWR;
  89.  
  90.       case OR_READ:
  91.         if (retval = get_reltup(d, name))
  92.             break;
  93.  
  94.       case OR_AREAD:
  95.       case OR_AWRITE:
  96.         if (retval = get_attuples(d))
  97.             break;
  98.  
  99.       case OR_REWRITE:
  100.         if (mode == OR_AWRITE || mode == OR_REWRITE)
  101.             filemode = O_RDWR;
  102.  
  103.       case OR_REREAD:
  104.         clearkeys(d);
  105.         /* descriptor is filled. open file */
  106.         ingresname(d->reldum.relid, d->reldum.relowner, filename);
  107.         /* can't open a view */
  108.         if (d->reldum.relstat & S_VIEW)
  109.         {
  110.             retval = acc_err(AMOPNVIEW_ERR);    /* view */
  111.             break;
  112.         }
  113.         if ((d->relfp = open(filename, filemode)) < 0)
  114.         {
  115.             retval = acc_err(AMNOFILE_ERR);    /* can't open file */
  116.             break;
  117.         }
  118.         d->relopn = (d->relfp + 1) * 5;
  119.         if (filemode == O_RDWR)
  120.             d->relopn = -d->relopn;
  121.         d->reladds = 0;
  122.         retval = 0;
  123.         break;
  124.  
  125.       default:
  126.         syserr("openr:bd md=%d", mode);
  127.     }
  128.  
  129.     if (mode == OR_RELTID && d->reldum.reldim > 0 && !retval)
  130.     {
  131.         /* open btreesec relation */
  132.         capital(d->reldum.relid, btree);
  133.         if ((d->relbtree = (DESC *) calloc(1, sizeof(DESC))) == NULL)
  134.             syserr("calloc error in openr");
  135.         if (i = openr(d->relbtree, OR_RELTID, btree))
  136.             syserr("opening Btreesec %s %d\n", btree, i);
  137.     }
  138.  
  139.     if (retval == 0 && d->reldum.reldim > 0 && mode != OR_RELTID)
  140.     {
  141.         capital(d->reldum.relid, btree);
  142.         if (d->relbtree == NULL)
  143.         {
  144.             if ((d->relbtree = (DESC *) calloc(1, sizeof(DESC))) == NULL)
  145.                 syserr("calloc error in openr");
  146.         }
  147.         if (i = openr(d->relbtree, mode, btree))
  148.             syserr("opening Btreesec %s %d\n", btree, i);
  149.         ingresname(d->reldum.relid, d->reldum.relowner, filename);
  150.         btreename(filename, btreefile);
  151.         if ((d->btree_fd = open(btreefile, O_RDWR)) < 0)
  152.             syserr("openr: can't open %s", btreefile);
  153.     }
  154.  
  155.     /* return */
  156.  
  157. #    ifdef xATR1
  158.     if (tTf(21, 4) && mode != OR_RELTID && retval != 1)
  159.         printdesc(d);
  160.     if (tTf(21, 0))
  161.         printf("openr rets %d\n", retval);
  162. #    endif
  163.  
  164.     return (retval);
  165. }
  166. /*
  167. **  GET_ATTUPLES -- get tuples from attribute relation for this relation
  168. */
  169.  
  170. get_attuples(d)
  171. register DESC    *d;
  172. {
  173.     struct attribute    attr, attkey;
  174.     register int        i, dom;
  175.     int            numatts;
  176.     TID            tid1, tid2;
  177.  
  178.     clearkeys(&Admin.adattd);
  179.  
  180.     /* zero all format types */
  181.     for (i = 0; i <= d->reldum.relatts; i++)
  182.         d->relfrmt[i] = 0;
  183.  
  184.     /* prepare to scan attribute relation */
  185.     setkey(&Admin.adattd, (char *) &attkey, d->reldum.relid, ATTRELID);
  186.     setkey(&Admin.adattd, (char *) &attkey, d->reldum.relowner, ATTOWNER);
  187.     if (i = find(&Admin.adattd, EXACTKEY, &tid1, &tid2, &attkey))
  188.         return (i);
  189.  
  190.     numatts = d->reldum.relatts;
  191.  
  192.     while (numatts && !get(&Admin.adattd, &tid1, &tid2, &attr, TRUE))
  193.     {
  194.  
  195.         /* does this attribute belong? */
  196.         if (bequal(&attr, &attkey, MAXNAME + 2))
  197.         {
  198.  
  199.             /* this attribute belongs */
  200.             dom = attr.attid;    /* get domain number */
  201.  
  202.             if (d->relfrmt[dom])
  203.                 break;    /* duplicate attribute. force error */
  204.  
  205.             numatts--;
  206.             d->reloff[dom] = attr.attoff;
  207.             d->relfrmt[dom] = attr.attfrmt;
  208.             d->relfrml[dom] = attr.attfrml;
  209.             d->relxtra[dom] = attr.attxtra;
  210.         }
  211.     }
  212.  
  213.     d->relfrmt[0] = INT;
  214.     d->relfrml[0] = 4;
  215.     /* make sure all the atributes were there */
  216.     for (dom = 1; dom <= d->reldum.relatts; dom++)
  217.         if (d->relfrmt[dom] == 0)
  218.             numatts = 1;    /* force an error */
  219.     if (numatts)
  220.         i = acc_err(AMNOATTS_ERR);
  221.  
  222.     flush_rel(&Admin.adattd, TRUE);
  223.  
  224. #    ifdef xATR1
  225.     if (tTf(21, 3))
  226.         printf("get_attr ret %d\n", i);
  227. #    endif
  228.  
  229.     return (i);
  230. }
  231.