|
|
1.1 root 1: # include <stdio.h>
2: # include <useful.h>
3: # include <sccs.h>
4:
5: SCCSID(@(#)copydb.q 8.2 1/17/85)
6:
7:
8: # define MAXNAME 13 /* one more for the null */
9: # define MAXKEYS 6 /* changing this is insuficient */
10: # define MAXINDEX 10 /* change as needed */
11: # define MAXREL 1000 /* can be increased as needed */
12: # define MAXDOM 50
13: # define INT 30
14: # define FLOAT 31
15: # define CHAR 32
16: ##char Usercode[100];
17: char **Wanted;
18: int Status;
19:
20: extern int (*ExitFn)();
21: FILE *Ifile, *Ofile;
22:
23: struct relation
24: {
25: char name[MAXNAME];
26: char indx;
27: int spec;
28: int atts;
29: };
30:
31: struct attribute
32: {
33: char aname[MAXNAME];
34: char format;
35: int length;
36: };
37:
38: struct index
39: {
40: char iname[MAXNAME];
41: char ispec;
42: char idom[MAXKEYS];
43: };
44:
45:
46: /*
47: ** sysexit
48: ** The function to call for an exit to occur, this
49: ** is all for the benefit of syserr, so it doesn't core dump.
50: */
51: sysexit(value)
52: int value;
53: {
54: exit(value);
55: }/* sysexit */
56:
57: main(argc,argv)
58: int argc;
59: char **argv;
60: {
61:
62: ## char *db;
63: char *path;
64: ## char name[MAXNAME];
65: ## int indx;
66: ## int atts;
67: ## int spec;
68: ## char iname[MAXNAME];
69: ## int idomv1, idomv2, idomv3, idomv4, idomv5, idomv6;
70:
71: ## int n;
72:
73: register struct relation *relptr;
74: register struct attribute *attptr;
75: register int i;
76: struct relation relations[MAXREL];
77: struct attribute attributes[MAXDOM], indatts[MAXKEYS];
78: struct index indexes[MAXINDEX];
79: struct index *indxptr;
80: int attxtra[MAXDOM], indattx[MAXKEYS];
81: int xcount;
82: int j;
83: char line[100];
84: ## char *uover;
85:
86: umask(022);
87: ExitFn = sysexit; /* set up exit routine for syserr */
88:
89: if (argc < 3)
90: syserr(0,"usage: copydb database targetdir [relation] ...");
91:
92: uover = 0;
93: if (bequal(*++argv, "-u", 2))
94: uover = *argv++;
95: db = *argv++;
96: path = *argv++;
97: Wanted = argv++;
98:
99: if(path[0] != '/')
100: printf("Warning %s is not a full path name\n",path);
101:
102:
103: if ((Ifile = fopen(ztack(path,"/copy.in"), "w")) == NULL)
104: syserr(0,"Cannot create %s!",ztack(path,"/copy.in"));
105: if ((Ofile = fopen(ztack(path,"/copy.out"), "w")) == NULL)
106: syserr(0,"Cannot create %s!",ztack(path,"/copy.out"));
107:
108:
109: ## ingres db uover
110:
111: ## retrieve (Usercode = usercode)
112:
113: ## range of r is relation
114: i = 0;
115:
116: /*
117: ** Bring the relations into core
118: */
119: relptr = relations;
120: ## retrieve (name = r.relid, spec = r.relspec, indx = r.relindxd,
121: ## atts = r.relatts)
122: ## where r.relowner = Usercode
123: ## and mod(r.relstat,2) != 1 /* sys catalog */
124: ## and r.relindxd >= 0
125: ## and r.relid != "_SYS*" /* system temporaries */
126: ## {
127: if (notwanted(name))
128: continue;
129: if(i++>=MAXREL)
130: syserr("Too many relations!!!");
131: smove(name,(relptr->name));
132: relptr->spec = spec;
133: relptr->indx = indx;
134: relptr++->atts = atts;
135: ## }
136:
137:
138: /*
139: ** For each relation bring its attributes into core
140: ** in domain order
141: */
142: ## range of a is attribute
143: ## range of i is indexes
144: n = i;
145: printf("%d relations found\n",n);
146: for (relptr = relations; relptr < &relations[n]; relptr++)
147: {
148: writein("create ");
149: writeout("copy ");
150: smove(relptr->name,name);
151: writeboth(name);
152: writeboth("(\n\t");
153:
154: xcount = retatts(name,attributes,attxtra);
155: for(i = 0; i < relptr->atts; i++)
156: {
157: attptr = &attributes[i];
158: if(i)
159: writeboth(",\n\t");
160: writeboth(attptr->aname);
161: putboth('=');
162: switch(attptr->format)
163: {
164:
165: case 'i':
166: putboth('i');
167: break;
168:
169: case 'f':
170: putboth('f');
171: break;
172:
173: case 'c':
174: putboth('c');
175: break;
176:
177: default:
178: syserr("Bad type: %d, in %c of %s!!",
179: attptr->format,attptr->aname,
180: name);
181:
182: }
183: attptr->length &= I1MASK;
184: writeboth(iocv(attptr->length));
185: }
186:
187: writeboth("\n)");
188: writeout(" into \"");
189: writein("\n\\p\\g\ncopy ");
190: writein(name);
191: writein("() from \"");
192: writeboth(path);
193: putboth('/');
194: writeboth(name);
195: writeboth(Usercode);
196: writeboth("\"\n\\p\\g\n");
197:
198:
199: if (relptr->spec != 5 && relptr->spec != 0)
200: modify(name,attributes,attxtra,relptr->spec,xcount);
201: if (relptr->indx)
202: {
203: indxptr = indexes;
204: i = 0;
205:
206: ## retrieve (iname = i.irelidi, spec = i.irelspeci,
207: ## idomv1 = i.idom1, idomv2 = i.idom2, idomv3 = i.idom3,
208: ## idomv4 = i.idom4, idomv5 = i.idom5, idomv6 = i.idom6)
209: ## where i.irelidp = name and i.iownerp = Usercode
210: ## {
211:
212: if (i++ >= MAXINDEX)
213: syserr("Too many indexes on %s!!",name);
214: smove(iname,indxptr->iname);
215: indxptr->ispec = spec;
216: indxptr->idom[0] = idomv1;
217: indxptr->idom[1] = idomv2;
218: indxptr->idom[2] = idomv3;
219: indxptr->idom[3] = idomv4;
220: indxptr->idom[4] = idomv5;
221: indxptr->idom[5] = idomv6;
222: indxptr++;
223: ## }
224:
225: while (--indxptr >= indexes)
226: {
227:
228: writein("index on ");
229: writein(name);
230: writein(" is ");
231: writein(indxptr->iname);
232: writein("(\n\t");
233:
234: for (i=0; indxptr->idom[i] && i < MAXKEYS; i++)
235: {
236: if(i)
237: writein(",\n\t");
238: writein(attributes[indxptr->idom[i]-1].aname);
239: }
240: writein(")\n\\p\\g\n");
241: if(indxptr->ispec != 10 && indxptr->ispec != 11)
242: {
243: xcount = retatts(indxptr->iname,indatts,indattx);
244: modify(indxptr->iname,indatts,indattx,indxptr->ispec,xcount);
245: }
246: }
247: }
248: }
249: fflush(Ifile);
250: fflush(Ofile);
251: printf("All done!\n\n");
252: }
253: exitfn()
254: {
255: fflush(Ifile);
256: fflush(Ofile);
257: exit(-1);
258: }
259:
260:
261: modify(name, attributes, attxtra, spec, xcount)
262: char *name;
263: struct attribute *attributes;
264: int *attxtra;
265: int spec;
266: int xcount;
267: {
268: register i,j;
269: writein("modify ");
270: writein(name);
271: writein(" to ");
272: switch(spec)
273: {
274:
275: case -5:
276: writein("cheap");
277: goto nokeys;
278:
279: case -10:
280: case -11:
281: writein("c");
282: case 10:
283: case 11:
284: writein("isam on ");
285: break;
286:
287: case -20:
288: case -21:
289: writein("c");
290: case 21:
291: case 20:
292: writein("hash on ");
293: break;
294:
295: default:
296: syserr("Unimplimented spec: %d on %s",
297: spec,name);
298:
299: }
300: j = 0;
301: for (i = 1; i <= xcount; i++)
302: {
303: if(j++)
304: writein(",\n\t");
305: writein(attributes[attxtra[i]].aname);
306: }
307: if (!j)
308: syserr("No keys found for %s!!!",name);
309: nokeys:
310: writein("\n\\p\\g\n");
311: }
312: retatts(name,attributes,attxtra)
313: char *name;
314: struct attribute *attributes;
315: int attxtra[];
316: {
317: register xcount, i;
318: register struct attribute *attptr;
319:
320: ## char aname[MAXNAME];
321: ## int domain, length, extra;
322: ## char format[1];
323: i = xcount = 0;
324: ## retrieve (aname = a.attname,domain = a.attid, format = a.attfrmt,
325: ## length = a.attfrml, extra = a.attxtra)
326: ##
327: ## where a.attrelid = name and a.attowner = Usercode
328: ## {
329: if (i++ >= MAXDOM)
330: syserr("Too many attributes!!!");
331: attptr = &attributes[domain-1];
332: smove(aname,attptr->aname);
333: attptr->format = format[0];
334: attptr->length = length;
335: if(extra)
336: {
337: attxtra[extra] = domain - 1;
338: xcount++;
339: }
340: ## }
341: return(xcount);
342: }
343:
344:
345: writeboth(string)
346: char *string;
347: {
348: register char *sp;
349:
350: sp = string;
351:
352: while(*sp)
353: {
354: putc(*sp, Ofile);
355: putc(*sp++, Ifile);
356: }
357: }
358:
359: putboth(ch)
360: char ch;
361: {
362: putc(ch, Ofile);
363: putc(ch, Ifile);
364: }
365:
366:
367: writeout(string)
368: char *string;
369: {
370: register char *sp;
371:
372: sp = string;
373: while (*sp)
374: putc(*sp++,Ofile);
375: }
376:
377:
378: writein(string)
379: char *string;
380: {
381: register char *sp;
382:
383: sp = string;
384: while (*sp)
385: putc(*sp++,Ifile);
386: }
387:
388:
389:
390:
391: /*
392: ** Check to see if relation is wanted.
393: */
394:
395:
396: notwanted(relname)
397: char *relname;
398:
399: {
400:
401: register char **wantlist;
402: register char *nptr;
403:
404: if (*(wantlist = Wanted) == (char *) 0)
405: return (0);
406:
407: nptr = relname;
408: do
409: if (!scompare(nptr, 0, *wantlist++, 0))
410: return (0);
411: while (*wantlist != (char *) 0);
412: return (1);
413: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.