1: # include "../ingres.h" 2: # include "../catalog.h" 3: /* 4: ** GET_P_TID -- Get the primary tid for a relation for locking 5: ** 6: ** Finds the correct tid for locking the relation. If the 7: ** relation is a primary relation, then the tid of the 8: ** relation is returned. 9: ** 10: ** If the relation is a secondary index then the tid of the 11: ** primary relation is returned. 12: ** 13: ** Parameters: 14: ** des - an open descriptor for the relation. 15: ** tidp - a pointer to a place to store the tid. 16: ** 17: ** Returns: 18: ** none 19: ** 20: ** Side Effects: 21: ** alters the value stored in "tidp", 22: ** may cause access to the indexes relation 23: ** 24: ** Requires: 25: ** opencatalog 26: ** 27: ** Called By: 28: ** modify 29: ** 30: ** Syserrs: 31: ** if the indexes relation cannot be accessed or 32: ** is inconsistent. 33: ** 34: ** History: 35: ** 12/28/78 (rse) - written 36: */ 37: 38: 39: 40: get_p_tid(des, tidp) 41: struct descriptor *des; 42: struct tup_id *tidp; 43: { 44: register struct descriptor *d; 45: register struct tup_id *tp; 46: register int i; 47: struct index indkey, itup; 48: struct descriptor ides; 49: extern struct descriptor Inddes; 50: 51: d = des; 52: tp = tidp; 53: if (d->relindxd < 0) 54: { 55: /* this is a secondary index. lock the primary rel */ 56: opencatalog("indexes", 0); 57: setkey(&Inddes, &indkey, d->relowner, IOWNERP); 58: setkey(&Inddes, &indkey, d->relid, IRELIDI); 59: if (getequal(&Inddes, &indkey, &itup, tp)) 60: syserr("No prim for %.14s", d->relid); 61: 62: if (i = openr(&ides, -1, itup.irelidp)) 63: syserr("openr prim %d,%.14s", i, itup.irelidp); 64: 65: bmove(&ides.reltid, tp, sizeof (*tp)); 66: } 67: else 68: bmove(&d->reltid, tp, sizeof (*tp)); 69: }