Annotation of 43BSD/ingres/source/support/copydb.q, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.