1: # include   <ingres.h>
   2: # include   <aux.h>
   3: # include   <catalog.h>
   4: # include   <symbol.h>
   5: # include   <access.h>
   6: # include   <batch.h>
   7: # include   <sccs.h>
   8: 
   9: SCCSID(@(#)secupdate.c	8.3	2/8/85)
  10: 
  11: /*
  12: ** 	SECUPDATE - updates secondary indexes
  13: **
  14: **
  15: **	Parameters:
  16: **		rel - relation being updated
  17: **
  18: **	Return Codes:
  19: **		0
  20: **
  21: **	Trace Flags:
  22: **		Z49, 49.7 49.8 49.15
  23: **
  24: **	Called by:
  25: **		update()
  26: **
  27: */
  28: secupdate(r)
  29: register DESC   *r;
  30: {
  31:     register char   *p;
  32:     register int    i;
  33:     int     j, domcnt, mode, dom;
  34:     long        tupcnt;
  35:     long        oldtid, newtid;
  36:     long        lotid, hitid, uptid;
  37:     char        oldtup[MAXTUP], newtup[MAXTUP];
  38:     char        oldkey[MAXTUP], newkey[MAXTUP];
  39:     char        dumtup[MAXTUP];
  40:     struct index    itup;
  41:     DESC        si_desc;
  42:     extern DESC Inddes;
  43:     struct key_pt
  44:     {
  45:         char    *pt_old;
  46:         char    *pt_new;
  47:     };
  48:     struct key_pt   keys[MAXKEYS+1];
  49: 
  50:     mode = Batchhd.mode_up;
  51:     Batch_dirty = FALSE;
  52: #	ifdef xZTR1
  53:     if (tTf(49, -1))
  54:         printf("SECUPDATE\n");
  55: #	endif
  56:     opencatalog("indexes", OR_READ);
  57:     setkey(&Inddes, &itup, r->reldum.relid, IRELIDP);
  58:     setkey(&Inddes, &itup, r->reldum.relowner, IOWNERP);
  59:     if (i = find(&Inddes, EXACTKEY, &lotid, &hitid, &itup))
  60:         syserr("secupdate:find indexes %d", i);
  61: 
  62:     /* update each secondary index */
  63:     while(!(i = get(&Inddes, &lotid, &hitid, &itup, TRUE)))
  64:     {
  65:         /* check if the index is on the right relation */
  66: #		ifdef xZTR1
  67:         if (tTf(49, 7))
  68:             printup(&Inddes, &itup);
  69: #		endif
  70:         if (!bequal(itup.irelidp, r->reldum.relid, MAXNAME) ||
  71:             !bequal(itup.iownerp, r->reldum.relowner, 2))
  72:             continue;
  73: 
  74:         if (i = openr(&si_desc, OR_WRITE, itup.irelidi))
  75:             syserr("secupdate:can't openr %.12s %d", itup.irelidi, i);
  76:         /* reposition batch file to the beginning. */
  77:         if ((i = lseek(Batch_fp, 0L, 0)) < 0)
  78:             syserr("secupdate:seek %d %d", i, Batch_fp);
  79:         Batch_cnt = BATCHSIZE;
  80:         getbatch(&Batchhd, sizeof Batchhd); /* reread header */
  81: 
  82:         /* set up the key structure */
  83:         p = itup.idom;
  84:         for (domcnt = 0; domcnt < MAXKEYS; domcnt++)
  85:         {
  86:             if ((dom = *p++) == 0)
  87:                 break;  /* no more key domains */
  88: #			ifdef xZTR1
  89:             if (tTf(49, 15))
  90: 
  91:                 printf("dom %d,tupo_off %d\n", dom, Batchhd.si[dom].tupo_off);
  92: #			endif
  93:             keys[domcnt].pt_old = &oldtup[Batchhd.si[dom].tupo_off];
  94:             keys[domcnt].pt_new = &newtup[r->reloff[dom]];
  95:         }
  96: 
  97:         /* the last domain is the "tidp" field */
  98:         keys[domcnt].pt_old = (char *) &oldtid;
  99:         keys[domcnt].pt_new = (char *) &newtid;
 100: 
 101:         /*
 102: 		** Start reading the batch file and updating
 103: 		** the secondary indexes.
 104: 		*/
 105:         tupcnt = Batchhd.num_updts;
 106:         while (tupcnt--)
 107:         {
 108:             getbatch(&oldtid, Batchhd.tido_size);
 109:             getbatch(oldtup, Batchhd.tupo_size);
 110:             getbatch(newtup, Batchhd.tupn_size);
 111:             getbatch(&newtid, Batchhd.tidn_size);
 112: 
 113:             /* if this is a replace or append form the new key */
 114:             if (mode != mdDEL)
 115:             {
 116:                 for (j = 0; j <= domcnt; j++)
 117:                     setkey(&si_desc, newkey, keys[j].pt_new, j+1);
 118: #				ifdef xZTR1
 119:                 if (tTf(49, 7))
 120:                     printup(&si_desc, newkey);
 121: #				endif
 122:             }
 123: 
 124:             /* if this is delete or replace form the old key */
 125:             if (mode != mdAPP)
 126:             {
 127:                 for (j = 0; j <= domcnt; j++)
 128:                     setkey(&si_desc, oldkey, keys[j].pt_old, j+1);
 129: #				ifdef xZTR1
 130:                 if (tTf(49, 8))
 131:                     printup(&si_desc, oldkey);
 132: #				endif
 133:             }
 134: 
 135:             switch (mode)
 136:             {
 137: 
 138:               case mdDEL:
 139:                 if (i = getequal(&si_desc, oldkey, dumtup, &uptid))
 140:                 {
 141:                     if (i > 0)
 142:                         break;
 143:                     syserr("secupdate:getequal %d", i);
 144:                 }
 145:                 if ((i = delete(&si_desc, &uptid)) < 0)
 146:                     syserr("secupdate:delete %d", i);
 147:                 break;
 148: 
 149:               case mdREPL:
 150:                 /* if the newtup = oldtup then do nothing */
 151:                 if (bequal(oldkey, newkey, si_desc.reldum.relwid))
 152:                     break;
 153:                 if (i = getequal(&si_desc, oldkey, dumtup, &uptid))
 154:                 {
 155:                     if (Batch_recovery && i > 0)
 156:                         goto secinsert;
 157:                     syserr("secupdate:getequal-repl %d", i);
 158:                 }
 159:                 if (i = replace(&si_desc, &uptid, newkey, TRUE))
 160:                 {
 161:                     /* if newtuple is dup of old, ok */
 162:                     if (i == 1)
 163:                         break;
 164:                     /* if this is recovery and old tid not there, try an insert */
 165:                     if (Batch_recovery && i == 2)
 166:                         goto secinsert;
 167:                     syserr("secupdate:replace %d", i);
 168:                 }
 169:                 break;
 170: 
 171:               case mdAPP:
 172:               secinsert:
 173:                 if ((i = insert(&si_desc, &uptid, newkey, TRUE)) < 0)
 174:                     syserr("secupdate:insert %d", i);
 175:             }
 176:         }
 177:         if (i = closer(&si_desc))
 178:             syserr("secupdate:closer %.12s %d", si_desc.reldum.relid, i);
 179:     }
 180:     if (i < 0)
 181:         syserr("secupdate:bad get from indexes %d", i);
 182: }

Defined functions

secupdate defined in line 9; used 1 times

Defined struct's

key_pt defined in line 43; used 2 times
  • in line 48(2)
Last modified: 1986-04-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1004
Valid CSS Valid XHTML 1.0 Strict