コード例 #1
0
    def main(cls, args):
        # db = SimpleDB("tabletest", 400, 8)
        fm = FileMgr(File("tabletest"), 400)
        lm = LogMgr(fm, "simpledb.log")
        bm = BufferMgr(fm, lm, 8)
        tx = Transaction(fm, lm, bm)

        sch = Schema()
        sch.addIntField("A")
        sch.addStringField("B", 9)
        layout = Layout(sch)
        for fldname in layout.schema().fields():
            offset = layout.offset(fldname)
            print(fldname + " has offset " + str(offset))

        print("Filling the table with 50 random records.")
        ts = TableScan(tx, "T", layout)
        for i in range(50):
            ts.insert()
            n = random.randint(0, 50)
            ts.setInt("A", n)
            ts.setString("B", "rec" + str(n))
            print("inserting into slot " + ts.getRid().__str__() + ": {" +
                  str(n) + ", " + "rec" + str(n) + "}")

        print("Deleting these records, whose A-values are less than 25.")
        count = 0
        ts.beforeFirst()
        while ts.next():
            a = ts.getInt("A")
            b = ts.getString("B")
            if a < 25:
                count += 1
                print("slot " + ts.getRid().__str__() + ": {" + str(a) + ", " +
                      b + "}")
                ts.delete()
        print(str(count) + " values under 10 were deleted.\n")

        print("Here are the remaining records.")
        ts.beforeFirst()
        while ts.next():
            a = ts.getInt("A")
            b = ts.getString("B")
            print("slot " + ts.getRid().__str__() + ": {" + str(a) + ", " + b +
                  "}")
        ts.close()
        tx.commit()
コード例 #2
0
class HashIndex(Index):
    NUM_BUCKETS = 100

    #
    #    * Opens a hash index for the specified index.
    #    * @param idxname the name of the index
    #    * @param sch the schema of the index records
    #    * @param tx the calling transaction
    #
    def __init__(self, tx, idxname, layout):
        super(HashIndex, self).__init__()
        self.tx = tx
        self.idxname = idxname
        self.layout = layout

    #
    #    * Positions the index before the first index record
    #    * having the specified search key.
    #    * The method hashes the search key to determine the bucket,
    #    * and then opens a table scan on the file
    #    * corresponding to the bucket.
    #    * The table scan for the previous bucket (if any) is closed.
    #    * @see simpledb.index.Index#beforeFirst(simpledb.query.Constant)
    #
    def beforeFirst(self, searchkey):
        self.close()
        self.searchkey = searchkey
        bucket = searchkey.__hash__() % HashIndex.NUM_BUCKETS
        tblname = self.idxname + bucket
        self.ts = TableScan(self.tx, tblname, self.layout)

    #
    #    * Moves to the next record having the search key.
    #    * The method loops through the table scan for the bucket,
    #    * looking for a matching record, and returning false
    #    * if there are no more such records.
    #    * @see simpledb.index.Index#next()
    #
    def next(self):
        while self.ts.next():
            if self.ts.getVal("dataval") == self.searchkey:
                return True
        return False

    #
    #    * Retrieves the dataRID from the current record
    #    * in the table scan for the bucket.
    #    * @see simpledb.index.Index#getDataRid()
    #
    def getDataRid(self):
        blknum = self.ts.getInt("block")
        _id = self.ts.getInt("id")
        return RID(blknum, _id)

    #
    #    * Inserts a new record into the table scan for the bucket.
    #    * @see simpledb.index.Index#insert(simpledb.query.Constant, simpledb.record.RID)
    #
    def insert(self, val, rid):
        self.beforeFirst(val)
        self.ts.insert()
        self.ts.setInt("block", rid.blockNumber())
        self.ts.setInt("id", rid.slot())
        self.ts.setVal("dataval", val)

    #
    #    * Deletes the specified record from the table scan for
    #    * the bucket.  The method starts at the beginning of the
    #    * scan, and loops through the records until the
    #    * specified record is found.
    #    * @see simpledb.index.Index#delete(simpledb.query.Constant, simpledb.record.RID)
    #
    def delete(self, val, rid):
        self.beforeFirst(val)
        while self.next():
            if self.getDataRid() == rid:
                self.ts.delete()
                return

    #
    #    * Closes the index by closing the current table scan.
    #    * @see simpledb.index.Index#close()
    #
    def close(self):
        if self.ts is not None:
            self.ts.close()

    #
    #    * Returns the cost of searching an index file having the
    #    * specified number of blocks.
    #    * The method assumes that all buckets are about the
    #    * same size, and so the cost is simply the size of
    #    * the bucket.
    #    * @param numblocks the number of blocks of index records
    #    * @param rpb the number of records per block (not used here)
    #    * @return the cost of traversing the index
    #
    @staticmethod
    def searchCost(numblocks, rpb):
        return numblocks / HashIndex.NUM_BUCKETS