home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / dbu / modupdate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-12  |  7.0 KB  |  245 lines

  1. # include    <pv.h>
  2. # include    <ingres.h>
  3. # include    <aux.h>
  4. # include    <catalog.h>
  5. # include    <access.h>
  6. # include    <batch.h>
  7. # include    <opsys.h>
  8. # include    <btree.h>
  9. # include    <symbol.h>
  10. # include    <sccs.h>
  11.  
  12. SCCSID(@(#)modupdate.c    8.6    6/12/88)
  13.  
  14. /*
  15. ** MODUPDATE
  16. **    This routine is used to exicute the updates 
  17. **    for modifies so they are recoverable.
  18. **    It is also used by restore to complete an aborted modify.
  19. **    During a restore the Batch_recover flag should be set to 1;
  20. */
  21.  
  22.  
  23. modupdate()
  24. {
  25.     char            batchname[MAXNAME + 3];
  26.     char            temprel[MAXNAME+ 3];
  27.     char            relfile[MAXNAME + 3];
  28.     char            btreesec[MAXNAME + 3];
  29.     register int        i;
  30.     register int        j;
  31.     struct stat        sbuf;
  32.     char            aflag;
  33.     struct tup_id        tid;
  34.     DESC            desx;
  35.     struct attribute    attkey, atttup;
  36.     struct relation        oldreltup;
  37.     struct index        ikey, itup;
  38.     PARM            newpv[2];
  39.     extern DESC        Inddes, Attdes, Reldes;
  40.     register DESC        *desp;
  41.     extern char        *trim_relname();
  42.     extern int        errno;
  43.     char            btree[MAXNAME + 4], temp_btree[MAXNAME + 4];
  44.     short            numatts;
  45.     int            key;
  46.     extern int        NLidKeys;
  47.  
  48.     desp =  &desx;
  49.     concat(MODBATCH,Fileset,batchname);
  50.     concat(MODTEMP, Fileset, temprel);
  51.  
  52. #    ifdef xZTR1
  53.     if (tTf(34, 8))
  54.         printf("Modupdate: %s, %s\n",batchname, temprel);
  55. #    endif
  56.     if ((Batch_fp = open(batchname, O_RDONLY)) < 0)
  57.         syserr("MODUPDATE:Can't open %s", batchname);
  58.     Batch_cnt = BATCHSIZE;
  59.     Batch_dirty = FALSE;
  60.     getbatch(desp, sizeof *desp);
  61.     ingresname(desp->reldum.relid, desp->reldum.relowner, relfile);
  62.  
  63.     if (!desp->reldum.reldim || NLidKeys > 0)
  64.     {
  65.         /* don't loose old file before verifying new file */
  66.         if (stat(temprel, &sbuf) >= 0)
  67.         {
  68.             unlink(relfile);    /* Ok if failure */
  69.             errno = 0;
  70.             if (link(temprel, relfile) == -1)
  71.                 syserr("MODUPDATE:Can't link: %s, %s", temprel, relfile);
  72.             if (unlink(temprel) < 0)
  73.                 syserr("modupdate:unlink(%s)", temprel);
  74.         }
  75.     
  76.         else
  77.             if(stat(relfile, &sbuf) < 0 || !Batch_recovery)
  78.                 syserr("MODUPDATE:Relation and/or temporary files for %s are missing",
  79.                     relfile);
  80.     }
  81.  
  82.     /* Update admin if this is relation or atribute relations */
  83.     /* Should only happen in Sysmod                  */
  84.     if ((aflag = bequal(desp->reldum.relid, "attribute   ", MAXNAME)) ||
  85.         bequal(desp->reldum.relid, "relation    ", MAXNAME))
  86.     {
  87.         ingresname(desp->reldum.relid, desp->reldum.relowner, temprel);
  88.         if ((i = open("admin", O_RDWR)) < 0)
  89.             syserr("MODUPDATE:Can't open admin file");
  90.         if (lseek(i, (long) sizeof Admin.adhdr, 0) < 0 ||
  91.             (aflag && lseek(i, (long) sizeof *desp, 1) < 0))
  92.             syserr("MODUPDATE:Seek error");
  93.         if (write(i, desp, sizeof *desp) != sizeof *desp)
  94.             syserr("MODUPDATE:Write error on admin");
  95.         close(i);
  96.  
  97.         if (aflag)
  98.         {
  99.             closer(&Attdes);
  100.             cleanrel(&Admin.adattd);
  101.             close(Admin.adattd.relfp);
  102.             bmove(desp, &Admin.adattd, sizeof *desp);
  103.             ingresname(Admin.adattd.reldum.relid, Admin.adattd.reldum.relowner, temprel);
  104.             if ((Admin.adattd.relfp = open(temprel, O_RDWR)) < 0)
  105.                 syserr("MODUPDATE: open wr Admin.adattd %d", Admin.adattd.relfp);
  106.             Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
  107.         }
  108.         else
  109.         {
  110.             closer(&Reldes);
  111.             cleanrel(&Admin.adreld);
  112.             close(Admin.adreld.relfp);
  113.             bmove(desp, &Admin.adreld, sizeof *desp);
  114.             if ((Admin.adreld.relfp = open(temprel, O_RDWR)) < 0)
  115.                 syserr("MODUPDATE: open Admin.adreld %d",
  116.                     Admin.adreld.relfp);
  117.             Admin.adreld.relopn = (Admin.adreld.relfp + 1) * -5;
  118.             /* search the new relation relation for the new
  119.                relation tid for the attribute relation */
  120.             /* but for now, we guess. */
  121.             bzero(&Admin.adattd.reltid,
  122.                   sizeof(Admin.adattd.reltid));
  123.         }
  124.     }
  125.  
  126.     if (i = get(&Admin.adreld, &desp->reltid, &desp->reltid, &oldreltup, FALSE))
  127.         syserr("MODUPDATE: get oldrel=%d",i);
  128.  
  129.     btreename(desp->reldum.relid, btree);
  130.     if (oldreltup.reldim > 0)
  131.     /* relation formerly ordered */
  132.     {
  133.         capital(trim_relname(desp->reldum.relid), btreesec);
  134.         newpv[0].pv_val.pv_str = btreesec;
  135.         newpv[1].pv_type = PV_EOF;
  136.         if (destroy(1, newpv))
  137.             syserr("can't destroy btreesec");
  138.         unlink(btree);
  139.  
  140.         /* remove tuple corresponding to LID field from attribute
  141.         ** relation
  142.         */
  143.         setkey(&Admin.adattd, &attkey, desp->reldum.relid, ATTRELID);
  144.         setkey(&Admin.adattd, &attkey, desp->reldum.relowner, ATTOWNER);
  145.         numatts = oldreltup.relatts - oldreltup.reldim + 1;
  146.         for (i = oldreltup.reldim; i > 0; i--, numatts++)
  147.         {
  148.             setkey(&Admin.adattd, &attkey, &numatts, ATTID);
  149.             if (getequal(&Admin.adattd, &attkey, &atttup, &tid) == 0)
  150.                 if (delete(&Admin.adattd, &tid) < 0)
  151.                     syserr("MODUPDATE: Can't delete LID field from attribute relation");
  152.         }
  153.     }
  154.  
  155.     /* update attribute relation */
  156.  
  157.     Admin.adattd.relopn = (Admin.adattd.relfp + 1) * -5;
  158.     numatts = desp->reldum.relatts - desp->reldum.reldim;
  159.     for (i = numatts; i > 0; i--)
  160.     {
  161.         getbatch(&tid, sizeof tid);
  162.         getbatch(&atttup, sizeof atttup);
  163.         if (j = replace(&Admin.adattd, &tid, &atttup, FALSE))
  164.             if (j < 0 || j == 2)
  165.                 syserr("MODUPDATE:Replace error(att): %d", j);
  166.     }
  167.  
  168.     for (i = desp->reldum.reldim; i > 0; i--)
  169.     {
  170.         /* insert tuple corresponding to LID field into attribute relation */
  171.         getbatch(&atttup, sizeof atttup);
  172.         if ((j = insert(&Admin.adattd, &tid, &atttup, FALSE) < 0))
  173.             syserr("MODUPDATE: Insert error (att): %d", j);
  174.     }
  175.  
  176.     unlink(batchname);
  177.  
  178.     if (i = cleanrel(&Admin.adattd))
  179.         syserr("MODUPDATE:clean att %d", i);
  180.  
  181.     /* update relation relation */
  182.  
  183.     if ((i = replace(&Admin.adreld, &desp->reltid, desp, FALSE)))
  184.         if (i < 0 || i == 2)
  185.             syserr("MODUPDATE:Replace error(rel): %d", i);
  186.  
  187.     if (i = cleanrel(&Admin.adreld))
  188.         syserr("MODUPDATE:clean rel %d", i);
  189.  
  190.     if (desp->reldum.reldim > 0)
  191.     /* link temporary BTree file to permanent storage */
  192.     {
  193.         concat(BTREE, Fileset, temp_btree);
  194.         if (link(temp_btree, btree) == -1)
  195.             syserr("MODUPDATE: can't link: %s, %s", temp_btree, btree);
  196.         if (unlink(temp_btree) < 0)
  197.             syserr("modupdate: unlink %s", temp_btree);
  198.     }
  199.  
  200.     /* make the admin readonly */
  201.     Admin.adattd.relopn = (Admin.adattd.relfp + 1) * 5;
  202.  
  203.     close(Batch_fp);
  204.  
  205.     /* if this is an index, change the relspec in the index catalog */
  206.     if (oldreltup.relindxd == SECINDEX)
  207.     {
  208.         opencatalog("indexes", OR_WRITE);
  209.         setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDI);
  210.         setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
  211.         if ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
  212.         {
  213.             itup.irelspeci = desp->reldum.relspec;
  214.             if ((i = replace(&Inddes, &tid, &itup, 0)) != 0)
  215.                 if (i < 0 || i == 2)
  216.                     syserr("MODUPDATE: rep(ix) %d", i);
  217.         }
  218.     }
  219.  
  220.     else if (desp->reldum.relindxd == SECBASE)
  221.     {
  222.         /* destroy any secondary indexes on this primary */
  223.         opencatalog("indexes", OR_WRITE);
  224.         setkey(&Inddes, &ikey, desp->reldum.relid, IRELIDP);
  225.         setkey(&Inddes, &ikey, desp->reldum.relowner, IOWNERP);
  226.         while ((i = getequal(&Inddes, &ikey, &itup, &tid)) == 0)
  227.         {
  228.             newpv[0].pv_val.pv_str = itup.irelidi;
  229.             newpv[1].pv_type = PV_EOF;
  230.             printf("destroying secondary index %s\n", trim_relname(itup.irelidi));
  231.             if (destroy(1, newpv))
  232.                 syserr("MODUPDATE:Can't destroy %s", itup.irelidi);
  233.         }
  234.     }
  235.     if (i < 0)
  236.         syserr("MODUPDATE: geteq(ix)b %d", i);
  237.  
  238.     /* clean things up and exit */
  239. #    ifdef xZTR1
  240.     if (tTf(34, 8))
  241.         printf("Leaving modupdate\n");
  242. #    endif
  243.     return (0);
  244. }
  245.