Annotation of 43BSD/ingres/source/dbu/seq_atts.c, revision 1.1

1.1     ! root        1: # include      <ingres.h>
        !             2: # include      <access.h>
        !             3: # include      <sccs.h>
        !             4: 
        !             5: SCCSID(@(#)seq_atts.c  8.1     12/31/84)
        !             6: 
        !             7: /*
        !             8: ** Seq_attributes - get all attributes of a relation in their correct order.
        !             9: **
        !            10: **     Seq_attributes() can be called when it is desired to get all
        !            11: **     attribute tuples for a relation. They are guaranteed to be in
        !            12: **     the same order as they were created in; that is "attid" order.
        !            13: **
        !            14: **     The calling convention is:
        !            15: **
        !            16: **             seq_init(Attribute_descriptor, Descriptor_for_relation)
        !            17: **
        !            18: **             while (seq_attribute(Att_desc, Des_for_rel, Tuple)
        !            19: **             {
        !            20: **             }
        !            21: **
        !            22: **     The first parameter is an OPEN descriptor for the attribute
        !            23: **     relation. The second parameter is a descriptor for the relation.
        !            24: **     It must have the relation-relation tuple (ie openr mode -1).
        !            25: **     The third parameter is a place to put the attribute. Its
        !            26: **     dimension must be at least sizeof (attribute structure).
        !            27: **
        !            28: **     Seq_attribute attempts to optimize the retrieval of the
        !            29: **     attributes. It assumes initially that the are physically
        !            30: **     stored sequentially. If so it will retrieve them in the
        !            31: **     minimum possible number of accesses.
        !            32: **
        !            33: **     If it finds one tuple out of sequence then all future
        !            34: **     scans will start from that first out of sequence tuple.
        !            35: */
        !            36: 
        !            37: struct tup_id  Seq_tdl, Seq_tdh, Seq_tdf;
        !            38: int            Seq_seqmode, Seq_next;
        !            39: 
        !            40: 
        !            41: 
        !            42: seq_init(a, r)
        !            43: register DESC  *a;
        !            44: register DESC  *r;
        !            45: {
        !            46:        register int            i;
        !            47:        struct attribute        attkey;
        !            48: 
        !            49:        clearkeys(a);
        !            50:        setkey(a, &attkey, r->reldum.relid, ATTRELID);
        !            51:        setkey(a, &attkey, r->reldum.relowner, ATTOWNER);
        !            52:        if (i = find(a, EXACTKEY, &Seq_tdl, &Seq_tdh, &attkey))
        !            53:                syserr("seq_init:find:%d", i);
        !            54: 
        !            55:        Seq_seqmode = TRUE;
        !            56:        Seq_next = 1;
        !            57: }
        !            58: 
        !            59: 
        !            60: seq_attributes(a, r, atup)
        !            61: register DESC                  *a;
        !            62: register DESC                  *r;
        !            63: register struct attribute      *atup;
        !            64: {
        !            65:        int     i, nxttup;
        !            66: 
        !            67:        if (Seq_next > r->reldum.relatts)
        !            68:                return (0);     /* no more attributes */
        !            69: 
        !            70:        if (!Seq_seqmode)
        !            71:        {
        !            72:                /* attributes not stored sequencially, start from first attribute */
        !            73:                bmove(&Seq_tdf, &Seq_tdl, sizeof (Seq_tdl));
        !            74:                nxttup = FALSE;
        !            75:        }
        !            76:        else
        !            77:                nxttup = TRUE;
        !            78: 
        !            79:        while ((i = get(a, &Seq_tdl, &Seq_tdh, atup, nxttup)) == 0)
        !            80:        {
        !            81: 
        !            82:                nxttup = TRUE;
        !            83:                /* make sure this is a tuple for the right relation */
        !            84:                if (kcompare(a, atup, r))
        !            85:                        continue;
        !            86: 
        !            87:                /* is this the attribute we want? */
        !            88:                if (atup->attid != Seq_next)
        !            89:                {
        !            90:                        if (Seq_seqmode)
        !            91:                        {
        !            92:                                /*
        !            93:                                ** Turn off seq mode. Save the tid of
        !            94:                                ** the current tuple. It will be the
        !            95:                                ** starting point for the next call
        !            96:                                ** to seq_attribute
        !            97:                                */
        !            98:                                bmove(&Seq_tdl, &Seq_tdf, sizeof (Seq_tdf));
        !            99:                                Seq_seqmode = FALSE;
        !           100:                        }
        !           101: 
        !           102:                        continue;
        !           103:                }
        !           104: 
        !           105:                /* got current attribute. increment to next attribute */
        !           106:                Seq_next++;
        !           107:                return (1);
        !           108:        }
        !           109: 
        !           110:        /* fell out of loop. either bad get return or missing attribute */
        !           111:        syserr("seq_att:bad or missing %d,%d", i, Seq_next);
        !           112: }

unix.superglobalmegacorp.com

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