|
|
1.1 root 1: # include <ingres.h>
2: # include <aux.h>
3: # include <catalog.h>
4: # include <symbol.h>
5: # include <access.h>
6: # include <batch.h>
7: # include <btree.h>
8: # include <sccs.h>
9:
10: SCCSID(@(#)batch.c 8.2 1/17/85)
11:
12: /*
13: ** Open batch prepares for batch processing.
14: ** 1. If the batch is already open, return an error
15: ** 2. Create the batch file.
16: ** 3. clear domain flags.
17: ** 4. If the relation is indexed, Identify all the domains
18: ** which must be saved to speed the index update.
19: ** 5. Set up specifics for each type of update.
20: ** 6. Write out the batch structure.
21: **
22: ** The following itemizes what is saved (in bytes):
23: ** f(si) means it's a function of the secondary index keys
24: ** space for newtid is saved only if there is a sec. index.
25: **
26: ** mdDEL mdREPL mdAPP
27: **
28: ** oldtid 4 4 0
29: ** oldtuple f(si) f(si) 0
30: ** newtuple 0 tupwid tupwid
31: ** newtid 0 4 4
32: */
33:
34: openbatch(rel_desc, index_desc, mode)
35: DESC *rel_desc, *index_desc;
36: int mode;
37: {
38: register struct si_doms *sp;
39: register DESC *rel, *indx;
40: int i, j, saveoff, dom;
41: char *p, *batchname();
42: TID lotid, hitid;
43: struct index itup;
44: extern char *Database;
45:
46: if (Batchhd.mode_up)
47: return (-1); /* batch already open */
48: rel = rel_desc;
49: indx = index_desc;
50: p = batchname(); /* form batch name */
51: # ifdef xATR1
52: if (tTf(25, -1))
53: printf("Openbatch %s\n", p);
54: # endif
55: if ((Batch_fp = creat(p, FILEMODE)) < 0)
56: syserr("openbatch:can't creat %s,%d", p, Batch_fp);
57: Batch_cnt = 0;
58:
59: /* copy the important info */
60: smove(Fileset, Batchbuf.file_id);
61: smove(Database, Batchhd.db_name);
62: bmove(rel->reldum.relid, Batchhd.rel_name, MAXNAME);
63: bmove(rel->reldum.relowner, Batchhd.userid, 2);
64: Batchhd.mode_up = mode;
65: Batchhd.num_updts = 0;
66:
67: /* clear out the secondary index domain flags */
68: sp = Batchhd.si; /* sp points to the structure */
69: for (i = 1; i <= MAXDOM; i++)
70: {
71: sp->dom_size = 0;
72: sp++;
73: }
74: Batchhd.si_dcount = 0;
75:
76: /* set up the tid and tuple sizes by type of update */
77: /* assume size of tido, tidn, and tupn */
78: Batchhd.tido_size = 4; /* assume old tid is needed */
79: Batchhd.tupo_size = 0; /* assume old tuple isn't needed */
80: Batchhd.tupn_size = rel->reldum.relwid; /* assume new tuple is needed */
81: Batchhd.tidn_size = 4; /* assume space is needed for new tid */
82: switch(Batchhd.mode_up)
83: {
84:
85: case mdDEL:
86: Batchhd.tupn_size = 0; /* new tuple isn't needed */
87: Batchhd.tidn_size = 0; /* new tid isn't needed */
88:
89: case mdREPL:
90: break;
91:
92: case mdAPP:
93: Batchhd.tido_size = 0; /* old tid isn't needed */
94: break;
95:
96: default:
97: syserr("openbatch:mode %d", Batchhd.mode_up);
98: }
99: /* if there are no secondary indexes then tipn isn't needed, unless
100: ** relation is ordered
101: */
102: if (rel->reldum.relindxd <= 0 && rel->reldum.reldim <= 0)
103: Batchhd.tidn_size = 0;
104:
105: /* if this relation has a secondary index or an ordered relation,
106: ** figure out what to save
107: */
108: if ((rel->reldum.relindxd > 0 || rel->reldum.reldim > 0) && mode != mdAPP)
109: {
110: if (rel->reldum.relindxd > 0)
111: {
112: setkey(indx, (char *) &itup, rel->reldum.relid, IRELIDP);
113: setkey(indx, (char *) &itup, rel->reldum.relowner, IOWNERP);
114:
115: if (find(indx, EXACTKEY, &lotid, &hitid, (char *) &itup))
116: syserr("openbatch:bad find %.12s", rel);
117:
118: /* check each entry in "index" relation for useful index */
119: while(!(i = get(indx, &lotid, &hitid, (char *) &itup, TRUE)))
120: {
121: if (!bequal(itup.irelidp, rel->reldum.relid, MAXNAME) ||
122: !bequal(itup.iownerp, rel->reldum.relowner, 2))
123: continue;
124: /* found one. copy the used domains */
125: p = itup.idom; /* get address of first */
126: i = 6;
127: while (i--)
128: {
129: if ((dom = *p++) == 0)
130: break; /* no more domains */
131: sp = &Batchhd.si[dom];
132: if (sp->dom_size != 0)
133: continue; /* domain has already been done once */
134: Batchhd.si_dcount++;
135: Batchhd.tupo_size += rel->relfrml[dom] & I1MASK;
136: sp->rel_off = rel->reloff[dom];
137: sp->dom_size = rel->relfrml[dom] & I1MASK;
138: }
139: }
140: }
141: for (j = rel->reldum.reldim - 1; j >= 0; --j)
142: {
143: /* point to lid field */
144: sp = &Batchhd.si[rel->reldum.relatts - j];
145: Batchhd.si_dcount++;
146: Batchhd.tupo_size += LIDSIZE;
147: sp->rel_off = rel->reloff[rel->reldum.relatts - j];
148: sp->dom_size = LIDSIZE;
149: }
150: if (i < 0)
151: syserr("openbatch:bad get index %d", i);
152: /* compute offsets of domains in saved "oldtuple" */
153: saveoff = 0;
154: sp = Batchhd.si;
155: i = Batchhd.si_dcount;
156: while (i--)
157: {
158: /* skip to next domain */
159: while (sp->dom_size == 0)
160: sp++;
161: sp->tupo_off = saveoff;
162: saveoff += sp->dom_size;
163: sp++;
164: }
165: }
166: wrbatch((char *) &Batchhd, sizeof Batchhd);
167: return (0);
168: }
169: /*
170: ** ADDBATCH -- add to batch file
171: */
172:
173: addbatch(oldtid, newtuple, oldtuple)
174: TID *oldtid;
175: char *newtuple, *oldtuple;
176: {
177: TID newtid;
178: register int i;
179: register struct si_doms *sp;
180: register char *old;
181:
182: # ifdef xATR1
183: if (tTf(25,3))
184: printf("addbatch\n");
185: # endif
186: if (Batchhd.mode_up == 0)
187: return (-1);
188: Batchhd.num_updts++; /* increment the number of add batches */
189: old = oldtuple;
190: /* write out the old tid */
191: wrbatch((char *) oldtid, Batchhd.tido_size);
192:
193: /* write out each of the old tuple domains */
194: i = Batchhd.si_dcount; /* i get the number of domains */
195: sp = Batchhd.si; /* sp points to the domain structures */
196:
197: while (i--)
198: {
199: /* skip to the next domain */
200: while (sp->dom_size == 0)
201: sp++;
202:
203: wrbatch(&old[sp->rel_off], sp->dom_size);
204: sp++;
205: }
206:
207: /* write out the new tuple */
208: wrbatch(newtuple, Batchhd.tupn_size);
209:
210: /* reserve space for the new tid. Init to -1 */
211: *((long *) &newtid) = -1;
212: wrbatch((char *) &newtid, Batchhd.tidn_size);
213: return (0);
214: }
215: /*
216: ** CLOSEBATCH -- close batch file
217: */
218:
219: closebatch()
220: {
221: register int i;
222: extern long lseek();
223:
224: if (Batchhd.mode_up == 0)
225: return (-1);
226: flushbatch(); /* write out any remainder */
227: if ((i = lseek(Batch_fp, 0l, 0)) == -1)
228: syserr("closebatch:seek %d", i);
229: wrbatch((char *) &Batchhd, sizeof Batchhd); /* update num_updts */
230: flushbatch();
231: if (i = close(Batch_fp))
232: syserr("closebatch:close %d", i);
233: Batchhd.mode_up = 0;
234: return (0);
235: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.