|
|
1.1 root 1: # include <ingres.h>
2: # include <symbol.h>
3: # include <access.h>
4: # include <sccs.h>
5:
6: SCCSID(@(#)put_tuple.c 7.1 2/5/81)
7:
8:
9:
10: char *Acctuple;
11: char Accanon[MAXTUP];
12:
13:
14: /*
15: ** PUT_TUPLE
16: **
17: ** Put the canonical tuple in the position
18: ** on the current page specified by tid
19: **
20: ** Trace Flags:
21: ** 27.3-5
22: */
23:
24: put_tuple(tid, tuple, length)
25: TID *tid;
26: char *tuple;
27: int length;
28: {
29: register char *tp;
30: char *get_addr();
31:
32: # ifdef xATR2
33: if (tTf(27, 3))
34: {
35: printf("put_tuple:len=%d,", length);
36: dumptid(tid);
37: }
38: # endif
39:
40: /* get address in buffer */
41: tp = get_addr(tid);
42:
43: /* move the tuple */
44: bmove(tuple, tp, length);
45:
46: /* mark page as dirty */
47: Acc_head->bufstatus |= BUF_DIRTY;
48: }
49: /*
50: ** CANONICAL
51: **
52: ** Make the tuple canonical and return the length
53: ** of the tuple.
54: **
55: ** If the relation is compressed then the tuple in
56: ** compressed into the global area Accanon.
57: **
58: ** As a side effect, the address of the tuple to be
59: ** inserted is placed in Acctuple.
60: **
61: ** returns: length of canonical tuple
62: **
63: ** Trace Flags:
64: ** 27.6, 7
65: */
66:
67: canonical(d, tuple)
68: register DESC *d;
69: register char *tuple;
70: {
71: register int i;
72:
73: if (d->reldum.relspec < 0)
74: {
75: /* compress tuple */
76: i = comp_tup(d, tuple);
77: Acctuple = Accanon;
78: }
79: else
80: {
81: Acctuple = tuple;
82: i = d->reldum.relwid;
83: }
84: # ifdef xATR3
85: if (tTf(27, 6))
86: printf("canonical: %d\n", i);
87: # endif
88: return (i);
89: }
90: /*
91: ** COMP_TUP
92: **
93: ** Compress the tuple into Accanon. Compression is
94: ** done by copying INT and FLOAT as is.
95: ** For CHAR fields, the tuple is copied until a null
96: ** byte or until the end of the field. Then trailing
97: ** blanks are removed and a null byte is inserted at
98: ** the end if any trailing blanks were present.
99: */
100:
101: comp_tup(d, src)
102: register DESC *d;
103: register char *src;
104: {
105: register char *dst;
106: char *save;
107: char *domlen, *domtype;
108: int i, j, len;
109:
110: dst = Accanon;
111:
112: domlen = &d->relfrml[1];
113: domtype = &d->relfrmt[1];
114:
115: for (i = 1; i <= d->reldum.relatts; i++)
116: {
117: len = *domlen++ & I1MASK;
118: if (*domtype++ == CHAR)
119: {
120: save = src;
121: for (j = 1; j <= len; j++)
122: {
123: if ((*dst++ = *src++) == NULL)
124: {
125: dst--;
126: break;
127: }
128: }
129:
130: while (j--)
131: if (*--dst != ' ')
132: break;
133:
134: if (j != len)
135: *++dst = NULL;
136:
137: dst++;
138: src = save + len;
139: }
140: else
141: {
142: while (len--)
143: *dst++ = *src++;
144:
145: }
146: }
147: return (dst - Accanon);
148: }
149: /*
150: ** SPACE_LEFT
151: **
152: ** Determine how much space remains on the page in
153: ** the current buffer. Included in computation
154: ** is the room for an additional line number
155: */
156:
157: space_left(bp)
158: register struct accbuf *bp;
159: {
160: register int nextoff;
161: register int i;
162: register short *pp;
163:
164: nextoff = bp->nxtlino;
165: # ifdef xATR3
166: if (nextoff < 0 || nextoff > PGSIZE)
167: syserr("space_left: nextoff=%d", nextoff);
168: # endif
169:
170: /* compute space left on page */
171: pp = &bp->linetab[-nextoff];
172: i = PGSIZE - *pp - (nextoff + 2) * 2;
173:
174: /* see if there is also a free line number */
175: if (nextoff < MAXLINENO)
176: return (i);
177: while (++pp <= &bp->linetab[0])
178: if (*pp == 0)
179: return (i);
180: return (0);
181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.