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