Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static int traverseToLeafNode(const void *key, AttrType attrType, void *data, IXFileHandle &ixFileHandle) {
- int freeSpace = 0;
- int offset = 0, lCompare = 0, nextPagePtr = 0;
- void *temp = (char*)malloc(PAGE_SIZE);
- int ret = -1;
- memcpy(temp, data, PAGE_SIZE);
- while(getNodeFlag(temp) == IX_NON_LEAF_FLAG){
- freeSpace = getFreeSpace(temp);
- offset = IX_NON_LEAF_PTR_SIZE;
- int found = 0;
- while(offset < IX_DEF_FS_NON_LEAF - freeSpace){
- switch(attrType) {
- case TypeInt:
- if(memcmp(key, (char*)data + offset, sizeof(int)) < 0) {
- memcpy(&nextPagePtr, (char*)temp + offset - IX_NON_LEAF_PTR_SIZE, IX_NON_LEAF_PTR_SIZE);
- found = 1;
- break;
- }
- offset += sizeof(int) + IX_NON_LEAF_PTR_SIZE;
- break;
- case TypeReal:
- if(memcmp(key, (char*)data + offset, sizeof(float)) < 0) {
- memcpy(&nextPagePtr, (char*)temp + offset - IX_NON_LEAF_PTR_SIZE, IX_NON_LEAF_PTR_SIZE);
- found = 1;
- break;
- }
- offset += sizeof(float) + IX_NON_LEAF_PTR_SIZE;
- break;
- case TypeVarChar:
- memcpy(&lCompare, (char*)temp + offset, sizeof(short));
- if(compareVarCharKeyData(key, temp, offset) < 0){
- memcpy(&nextPagePtr, (char*)temp + offset - IX_NON_LEAF_PTR_SIZE, IX_NON_LEAF_PTR_SIZE);
- found = 1;
- break;
- }
- offset += sizeof(short) + lCompare + IX_NON_LEAF_PTR_SIZE;
- break;
- default:
- break;
- }
- }
- if(found == 0){
- memcpy(&nextPagePtr, (char*)temp + offset - IX_NON_LEAF_PTR_SIZE, IX_NON_LEAF_PTR_SIZE);
- }
- ret = ixFileHandle.ixReadPage(nextPagePtr, temp);
- if(ret == -1) { return -1; }
- }
- free(temp);
- return nextPagePtr;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement