POSTINGSPTR treesearch_page_buildLL(int PageNo, char *key, struct node *root) { // ROOT, word
    POSTINGSPTR  result;
    struct PageHdr *PagePtr = FetchPage(PageNo);
    if (PagePtr != NULL) {
        root = (struct node *) malloc(sizeof(struct node *));
        root->value = PagePtr->PgNum;
        root->next = head;
        head = root;
    }
    if (IsLeaf(PagePtr)) { /* found leaf */
        result = PageNo;
        head = root;
    } else if ((IsNonLeaf(PagePtr)) && (PagePtr->NumKeys == 0)) {
        /* keys, if any, will be stored in Page# 2
           THESE PIECE OF CODE SHOULD GO soon! **/
        result = treesearch_page_buildLL(FIRSTLEAFPG, key, root);
    } else if ((IsNonLeaf(PagePtr)) && (PagePtr->NumKeys > 0)) {
        PAGENO ChildPage = FindPageNumOfChild(PagePtr, PagePtr->KeyListPtr, key,
                PagePtr->NumKeys);
        result = treesearch_page_buildLL(ChildPage, key, root);
    } else {
        assert(0 && "this should never happen");
    }
    FreePage(PagePtr);
    return result;
}
Example #2
0
PrintTreeInOrder(PAGENO pgNum, int level) {
    struct PageHdr *p;
    struct KeyRecord *k;
    struct PageHdr   *FetchPage();   // add this line to avoid seg-fault
    int i;

     p = (struct PageHdr * ) FetchPage(pgNum);

    if(IsNonLeaf(p)) {
        for(k=p->KeyListPtr; k != NULL; k = k->Next) {
            PrintTreeInOrder(k->PgNum,level+1);
            for(i=0; i < level*15; i++) {
                printf(" ");
            }
            printf("%s \n",k->StoredKey);
        }
        PrintTreeInOrder(p->PtrToFinalRtgPg,level+1);
    } else {
        int count=0;
        for(k=p->KeyListPtr; k != NULL; k = k->Next) {
            count++;
            if(k == p->KeyListPtr) {
                for(i=0; i < level*15; i++) {
                    printf(" ");
                }
                printf("%s ",k->StoredKey);
            } else
                if(k->Next == NULL) {
                    printf("... %s ",k->StoredKey);
                }
        }
        printf("(%d) \n",count);
    }
}
/**
* recursive call to find the page in which the key should reside
* and return the page number (guaranteed to be a leaf page).
*/
PAGENO treesearch_page(PAGENO PageNo, char *key) { // ROOT, word
    PAGENO result;
    struct PageHdr *PagePtr = FetchPage(PageNo);
    /*if (PagePtr != NULL) {
        printf("\ntree search - pgnum:%ld", PagePtr->PgNum);
    }*/
    if (IsLeaf(PagePtr)) { /* found leaf */
        result = PageNo;
    } else if ((IsNonLeaf(PagePtr)) && (PagePtr->NumKeys == 0)) {
        /* keys, if any, will be stored in Page# 2
           THESE PIECE OF CODE SHOULD GO soon! **/
        result = treesearch_page(FIRSTLEAFPG, key);
    } else if ((IsNonLeaf(PagePtr)) && (PagePtr->NumKeys > 0)) {
        PAGENO ChildPage = FindPageNumOfChild(PagePtr, PagePtr->KeyListPtr, key,
                PagePtr->NumKeys);
        result = treesearch_page(ChildPage, key);
    } else {
        assert(0 && "this should never happen");
    }
    FreePage(PagePtr);
    return result;
}
struct PageHdr *FetchPage(PAGENO Page)
/* Page number of page to be fetched */
{
    struct PageHdr *PagePtr;
    struct KeyRecord *KeyNode,
        *KeyListTraverser; /* To traverse the list of keys */

    int i;
    fetchPageCount++;
    PAGENO FindNumPagesInTree(void);

    /* check validity of "Page" */
    if ((Page < 1) || (Page > FindNumPagesInTree())) {
        printf("FetchPage: Pagenum %d out of range (%d,%d)\n", (int) Page,
               (int) ROOT, (int) FindNumPagesInTree());
        /*	exit(-1); */
    }

    /* Read in the page header */
    PagePtr = (struct PageHdr *) malloc(sizeof(*PagePtr));
    ck_malloc(PagePtr, "PagePtr");
    fseek(fpbtree, (long) Page * PAGESIZE - PAGESIZE, 0);

    fread(&PagePtr->PgTypeID, sizeof(char), 1, fpbtree);
    fread(&PagePtr->PgNum, sizeof(PagePtr->PgNum), 1, fpbtree);
    if ((PagePtr->PgNum) != Page) {
        printf("FetchPage: corrupted Page %d\n", (int) Page);
        exit(-1);
    }

    if (IsLeaf(PagePtr))
        fread(&PagePtr->PgNumOfNxtLfPg, sizeof(PagePtr->PgNumOfNxtLfPg), 1,
              fpbtree);
    fread(&PagePtr->NumBytes, sizeof(PagePtr->NumBytes), 1, fpbtree);
    fread(&PagePtr->NumKeys, sizeof(PagePtr->NumKeys), 1, fpbtree);
    PagePtr->KeyListPtr = NULL;
    if (IsNonLeaf(PagePtr))
        fread(&PagePtr->PtrToFinalRtgPg, sizeof(PagePtr->PtrToFinalRtgPg), 1,
              fpbtree);

    /* Read in the keys */
    KeyListTraverser = NULL;
    for (i = 0; i < PagePtr->NumKeys; i++) {
        KeyNode = (struct KeyRecord *) malloc(sizeof(*KeyNode));
        ck_malloc(KeyNode, "KeyNode");
        if (IsNonLeaf(PagePtr))
            fread(&KeyNode->PgNum, sizeof(KeyNode->PgNum), 1, fpbtree);
        fread(&KeyNode->KeyLen, sizeof(KeyNode->KeyLen), 1, fpbtree);
        KeyNode->StoredKey = (char *) malloc((KeyNode->KeyLen) + 1);
        ck_malloc(KeyNode->StoredKey, "KeyNode->StoredKey in FetchPage()");
        fread(KeyNode->StoredKey, sizeof(char), KeyNode->KeyLen, fpbtree);
        (*(KeyNode->StoredKey + KeyNode->KeyLen)) =
            '\0'; /* string terminator */
        if (IsLeaf(PagePtr))
            fread(&KeyNode->Posting, sizeof(KeyNode->Posting), 1, fpbtree);
        if (KeyListTraverser == NULL) {
            KeyListTraverser = KeyNode;
            PagePtr->KeyListPtr = KeyNode;
        } else {
            KeyListTraverser->Next = KeyNode;
            KeyListTraverser = KeyListTraverser->Next;
        }
    }
    if (PagePtr->NumKeys != 0)
        KeyListTraverser->Next = NULL;

    return (PagePtr);
}