|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <access.h>
4: # include <symbol.h>
5: # include <sccs.h>
6:
7: SCCSID(@(#)openr.c 7.1 2/5/81)
8:
9: /*
10: ** OPENR -- Open a relation into a descriptor
11: **
12: ** Openr will open the named relation into the given descriptor
13: ** according to the mode specified. When searching for a name,
14: ** a relation owner by the current user will be searched for first.
15: ** If none is found then one owned by the DBA will be search for.
16: **
17: ** There are several available modes for opening a relation. The
18: ** most common are
19: ** mode 0 -- open for reading
20: ** mode 2 -- open for writing (mode 1 works identically).
21: ** Other modes which can be used to optimize performance:
22: ** mode -1 -- get relation-relation tuple and tid only.
23: ** Does not open the relation.
24: ** mode -2 -- open relation for reading after a previous
25: ** call of mode -1.
26: ** mode -3 -- open relation for writing after a previous
27: ** call of mode -1.
28: ** mode -4 -- open relation for reading. Assumes that relation
29: ** was previously open (eg relation & attributed
30: ** have been filled) and file was closed by closer.
31: ** mode -5 -- open relation for writing. Same assumptions as
32: ** mode -4.
33: **
34: ** Parameters:
35: ** dx - a pointer to a struct descriptor (defined in ingres.h)
36: ** mode - can be 2,0,-1,-2,-3,-4,-5
37: ** name - a null terminated name (only first 12 chars looked at)
38: **
39: ** Returns:
40: ** 1 - relation does not exist
41: ** 0 - ok
42: ** <0 - error. Refer to the error codes in access.h
43: **
44: ** Side Effects:
45: ** Opens the physical file if required. Fill the
46: ** descriptor structure. Initializes the access methods
47: ** if necessary.
48: **
49: ** Trace Flags:
50: ** 90
51: */
52:
53:
54: openr(d, mode, name)
55: register DESC *d;
56: int mode;
57: char *name;
58: {
59: register int retval, filemode;
60: char filename[MAXNAME+3];
61:
62: # ifdef xATR1
63: if (tTf(21, 0))
64: printf("openr:%.12s,%d\n", name, mode);
65: # endif
66: # ifdef xATM
67: if (tTf(76, 2))
68: timtrace(21, 0);
69: # endif
70:
71: /* init admin */
72: acc_init();
73:
74: /* process according to mode */
75:
76: filemode = 0;
77: switch (mode)
78: {
79:
80: case -1:
81: retval = get_reltup(d, name);
82: break;
83:
84: case 1:
85: case 2:
86: filemode = 2;
87:
88: case 0:
89: if (retval = get_reltup(d, name))
90: break;
91:
92: case -2:
93: case -3:
94: if (retval = get_attuples(d))
95: break;
96:
97: case -5:
98: if (mode == -3 || mode == -5)
99: filemode = 2;
100:
101: case -4:
102: clearkeys(d);
103: /* descriptor is filled. open file */
104: ingresname(d->reldum.relid, d->reldum.relowner, filename);
105: /* can't open a view */
106: if (d->reldum.relstat & S_VIEW)
107: {
108: retval = acc_err(AMOPNVIEW_ERR); /* view */
109: break;
110: }
111: if ((d->relfp = open(filename, filemode)) < 0)
112: {
113: retval = acc_err(AMNOFILE_ERR); /* can't open file */
114: break;
115: }
116: d->relopn = (d->relfp + 1) * 5;
117: if (filemode == 2)
118: d->relopn = -d->relopn;
119: d->reladds = 0;
120: retval = 0;
121: break;
122:
123: default:
124: syserr("openr:bd md=%d", mode);
125: }
126:
127: /* return */
128:
129: # ifdef xATR1
130: if (tTf(21, 4) && mode != -1 && retval != 1)
131: printdesc(d);
132: if (tTf(21, 0))
133: printf("openr rets %d\n", retval);
134: # endif
135:
136: # ifdef xATM
137: if (tTf(76, 2))
138: timtrace(22, 0);
139: # endif
140: return (retval);
141: }
142: /*
143: ** GET_ATTUPLES -- get tuples from attribute relation for this relation
144: */
145:
146: get_attuples(d)
147: register DESC *d;
148: {
149: struct attribute attr, attkey;
150: register int i, dom;
151: int numatts;
152: TID tid1, tid2;
153:
154: clearkeys(&Admin.adattd);
155:
156: /* zero all format types */
157: for (i = 0; i <= d->reldum.relatts; i++)
158: d->relfrmt[i] = 0;
159:
160: /* prepare to scan attribute relation */
161: setkey(&Admin.adattd, (char *) &attkey, d->reldum.relid, ATTRELID);
162: setkey(&Admin.adattd, (char *) &attkey, d->reldum.relowner, ATTOWNER);
163: if (i = find(&Admin.adattd, EXACTKEY, &tid1, &tid2, &attkey))
164: return (i);
165:
166: numatts = d->reldum.relatts;
167:
168: while (numatts && !get(&Admin.adattd, &tid1, &tid2, &attr, TRUE))
169: {
170:
171: /* does this attribute belong? */
172: if (bequal(&attr, &attkey, MAXNAME + 2))
173: {
174:
175: /* this attribute belongs */
176: dom = attr.attid; /* get domain number */
177:
178: if (d->relfrmt[dom])
179: break; /* duplicate attribute. force error */
180:
181: numatts--;
182: d->reloff[dom] = attr.attoff;
183: d->relfrmt[dom] = attr.attfrmt;
184: d->relfrml[dom] = attr.attfrml;
185: d->relxtra[dom] = attr.attxtra;
186: }
187: }
188:
189: d->relfrmt[0] = INT;
190: d->relfrml[0] = 4;
191: /* make sure all the atributes were there */
192: for (dom = 1; dom <= d->reldum.relatts; dom++)
193: if (d->relfrmt[dom] == 0)
194: numatts = 1; /* force an error */
195: if (numatts)
196: i = acc_err(AMNOATTS_ERR);
197:
198: flush_rel(&Admin.adattd, TRUE);
199:
200: # ifdef xATR1
201: if (tTf(21, 3))
202: printf("get_attr ret %d\n", i);
203: # endif
204:
205: return (i);
206: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.