1: # include <ingres.h>
2: # include <access.h>
3: # include <sccs.h>
4:
5: SCCSID(@(#)seq_atts.c 8.1 12/31/84)
6:
7: /*
8: ** Seq_attributes - get all attributes of a relation in their correct order.
9: **
10: ** Seq_attributes() can be called when it is desired to get all
11: ** attribute tuples for a relation. They are guaranteed to be in
12: ** the same order as they were created in; that is "attid" order.
13: **
14: ** The calling convention is:
15: **
16: ** seq_init(Attribute_descriptor, Descriptor_for_relation)
17: **
18: ** while (seq_attribute(Att_desc, Des_for_rel, Tuple)
19: ** {
20: ** }
21: **
22: ** The first parameter is an OPEN descriptor for the attribute
23: ** relation. The second parameter is a descriptor for the relation.
24: ** It must have the relation-relation tuple (ie openr mode -1).
25: ** The third parameter is a place to put the attribute. Its
26: ** dimension must be at least sizeof (attribute structure).
27: **
28: ** Seq_attribute attempts to optimize the retrieval of the
29: ** attributes. It assumes initially that the are physically
30: ** stored sequentially. If so it will retrieve them in the
31: ** minimum possible number of accesses.
32: **
33: ** If it finds one tuple out of sequence then all future
34: ** scans will start from that first out of sequence tuple.
35: */
36:
37: struct tup_id Seq_tdl, Seq_tdh, Seq_tdf;
38: int Seq_seqmode, Seq_next;
39:
40:
41:
42: seq_init(a, r)
43: register DESC *a;
44: register DESC *r;
45: {
46: register int i;
47: struct attribute attkey;
48:
49: clearkeys(a);
50: setkey(a, &attkey, r->reldum.relid, ATTRELID);
51: setkey(a, &attkey, r->reldum.relowner, ATTOWNER);
52: if (i = find(a, EXACTKEY, &Seq_tdl, &Seq_tdh, &attkey))
53: syserr("seq_init:find:%d", i);
54:
55: Seq_seqmode = TRUE;
56: Seq_next = 1;
57: }
58:
59:
60: seq_attributes(a, r, atup)
61: register DESC *a;
62: register DESC *r;
63: register struct attribute *atup;
64: {
65: int i, nxttup;
66:
67: if (Seq_next > r->reldum.relatts)
68: return (0); /* no more attributes */
69:
70: if (!Seq_seqmode)
71: {
72: /* attributes not stored sequencially, start from first attribute */
73: bmove(&Seq_tdf, &Seq_tdl, sizeof (Seq_tdl));
74: nxttup = FALSE;
75: }
76: else
77: nxttup = TRUE;
78:
79: while ((i = get(a, &Seq_tdl, &Seq_tdh, atup, nxttup)) == 0)
80: {
81:
82: nxttup = TRUE;
83: /* make sure this is a tuple for the right relation */
84: if (kcompare(a, atup, r))
85: continue;
86:
87: /* is this the attribute we want? */
88: if (atup->attid != Seq_next)
89: {
90: if (Seq_seqmode)
91: {
92: /*
93: ** Turn off seq mode. Save the tid of
94: ** the current tuple. It will be the
95: ** starting point for the next call
96: ** to seq_attribute
97: */
98: bmove(&Seq_tdl, &Seq_tdf, sizeof (Seq_tdf));
99: Seq_seqmode = FALSE;
100: }
101:
102: continue;
103: }
104:
105: /* got current attribute. increment to next attribute */
106: Seq_next++;
107: return (1);
108: }
109:
110: /* fell out of loop. either bad get return or missing attribute */
111: syserr("seq_att:bad or missing %d,%d", i, Seq_next);
112: }
Defined functions
Defined variables