Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int SHT_CreateSecondaryIndex(char *sfileName, char *attrName, int attrLength, int buckets, char *fileName){
- int result;
- int fileDesc;
- int blockID;
- void* block;
- int i,j = 0;
- SecondaryBlock sblock;
- if (BF_CreateFile(sfileName) < 0) {BF_PrintError("Error creating file");exit(EXIT_FAILURE);}
- if ((fileDesc = BF_OpenFile(sfileName)) < 0) {BF_PrintError("Error opening file");return -1;}
- SHT_info sht_info;
- sht_info.fileDesc = fileDesc;
- sht_info.attrLength = attrLength;
- sht_info.numBuckets = buckets;
- sht_info.attrName = malloc(attrLength*sizeof(char));
- strcpy(sht_info.attrName, attrName);
- sht_info.fileNameLength = (strlen(fileName)+1);
- sht_info.fileName = malloc(sht_info.fileNameLength*sizeof(char));
- strcpy(sht_info.fileName, fileName);
- for(i = 0; i < buckets; ++i)
- {
- if (BF_AllocateBlock(fileDesc) < 0) {BF_PrintError("Error allocating block");return -1;}
- if (BF_ReadBlock(fileDesc, i , &block) < 0) {BF_PrintError("Error getting block");return -1;}
- if (i == 0) {
- for(j=0; j<MAX_BUCKETS; j++) {
- sht_info.buckets[j] = j+1;
- secondaryHashTable[j] = j+1;
- }
- memcpy(block,&sht_info,sizeof(sht_info));
- memcpy(block+sizeof(sht_info),sht_info.attrName,sizeof(char)*attrLength);
- if (BF_WriteBlock(fileDesc, 0) < 0){BF_PrintError("Error writing block back");return -1;}
- }
- else {
- sblock.recordsCounter = 0;
- sblock.nextBlock = -1;
- for(j=0; j<MAX_RECORDS; j++) {
- sblock.bit_array[j] = 0;
- }
- memcpy(block,&sblock,sizeof(Block));
- if (BF_WriteBlock(fileDesc, i) < 0){BF_PrintError("Error writing block back");return -1;}
- }
- if (BF_WriteBlock(fileDesc, i) < 0){BF_PrintError("Error writing block back");return -1;}
- }
- int key;
- Block p_block;
- for(i = 0; i < MAX_BUCKETS; ++i)
- {
- key = primaryHashTable[i];
- while(1)
- {
- if(BF_ReadBlock(primary_fileDesc, key, &block)){BF_PrintError("Error getting block");return -1;}
- p_block = *(Block *)block;
- for(j = 0; j < P_MAX_RECORDS; ++j)
- {
- if(p_block.bit_array[j] != 0)
- {
- result = findrecord(p_block.records[j].id, "SHT", fileDesc);
- if(result < 0)
- {
- SecondaryRecord sr;
- sr.blockId = key;
- sr.record.id = p_block.records[j].id;
- if(strcmp(sht_info.attrName,"name") == 0)
- strcpy(sr.record.name, p_block.records[j].name);
- else if(strcmp(sht_info.attrName,"surname") == 0)
- strcpy(sr.record.surname, p_block.records[j].surname);
- else if(strcmp(sht_info.attrName,"address") == 0)
- strcpy(sr.record.address, p_block.records[j].address);
- result = SHT_SecondaryInsertEntry(sht_info, sr);
- }
- }
- }
- if(p_block.next_block != -1)
- key = p_block.next_block;
- else
- break;
- }
- }
- if (BF_CloseFile(fileDesc) < 0) {BF_PrintError("Error closing file");return -1;}
- free(sht_info.attrName);
- free(sht_info.fileName);
- return 0;
- }
- int findrecord(int id, char *type, int fileDesc)
- {
- int result;
- void *block;
- int i = 0;
- int key = hash_integer(id, MAX_BUCKETS);
- if(strcmp(type, "PHT") == 0)
- {
- Block *p_block;
- key = primaryHashTable[key];
- while(1)
- {
- if(BF_ReadBlock(fileDesc, key, &block)<0){BF_PrintError("Error getting block");return -1;}
- p_block = (Block *)block;
- for(i = 0; i < P_MAX_RECORDS; ++i)
- {
- if(p_block->bit_array[i] == 1)
- {
- if(p_block->records[i].id == id)
- return key;
- }
- }
- if(p_block->next_block != -1)
- key = p_block->next_block;
- else
- return -1;
- }
- }
- else if(strcmp(type, "SHT") == 0)
- {
- SecondaryBlock *sec_block;
- key = secondaryHashTable[key];
- while(1)
- {
- if(BF_ReadBlock(fileDesc, key, &block)){BF_PrintError("Error getting block");return -1;}
- sec_block = (SecondaryBlock *)block;
- for( i = 0; i < S_MAX_RECORDS; ++i)
- {
- if(sec_block->bit_array[i] == 1)
- {
- if(sec_block->records[i].recordID == id)
- return key;
- }
- }
- if(sec_block->nextBlock == -1)
- return -1;
- else
- key = sec_block->nextBlock;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement