|
|
1.1 root 1: # include <ingres.h>
2: # include <resp.h>
3: # include <aux.h>
4: # include <symbol.h>
5: # include <access.h>
6: # include <batch.h>
7: # include <sccs.h>
8:
9: SCCSID(@(#)update.c 7.1 2/5/81)
10:
11: /*
12: ** Update reads a batch file written by the
13: ** access method routines (openbatch, addbatch, closebatch)
14: ** and performs the updates stored in the file.
15: **
16: ** It assumes that it is running in the database. It
17: ** is driven by the data in the Batchhd struct (see ../batch.h).
18: ** If the relation has a secondary index then update calls
19: ** secupdate. As a last step the batch file is removed.
20: **
21: ** The global flag Batch_recovery is tested in case
22: ** of an error. It should be FALSE if update is being
23: ** run as the dbu deferred update processor. It should
24: ** be TRUE if it is being used as part of the recovery
25: ** procedure.
26: */
27:
28: update()
29: {
30: register int i, mode;
31: DESC rel;
32: long oldtid, tupcnt;
33: char oldtup[MAXTUP], newtup[MAXTUP];
34: char *batchname();
35:
36: # ifdef xZTR1
37: if (tTf(48, -1))
38: printf("Update on %s\n", batchname());
39: # endif
40: /* set up to read batchhd */
41: Batch_cnt = BATCHSIZE; /* force a read on next getbatch */
42: Batch_dirty = FALSE;
43: if ((Batch_fp = open(batchname(), 2)) < 0)
44: syserr("prim:can't open %s", batchname());
45: getbatch(&Batchhd, sizeof Batchhd);
46:
47: tupcnt = Batchhd.num_updts;
48: # ifdef xZTR1
49: if (tTf(48, 0))
50: printf("rel=%s tups=%ld\n", Batchhd.rel_name, tupcnt);
51: # endif
52: Resp.resp_tups = 0;
53: if (!tupcnt)
54: {
55: rmbatch();
56: return (1);
57: }
58:
59: /* update the primary relation */
60: if (i = openr(&rel, 2, Batchhd.rel_name))
61: syserr("prim:can't openr %s %d", Batchhd.rel_name, i);
62: mode = Batchhd.mode_up;
63:
64: while (tupcnt--)
65: {
66: getbatch(&oldtid, Batchhd.tido_size); /* read old tid */
67: getbatch(oldtup, Batchhd.tupo_size); /* and portions of old tuple */
68: getbatch(newtup, Batchhd.tupn_size); /* and the newtup */
69:
70: switch (mode)
71: {
72:
73: case mdDEL:
74: if ((i = delete(&rel, &oldtid)) < 0)
75: syserr("prim:bad del %d %s", i, Batchhd.rel_name);
76: break;
77:
78: case mdREPL:
79: if (i = replace(&rel, &oldtid, newtup, TRUE))
80: {
81: /* if newtuple is a duplicate, then ok */
82: if (i == 1)
83: break;
84: /* if this is recovery and oldtup not there, try to insert newtup */
85: if (Batch_recovery && i == 2)
86: goto upinsert;
87: syserr("prim:Non-functional replace on %s (%d)", i, Batchhd.rel_name);
88: }
89: Resp.resp_tups++;
90: break;
91:
92: case mdAPP:
93: upinsert:
94: if ((i = insert(&rel, &oldtid, newtup, TRUE)) < 0)
95: syserr("prim:bad insert %d %s", i, Batchhd.rel_name);
96: break;
97:
98: default:
99: syserr("prim:impossible mode %d", mode);
100: }
101: putbatch(&oldtid, Batchhd.tidn_size); /* write new tid if necessary */
102: }
103: /* fix the tupchanged count if delete or append */
104: if (mode != mdREPL)
105: Resp.resp_tups = rel.reladds >= 0 ? rel.reladds : -rel.reladds;
106: /* close the relation but secupdate will still use the decriptor */
107: if (i = closer(&rel))
108: syserr("prim:close err %d %s", i, Batchhd.rel_name);
109: batchflush();
110:
111: /* if this relation is indexed, update the indexes */
112: if (rel.reldum.relindxd > 0)
113: secupdate(&rel);
114: rmbatch();
115:
116: # ifdef xZTR1
117: if (tTf(48, 2))
118: printf("%ld tups changed\n", Resp.resp_tups);
119: # endif
120: return (0);
121: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.