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