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; }
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); }