Advertisement
Guest User

create

a guest
Jan 20th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.95 KB | None | 0 0
  1. int SHT_CreateSecondaryIndex(char *sfileName, char *attrName, int attrLength, int buckets, char *fileName){
  2.    
  3.     int result;
  4.     int fileDesc;
  5.     int blockID;
  6.     void* block;
  7.     int i,j = 0;
  8.     SecondaryBlock sblock;
  9.  
  10.  
  11.     if (BF_CreateFile(sfileName) < 0) {BF_PrintError("Error creating file");exit(EXIT_FAILURE);}
  12.  
  13.     if ((fileDesc = BF_OpenFile(sfileName)) < 0) {BF_PrintError("Error opening file");return -1;}
  14.  
  15.     SHT_info sht_info;
  16.     sht_info.fileDesc = fileDesc;
  17.     sht_info.attrLength = attrLength;
  18.     sht_info.numBuckets = buckets;
  19.     sht_info.attrName = malloc(attrLength*sizeof(char));
  20.     strcpy(sht_info.attrName, attrName);
  21.     sht_info.fileNameLength = (strlen(fileName)+1);
  22.     sht_info.fileName = malloc(sht_info.fileNameLength*sizeof(char));
  23.     strcpy(sht_info.fileName, fileName);
  24.  
  25.     for(i = 0; i < buckets; ++i)
  26.     {
  27.         if (BF_AllocateBlock(fileDesc) < 0) {BF_PrintError("Error allocating block");return -1;}
  28.         if (BF_ReadBlock(fileDesc, i , &block) < 0) {BF_PrintError("Error getting block");return -1;}
  29.         if (i == 0) {
  30.             for(j=0; j<MAX_BUCKETS; j++) {
  31.                 sht_info.buckets[j] = j+1;
  32.                 secondaryHashTable[j] = j+1;
  33.             }
  34.             memcpy(block,&sht_info,sizeof(sht_info));
  35.             memcpy(block+sizeof(sht_info),sht_info.attrName,sizeof(char)*attrLength);
  36.             if (BF_WriteBlock(fileDesc, 0) < 0){BF_PrintError("Error writing block back");return -1;}
  37.         }
  38.         else {
  39.             sblock.recordsCounter = 0;
  40.             sblock.nextBlock = -1;
  41.             for(j=0; j<MAX_RECORDS; j++) {
  42.                 sblock.bit_array[j] = 0;
  43.             }
  44.             memcpy(block,&sblock,sizeof(Block));
  45.             if (BF_WriteBlock(fileDesc, i) < 0){BF_PrintError("Error writing block back");return -1;}
  46.         }
  47.         if (BF_WriteBlock(fileDesc, i) < 0){BF_PrintError("Error writing block back");return -1;}
  48.        
  49.     }
  50.    
  51.     int key;
  52.     Block p_block;
  53.     for(i = 0; i < MAX_BUCKETS; ++i)
  54.     {
  55.         key = primaryHashTable[i];
  56.         while(1)
  57.         {
  58.             if(BF_ReadBlock(primary_fileDesc, key, &block)){BF_PrintError("Error getting block");return -1;}
  59.             p_block = *(Block *)block;
  60.             for(j = 0; j < P_MAX_RECORDS; ++j)
  61.             {
  62.                 if(p_block.bit_array[j] != 0)
  63.                 {
  64.                     result = findrecord(p_block.records[j].id, "SHT", fileDesc);
  65.                     if(result < 0)
  66.                     {
  67.                         SecondaryRecord sr;
  68.                         sr.blockId = key;
  69.                         sr.record.id = p_block.records[j].id;
  70.                        
  71.                         if(strcmp(sht_info.attrName,"name") == 0)
  72.                             strcpy(sr.record.name, p_block.records[j].name);
  73.                         else if(strcmp(sht_info.attrName,"surname") == 0)
  74.                             strcpy(sr.record.surname, p_block.records[j].surname);
  75.                         else if(strcmp(sht_info.attrName,"address") == 0)
  76.                             strcpy(sr.record.address, p_block.records[j].address);
  77.                        
  78.                         result = SHT_SecondaryInsertEntry(sht_info, sr);
  79.                     }
  80.                 }
  81.             }
  82.  
  83.             if(p_block.next_block != -1)
  84.                 key = p_block.next_block;
  85.             else
  86.                 break;
  87.         }
  88.     }
  89.  
  90.     if (BF_CloseFile(fileDesc) < 0) {BF_PrintError("Error closing file");return -1;}
  91.     free(sht_info.attrName);
  92.     free(sht_info.fileName);
  93.     return 0;
  94. }
  95.  
  96. int findrecord(int id, char *type, int fileDesc)
  97. {
  98.     int result;
  99.     void *block;
  100.     int i = 0;
  101.    
  102.     int key = hash_integer(id, MAX_BUCKETS);
  103.     if(strcmp(type, "PHT") == 0)
  104.     {
  105.         Block *p_block;
  106.         key = primaryHashTable[key];
  107.         while(1)
  108.         {
  109.             if(BF_ReadBlock(fileDesc, key, &block)<0){BF_PrintError("Error getting block");return -1;}
  110.             p_block = (Block *)block;      
  111.             for(i = 0; i < P_MAX_RECORDS; ++i)
  112.             {
  113.                 if(p_block->bit_array[i] == 1)
  114.                 {
  115.                     if(p_block->records[i].id == id)
  116.                         return key;
  117.                 }
  118.             }
  119.             if(p_block->next_block != -1)
  120.                 key = p_block->next_block;
  121.             else
  122.                 return -1;
  123.         }
  124.     }
  125.     else if(strcmp(type, "SHT") == 0)
  126.     {
  127.         SecondaryBlock *sec_block;
  128.  
  129.         key = secondaryHashTable[key];
  130.         while(1)
  131.         {
  132.             if(BF_ReadBlock(fileDesc, key, &block)){BF_PrintError("Error getting block");return -1;}
  133.             sec_block = (SecondaryBlock *)block;        
  134.             for( i = 0; i < S_MAX_RECORDS; ++i)
  135.             {
  136.                 if(sec_block->bit_array[i] == 1)
  137.                 {
  138.                     if(sec_block->records[i].recordID == id)
  139.                         return key;
  140.                 }
  141.             }
  142.             if(sec_block->nextBlock == -1)
  143.                 return -1;
  144.             else
  145.                 key = sec_block->nextBlock;
  146.         }
  147.     }
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement