|
|
1.1 root 1: # include <ingres.h>
2: # include <access.h>
3: # include <aux.h>
4: # include <lock.h>
5: # include <sccs.h>
6:
7: SCCSID(@(#)add_ovflo.c 8.2 2/8/85)
8:
9: /*
10: ** ADD_OVFLO -- Allocates an overflow page which will be
11: ** attached to current page. TID must be for current page.
12: ** TID will be updated to id of new overflow page.
13: **
14: ** Parameters:
15: ** dx - descriptor for relation
16: ** tid - tid for current page
17: **
18: ** Side Effects:
19: ** tid is updated to id of new overflow page
20: **
21: ** Trace Flags:
22: ** 26.3
23: **
24: ** Returns:
25: ** 0 - success
26: ** -1 (NOBUFFER) can't get buffer for overflow page
27: ** -2 (NOSETUP) can't set up overflow page
28: ** -3 (NOGETCURRENT) can't get the current page
29: ** -4 (NORMVMAIN) can't remove main page
30: ** -5 (NOGETOVFLO) can't get the overflow page
31: **
32: */
33:
34: add_ovflo(dx, tid)
35: DESC *dx;
36: TID *tid;
37: {
38: register DESC *d;
39: register struct accbuf *b;
40: extern struct accbuf *choose_buf();
41: register int lk;
42: int i;
43: long mpage, newpage;
44: TID tidx;
45:
46: d = dx;
47: # ifdef xATR2
48: if (tTf(26, 3))
49: printf("ADD_OVFLO:\n");
50: # endif
51:
52: /*
53: ** save main page pointer so that it may be used when
54: ** setting up new overflow page.
55: */
56: mpage = Acc_head->mainpg;
57:
58: if (lk = (Acclock && (d->reldum.relstat & S_CONCUR) && (d->relopn < 0 )))
59: {
60: setcsl(Acc_head->rel_tupid);
61: Acclock = FALSE;
62: }
63:
64: /*
65: ** Determine last page of the relation
66: */
67: last_page(d, &tidx, Acc_head);
68: pluck_page(&tidx, &newpage);
69: newpage++;
70:
71: /*
72: ** choose an available buffer as victim for setting up
73: ** overflow page.
74: */
75: if ((b = choose_buf(d, newpage)) == NULL)
76: {
77: if (lk)
78: {
79: Acclock = TRUE;
80: unlcs(Acc_head->rel_tupid);
81: }
82: return(NOBUFFER);
83: }
84:
85: /*
86: ** setup overflow page
87: */
88:
89: b->mainpg = mpage;
90: b->ovflopg = 0;
91: b->thispage = newpage;
92: b->linetab[0] = (int) b->firstup - (int) b;
93: b->nxtlino = 0;
94: b->bufstatus |= BUF_DIRTY;
95: if (pageflush(b))
96: return (NOSETUP);
97:
98: /*
99: ** now that overflow page has successfully been written,
100: ** get the old current page back and link the new overflow page
101: ** to it.
102: ** If the relation is a heap then don't leave the old main
103: ** page around in the buffers. This is done on the belief
104: ** that it will never be accessed again.
105: */
106:
107: if (get_page(d, tid))
108: return (NOGETCURRENT);
109: Acc_head->ovflopg = newpage;
110: Acc_head->bufstatus |= BUF_DIRTY;
111: i = pageflush(Acc_head);
112: if (lk)
113: {
114: Acclock = TRUE;
115: unlcs(Acc_head->rel_tupid);
116: }
117: if (i)
118: return (NORMVMAIN);
119: if (abs(d->reldum.relspec) == M_HEAP)
120: resetacc(Acc_head); /* no error is possible */
121:
122: /*
123: ** now bring the overflow page back and make it current.
124: ** if the overflow page is still in AM cache, then this will not
125: ** cause any disk activity.
126: */
127:
128: stuff_page(tid, &newpage);
129: if (get_page(d, tid))
130: return (NOGETOVFLO);
131: return (0);
132: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.