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

1.1       root        1: # include      <ingres.h>
                      2: # include      <access.h>
                      3: # include      <sys/file.h>
                      4: # include      <pwd.h>
                      5: # include      <errno.h>
                      6: # include      <signal.h>
                      7: # include      <sccs.h>
                      8: 
                      9: SCCSID(@(#)ingconv.q   8.5 1/16/85)
                     10: 
                     11: /*
                     12: **  INGRES.H -- basic header file for ingres.
                     13: **
                     14: **     See also aux.h for definitions used by some but not all.
                     15: **
                     16: **     Version:
                     17: **             @(#)ingres.h    7.1     2/5/81
                     18: */
                     19: 
                     20: 
                     21: /*
                     22: **     RELATION relation struct
                     23: **
                     24: **     The RELATION relation contains one tuple for each relation
                     25: **     in the database.  This relation contains information which
                     26: **     describes how each relation is actually stored in the
                     27: **     database, who the owner is, information about its size,
                     28: **     assorted operation information, etc.
                     29: */
                     30: 
                     31: struct orelation
                     32: {
                     33:        c_12    relid[MAXNAME]; /* relation name        */
                     34:        c_2     relowner[2];    /* code of relation owner */
                     35:        i_1     relspec;        /* storage mode of relation     */
                     36:                                /* M_HEAP  unsorted paged heap  */
                     37:                                /* -M_HEAP compressed heap      */
                     38:                                /* M_ISAM  isam                 */
                     39:                                /* -M_ISAM compressed isam      */
                     40:                                /* M_HASH  hashed               */
                     41:                                /* -M_HASH compressed hash      */
                     42:        i_1     relindxd;       /* -1 rel is an index, 0 not indexed, 1 indexed */
                     43:        i_2     relstat2;       /* more status bits */
                     44:        i_2     relstat;        /* relation status bits */
                     45:        i_4     relsave;        /*unix time until which relation is saved*/
                     46:        i_4     reltups;        /*number of tuples in relation  */
                     47:        i_2     relatts;        /*number of attributes in relation      */
                     48:        i_2     relwid;         /*width (in bytes) of relation  */
                     49:        i_4     relprim;        /*no. of primary pages in relation*/
                     50:        i_4     relfree;        /* head of freelist (b-trees only) */
                     51:        i_4     relstamp;       /*time of last mod*/
                     52: };
                     53: 
                     54: 
                     55: /*
                     56: **  Definitions for the range table.
                     57: **
                     58: **     Version:
                     59: **             @(#)range.h     7.1     2/5/81
                     60: */
                     61: 
                     62: 
                     63: 
                     64: /*
                     65: **     DESCRIPTOR struct
                     66: **
                     67: **     The DESCRIPTOR struct is initialized by OPENR to describe any
                     68: **     open relation.  The first part of the descriptor is the tuple
                     69: **     from the RELATION relation.  The remainder contains some magic
                     70: **     numbers and a template initialized from the ATTRIBUTE relation.
                     71: **
                     72: **     This structure also defines the range table.
                     73: */
                     74: 
                     75: struct odescriptor
                     76: {
                     77:        struct orelation        reldum;
                     78:                /*the above part of the descriptor struct is identical
                     79:                  to the relation struct and the inormation in this
                     80:                  part of the struct is read directly from the
                     81:                  relation tuple by openr.  the rest of the descriptor
                     82:                  struct is calculated by openr.  */
                     83:        char    relvname[MAXNAME];      /* range variable name */
                     84:        i_2     relfp;          /*filep for relation , if open  */
                     85:        i_2     relopn;         /*indicates if relation is really open*/
                     86:        tid_type reltid;        /*when relation is open, this indicates
                     87:                                  the tid in the relation relation for
                     88:                                  this relation */
                     89:        i_4     reladds;        /*no. of additions of tuples during this open*/
                     90:        i_2     reloff[MAXDOM]; /*reloff[i] is offset to domain i       */
                     91:        c_1     relfrmt[MAXDOM]; /* format of domain i
                     92:                                 ** INT, FLOAT, or CHAR  */
                     93:        c_1     relfrml[MAXDOM]; /* relfrml[i] is an unsigned integer
                     94:                                  which indicates length
                     95:                                  in bytes of domain */
                     96:        c_1     relxtra[MAXDOM]; /*relxtra[i] is non-zero if domain i is
                     97:                                 ** a key domain for the relation */
                     98:        c_1     relgiven[MAXDOM]; /*cleared by openr and set before
                     99:                                  call to find to indicate value of this
                    100:                                  domain has been supplied in the key*/
                    101: };
                    102: 
                    103: #
                    104: /*
                    105: **  ACCESS.H -- definitions relating to the access methods.
                    106: **
                    107: **     Version:
                    108: **             @(#)access.h    7.1     2/5/81
                    109: */
                    110: 
                    111: 
                    112: /*
                    113: **  ADMIN file struct
                    114: **
                    115: **     The ADMIN struct describes the initial part of the ADMIN file
                    116: **     which exists in each database.  This file is used to initially
                    117: **     create the database, to maintain some information about the
                    118: **     database, and to access the RELATION and ATTRIBUTE relations
                    119: **     on OPENR calls.
                    120: */
                    121: 
                    122: 
                    123: struct oadmin
                    124: {
                    125:        struct adminhdr         adhdr;
                    126:        struct odescriptor      adreld;
                    127:        struct odescriptor      adattd;
                    128: };
                    129: /*
                    130: **  VERSION.H -- system version definition file.
                    131: **
                    132: **     NOTICE:
                    133: **             Version numbers stored in files are SCCS id's
                    134: **             and may not correspond to the external distribution
                    135: **             version number.  The distribution number applies to
                    136: **             the entire system and not to any particular file.
                    137: **             This file defines a "release" number, used for
                    138: **             creating file names.  The entire system version
                    139: **             number (including mod number) is defined by
                    140: **             conf/version.c.
                    141: **
                    142: **     Version:
                    143: **             @(#)version.h   8.1     12/31/84
                    144: */
                    145: 
                    146: 
                    147: /*
                    148: **     VERSION is the version number of this incarnation of INGRES
                    149: **             for purposes of creating file names.
                    150: **     DBVERCODE is the code for this database version stored in
                    151: **             the admin file.
                    152: **     PATHEXT is an extension for the path as derived from the
                    153: **             "ingres" entry in the password file to determine
                    154: **             the "Pathname" variable.  If it is not defined,
                    155: **             no extension is made.
                    156: */
                    157: 
                    158: # define       VERSION         "8"             /* version number */
                    159: # define       DBVERCODE       1               /* database version code */
                    160: /* # define    PATHEXT         "/x"            /* the root path extension */
                    161: extern struct  oadmin  OAdmin;
                    162: struct admin           Admin;
                    163: char                   Ingcode[3];     /* Ingres code of ingres */
                    164: char                   User[3];        /* Ingres code for DBA of this database */
                    165: 
                    166: 
                    167: /*
                    168: ** Ingconv
                    169: **     Convert version 7 databases into version 8 databases.
                    170: **     We assume that there is a $P/bin7 to fake everything with.
                    171: */
                    172: main(argc,argv)
                    173: int    argc;
                    174: char   **argv;
                    175: {
                    176: 
                    177:        struct  passwd  *pwd;
                    178:        int             fd;
                    179:        int             i;
                    180:        int             oldsigint;
                    181:        int             oldsigquit;
                    182:        char            relname[15];
                    183:        char            attname[15];
                    184:        char            orelname[15];
                    185:        char            oattname[15];
                    186:        char            buffer[1000];
                    187:        char            *path;
                    188:        int             sflag = 0;
                    189:        extern  int     errno;
                    190:        extern  int     goodbye();
                    191:        extern  int     (*ExitFn)();
                    192:        extern  char    *getenv();
                    193: 
                    194:        argc--;
                    195:        argv++;
                    196: 
                    197:        ExitFn = goodbye;
                    198: 
                    199:        if ( argc != 1 )
                    200:        {
                    201:                if ( argc == 2 && strcmp(*argv,"-s") == 0 )
                    202:                {
                    203:                                sflag = 1;
                    204:                                argc--;
                    205:                                argv++;
                    206:                }
                    207:                else
                    208:                        syserr("ingconv: wrong number of arguments, useage 'ingconv [-s] database'");
                    209:        }
                    210: 
                    211:        if ( (pwd = getpwnam("ingres")) == 0 )
                    212:                syserr("ingconv: can't find ingres in password file");
                    213: 
                    214:        /*
                    215:        ** Wander into ~ingres/bin7, and then make sure
                    216:        ** that the Ingres we get is the one here. This will
                    217:        ** be a version 7 ingres.
                    218:        */
                    219:        if ( chdir(pwd->pw_dir) == -1 )
                    220:                syserr("can't chdir to %s",pwd->pw_dir);
                    221:        if ( chdir("bin7") == -1 )
                    222:                syserr("can't chdir to bin7");
                    223:        if ( (path = getenv("PATH")) == 0 )
                    224:                syserr("No PATH environment");
                    225:        strcpy(path,":.:");
                    226: 
                    227:        printf("converting database '%s'\n",*argv);
                    228:        /*
                    229:        ** Make new versions of the relation relation, and
                    230:        ** attribute relations. Store these new things as
                    231:        ** "_rtempv8" and "_atempv8".
                    232:        */
                    233:        changerels(*argv);
                    234: 
                    235: 
                    236:        /*
                    237:        ** Now we go into the data/base/database, and do some magic
                    238:        ** disgusting stuff.
                    239:        */
                    240:        if ( chdir(pwd->pw_dir) == -1 )
                    241:                syserr("can't chdir to %s",pwd->pw_dir);
                    242:        if ( chdir("data/base") == -1 )
                    243:                syserr("can't chdir to data/base");
                    244: 
                    245:        errno = 0;
                    246:        if ( chdir(*argv) == -1 )
                    247:        {
                    248:                if ( errno == ENOTDIR )
                    249:                        syserr("can't handle indirect files, change it into a symbolic link first");
                    250:                syserr("no database '%s'",*argv);
                    251:        }
                    252: 
                    253:        bzero(&Admin, sizeof (Admin));
                    254:        bzero(&OAdmin, sizeof (OAdmin));
                    255: 
                    256:        if ( (fd = open("admin",O_RDONLY)) == -1 )
                    257:                syserr("can't open admin file");
                    258: 
                    259:        /*
                    260:        ** Read in the old admin relation, then write out a new
                    261:        ** version into _admin.
                    262:        */
                    263:        startadmin(fd);
                    264:        close(fd);
                    265:        Admin.adhdr = OAdmin.adhdr;
                    266:        descasign(&OAdmin.adreld, &Admin.adreld);
                    267:        descasign(&OAdmin.adattd, &Admin.adattd);
                    268:         Admin.adhdr.adreldsz = Admin.adhdr.adattdsz = sizeof Admin.adreld;
                    269: 
                    270:        if ( (fd = open("_admin",O_WRONLY|O_CREAT,0600)) == -1 )
                    271:                syserr("can't create '_admin' temp file");
                    272:        if ( write(fd,&Admin, sizeof (Admin)) != sizeof (Admin) )
                    273:                syserr("can't write _admin file");
                    274:        close(fd);
                    275: 
                    276: 
                    277: 
                    278:        strcpy(orelname,"relation    ");
                    279:        strcat(orelname,User);
                    280:        strcpy(relname,"_rtempv8    ");
                    281:        strcat(relname,Ingcode);
                    282: 
                    283:        strcpy(oattname,"attribute   ");
                    284:        strcat(oattname,User);
                    285:        strcpy(attname,"_atempv8    ");
                    286:        strcat(attname,Ingcode);
                    287:        /*
                    288:        ** Up to now, we can be interrupted, now we come to the
                    289:        ** magic stuff that might leave us undefended...
                    290:        */
                    291:        oldsigint = (int) signal(SIGINT,SIG_IGN);
                    292:        oldsigquit = (int) signal(SIGQUIT,SIG_IGN);
                    293:        for ( i = 1 ; i < NSIG ; i++ )
                    294:                signal(i,SIG_IGN);
                    295: 
                    296:        if ( rename(attname,oattname) == -1 )
                    297:                syserr("Could not rename '%s' to '%s'",attname, oattname);
                    298:        if ( rename(relname,orelname) == -1 )
                    299:                syserr("Could not rename '%s' to '%s', database is now corrupted!!!!, restore the attribute relation from tape.",relname, orelname);
                    300:        if ( rename("_admin","admin") == -1 )
                    301:                syserr("Could not rename '_admin' to 'admin'. Database is now corrupted, read the attribute and relation relations in from tape.");
                    302: 
                    303:        /*
                    304:        ** Turn the interrupts back on, now that the
                    305:        ** critical section is over.
                    306:        */
                    307:        for ( i = 1 ; i < NSIG ; i++ )
                    308:                signal(i,SIG_DFL);
                    309:        signal(SIGINT,oldsigint);
                    310:        signal(SIGQUIT,oldsigquit);
                    311:        if ( sflag )
                    312:                sprintf(buffer,"%s/bin/sysmod -s %s",pwd->pw_dir,*argv);
                    313:        else
                    314:                sprintf(buffer,"%s/bin/sysmod %s",pwd->pw_dir,*argv);
                    315:        printf("%s\n",buffer);
                    316:        system(buffer);
                    317:        printf("Database '%s' is now a version 8 database.\n",*argv);
                    318: }
                    319: 
                    320: /*
                    321: ** Assign an old descriptor to a new descriptor.
                    322: */
                    323: descasign(a,b)
                    324: struct odescriptor     *a;
                    325: struct descriptor      *b;
                    326: {
                    327:        struct  orelation       *orel;
                    328:        struct  relation        *rel;
                    329: 
                    330:        strcpy(b->relvname,a->relvname);
                    331:        b->relfp = a->relfp;
                    332:        b->relopn = a->relopn;
                    333:        b->reltid = a->reltid;
                    334:        b->reladds = a->reladds;
                    335:        bcopy(a->reloff,b->reloff,(sizeof (i_2)) * MAXDOM);
                    336:        bcopy(a->relfrmt,b->relfrmt,(sizeof (c_1)) * MAXDOM);
                    337:        bcopy(a->relfrml,b->relfrml,(sizeof (c_1)) * MAXDOM);
                    338:        bcopy(a->relxtra,b->relxtra,(sizeof (c_1)) * MAXDOM);
                    339:        bcopy(a->relgiven,b->relgiven,(sizeof (c_1)) * MAXDOM);
                    340: 
                    341:        orel = &a->reldum;
                    342:        rel = &b->reldum;
                    343: 
                    344:        bcopy(orel->relid,rel->relid,MAXNAME);
                    345:        bcopy(orel->relowner,rel->relowner,2);
                    346:        rel->relspec = orel->relspec;
                    347:        rel->relindxd = orel->relindxd;
                    348:        rel->relstat2 = orel->relstat2;
                    349:        rel->relstat = orel->relstat;
                    350:        rel->relsave = orel->relsave;
                    351:        rel->reltups = orel->reltups;
                    352:        rel->relatts = orel->relatts;
                    353:        rel->relwid = orel->relwid;
                    354:        rel->relprim = orel->relprim;
                    355:        rel->relfree = orel->relfree;
                    356:        rel->relstamp = orel->relstamp;
                    357: }
                    358: 
                    359: goodbye()
                    360: {
                    361:        exit(1);
                    362: }
                    363: 
                    364: 
                    365: 
                    366: struct oadmin  OAdmin;
                    367: 
                    368: /*
                    369: **  STARTADMIN -- starts admin file version, etc.
                    370: **
                    371: **     The checks for database version code and whatnot are
                    372: **     factored out into this routine.  When this routine returns,
                    373: **     the admin file should be legible to this program.
                    374: **     If the admin file is not legible, it will syserr.
                    375: **
                    376: **     Parameters:
                    377: **             fd -- open file descriptor for admin file.  Only
                    378: **                     read access is required.
                    379: **
                    380: **     Returns:
                    381: **             nothing if ok.
                    382: **             not at all (or via syserr) if not ok.
                    383: **
                    384: **     Side Effects:
                    385: **             The OAdmin.adhdr struct will be filled in.
                    386: */
                    387: 
                    388: startadmin(fd)
                    389: register int   fd;
                    390: {
                    391:        register int    i;
                    392:        register int    k;
                    393: 
                    394:        i = ((char *) &OAdmin.adhdr.adversion) - ((char *) &OAdmin.adhdr);
                    395:        if (read(fd, (char *) &OAdmin.adhdr, i) != i)
                    396:                syserr("readadmin: admin read err 1");
                    397:        if (!bitset(A_NEWFMT, OAdmin.adhdr.adflags))
                    398:                syserr("readadmin: cannot use old databases");
                    399: 
                    400:        /* read in remainder of admin header */
                    401:        i = sizeof OAdmin.adhdr;
                    402:        if (OAdmin.adhdr.adlength < i)
                    403:                i = OAdmin.adhdr.adlength;
                    404:        i -= ((char *) &OAdmin.adhdr.adversion) - ((char *) &OAdmin.adhdr);
                    405:        if (i <= 0)
                    406:                syserr("readadmin: adlen=%d, hdrsz=%d, ct=%d", OAdmin.adhdr.adlength, sizeof OAdmin.adhdr, i);
                    407:        if ((k = read(fd, (char *) &OAdmin.adhdr.adversion, i)) != i)
                    408:                syserr("readadmin: admin read err 2, i=%d k=%d", i, k);
                    409: 
                    410:        /* check versions here */
                    411:        if (OAdmin.adhdr.adversion != DBVERCODE)
                    412:                syserr("cannot handle code %d databases (current code is %d)",
                    413:                        OAdmin.adhdr.adversion, DBVERCODE);
                    414:        if (OAdmin.adhdr.adreldsz != sizeof OAdmin.adreld)
                    415:                syserr("checkadmin: descriptor size mismatch, dec=%d, actual=%d",
                    416:                        OAdmin.adhdr.adreldsz, sizeof OAdmin.adreld);
                    417: 
                    418:        /* get to beginning of descriptors */
                    419:        if (lseek(fd, (long) OAdmin.adhdr.adlength, 0) < 0)
                    420:                syserr("checkadmin: seek");
                    421: 
                    422:        /* read the descriptors */
                    423:        if (read(fd, (char *) &OAdmin.adreld, OAdmin.adhdr.adreldsz) != OAdmin.adhdr.adreldsz)
                    424:                syserr("checkadmin: reld read sz=%d", OAdmin.adhdr.adreldsz);
                    425:        if (read(fd, (char *) &OAdmin.adattd, OAdmin.adhdr.adattdsz) != OAdmin.adhdr.adattdsz)
                    426:                syserr("checkadmin: attd read sz=%d", OAdmin.adhdr.adattdsz);
                    427: }
                    428: 
                    429: changerels(database)
                    430: ##     char    *database;
                    431: {
                    432: ##     char    *user;
                    433: ##     int     sysmod;
                    434: ##     char    *delname;
                    435:        char    data[3];
                    436:        extern  char    Ingcode[];
                    437:        extern  char    User[];
                    438: 
                    439:        user = data;
                    440:        user[0] = user[1] = user[2] = '\0';
                    441:        sysmod = -1;
                    442:        delname = "delim";
                    443: 
                    444: 
                    445: ##     ingres database "-rheap"
                    446: ##     range of r is relation
                    447: ##     range of a is attribute
                    448: 
                    449: ##     retrieve ( sysmod = r.relspec ) where r.relid = "_rtempv8"
                    450: 
                    451:        if ( sysmod != -1 )
                    452:                syserr("The data base '%s' has a the relation '_rtempv8'. Please remove, or change this relation before using this program");
                    453: 
                    454: ##     retrieve ( sysmod = r.relspec ) where r.relid = "_rtempv8"
                    455: 
                    456:        if ( sysmod != -1 )
                    457:                syserr("The data base '%s' has a the relation '_atempv8'. Please remove, or change this name before using this program");
                    458: 
                    459: ##     create _rtempv8(relid=c12, relowner=c2, relspec=i1, relindxd=i1, 
                    460: ##                     relstat2=i2, relstat=i2, relsave=i4, reltups=i4, 
                    461: ##                     relatts=i2, relwid=i2, relprim=i4, relfree=i4, 
                    462: ##                     relstamp=i4, reldim=i2)
                    463: 
                    464: 
                    465: ##     retrieve ( user = r.relowner ) where r.relid = "relation"
                    466:        User[0] = user[0];
                    467:        User[1] = user[1];
                    468:        User[2] = '\0';
                    469: 
                    470: ##     create rdelim (order=i4, group=c12, delname=c12, type=i4, bitmap=c16)
                    471: ##     modify rdelim to isam on order,group,delname
                    472: 
                    473: ##     retrieve into _rtempv81 (r.all, reldim = 0)
                    474: ##     range of t is _rtempv81
                    475: ##     append _rtempv8 (t.all)
                    476: ##     destroy _rtempv81
                    477: ##     range of t is _rtempv8
                    478: ##     delete t where t.relid = "_rtempv8" or t.relid = "_rtempv81"
                    479: ##     replace t ( relsave = 0, relstat = 275, relspec = 11) where t.relid = "rdelim"
                    480: ##     replace t ( reltups = t.reltups -1, relatts = t.relatts + 1, relwid = t.relwid + 2) where
                    481: ##             t.relid = "relation"
                    482: 
                    483: 
                    484: ##     retrieve into _atempv8 (a.all)
                    485: ##     append _atempv8(attrelid="relation",attowner=user, attid=14, attname="reldim", attoff=44, attfrmt="i", attfrml=2, attxtra=0)
                    486: 
                    487: ##     range of t is _atempv8
                    488: ##     delete t where t.attrelid = "_rtempv8" or t.attrelid = "_rtempv81" or t.attrelid = "_atempv8"
                    489: 
                    490:        sysmod = 0;
                    491: 
                    492: ##     retrieve ( sysmod = r.relspec ) where r.relid = "relation" and r.relowner = user
                    493: 
                    494:        if ( sysmod != 5 )
                    495:        {
                    496: ##             modify _rtempv8 to hash on relid
                    497: ##             modify _atempv8 to hash on attrelid,attowner
                    498:        }
                    499: 
                    500:        user[0] = user[1] = '\0';
                    501: ##     retrieve ( user = r.relowner ) where r.relid = "_atempv8"
                    502: 
                    503:        if ( (Ingcode[0] = user[0]) == '\0' )
                    504:                syserr("can't find my own name");
                    505:        Ingcode[1] = user[1];
                    506:        Ingcode[2] = '\0';
                    507: ##     exit
                    508:        sync();
                    509: }

unix.superglobalmegacorp.com

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