int RMM_InsertRec(int fileDesc, char *record, int recordSize) { int blockNum, ret, max_records, recordNum; char *blockBuf, *HF_HeadBuf; if ((HF_HeadBuf = malloc(BF_BLOCK_SIZE)) == NULL ) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } if ((blockBuf = malloc(BF_BLOCK_SIZE)) == NULL ) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } if(BF_GetThisBlock(fileDesc, 0, &HF_HeadBuf) != BFE_OK) //-> Fernei to HF_HEADER stin mnimi. return (HF_errno = HFE_BFERROR); // if ((blockNum = getFirstZeroBitPos(HF_HeadBuf,BF_BLOCK_SIZE)) == -1) //-> Psaxnei to HF_HEADER gia to 1o mi mideniko. Ean ola return (HF_errno = HFE_EOF); // einai 1 epistrefei 'EOF'. I epistrefomeni timi '0' blockNum ++; // anaferetai sto 1o block. if ((ret = BF_GetThisBlock(fileDesc, blockNum, &blockBuf)) == BFE_INVALIDBLOCK) { //-> Epixeirei na ferei sti mnimi to block sto if (BF_AllocBlock(fileDesc, &blockNum, &blockBuf) != BFE_OK) // opoio tha eisagagei tin eggrafi. Ean itan return (HF_errno = HFE_BFERROR); // mi eguro block, to dimiourgei kanontas alloc. } // else if (ret != BFE_OK ) return (HF_errno = HFE_BFERROR); max_records = BF_BLOCK_SIZE*8 / (recordSize*8 + 1); //-> Ypologizei to megisto plithos eggrafwn pou xwraei // to kathe block. for(recordNum=0 ; recordNum < max_records ; recordNum++) //-> Psaxnei sto anestrammeno bitmap tou block gia na if (!isBitActive(blockBuf, BF_BLOCK_SIZE*8-1 -recordNum)) // vrei tin prwti adeia thesi eggrafis sto block, break; // i opoia kai einai i 'recordNum'. Sigoura tha vrei // mia adeia thesi eggrafis, mias kai to block epilexthike // ef'oson den itan plirws gemato apo eggrafes. // memcpy(blockBuf + recordSize*recordNum, record, recordSize); //-> Adigrafei tin eggrafi sto block, stin thesi // 'recordNum'. setBit(blockBuf, BF_BLOCK_SIZE*8-1 -recordNum); //-> Enimerwnei to bitmap tou block gia to gemisma tis // eggrafis. if ((ret = FullOrEmpty(blockBuf, max_records, BF_BLOCK_SIZE, 1))) //-> Ean to block gemise me eggrafes, tote enimerwnei setBit(HF_HeadBuf, blockNum-1); // to HF_HEADER gia to pleon plirws gemato block. // Ean to to block einai gemato i 'ret' exei timi '1' // alliws '0'. if (BF_UnpinBlock(fileDesc, blockNum, 1) != BFE_OK) //-> Kanei unpin to block pou eisigage tin eggrafi me return (HF_errno = HFE_BFERROR); // dirty=1. if (BF_UnpinBlock(fileDesc, 0, ret) != BFE_OK) //-> Kanei unpin to HF_HEADER me dirty iso me tin timi return (HF_errno = HFE_BFERROR); // tis 'ret' pou epistrafike parapanw. return ((blockNum-1)*max_records + recordNum); }
int RMM_DeleteRec(int fileDesc, int recId, int recordSize) { int full, max_records, blockNum, recordNum; char *HF_HeadBuf, *blockBuf; if (( HF_HeadBuf = malloc(BF_BLOCK_SIZE)) == NULL ) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } if (( blockBuf = malloc ( BF_BLOCK_SIZE )) == NULL ) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } if(BF_GetThisBlock(fileDesc, 0, &HF_HeadBuf) != BFE_OK) //-> Fernei to HF_HEADER sti mnimi. return (HF_errno = HFE_BFERROR); // max_records = BF_BLOCK_SIZE*8 / (recordSize*8 + 1); //-> Ypologizei to megisto plithos eggrafwn pou // xwraei to kathe block. blockNum = recId/max_records + 1; //-> Vriskei poio einai to block sto opoio vrisketai // i eggrafi pou zitithike na diagrapsei. if(BF_GetThisBlock(fileDesc, blockNum, &blockBuf) != BFE_OK) //-> Fernei stin mnimi to block sto opoio vrisketai return (HF_errno = HFE_BFERROR); // i eggrafi pou zitithike na diagrapsei. recordNum = recId % max_records; //-> Vriskei ti thesi tis eggrafis mesa sto block. if(!isBitActive(blockBuf, BF_BLOCK_SIZE*8-1 -recordNum)) //-> Elegxei ean i eggrafi pou zitithike na diagrafei { if (BF_UnpinBlock(fileDesc, blockNum, 0) != BFE_OK) // ontws uparxei mesa sto block. return (HF_errno = HFE_BFERROR); return (HF_errno = HFE_INVALIDREC); } resetBit(blockBuf, BF_BLOCK_SIZE*8-1 -recordNum); //-> "Diagrafei" ti zitoumeni eggrafi sto block, // midenizontas tin thesi tis sto bitmap tou block. if(( full = isBitActive(HF_HeadBuf, blockNum-1 ))) //-> Elegxei to HF_HEADER gia na dei ean to block prin resetBit(HF_HeadBuf, blockNum-1); // tin diagrafi tis eggrafis, itan plirws gemato. // Ean nai, enimerwnei to HF_HEADER gia tin nea // katastasi tou block. if(BF_UnpinBlock(fileDesc, blockNum, 1) != BFE_OK) //-> Kanei unpin to block. return (HF_errno = HFE_BFERROR); // if(FullOrEmpty(blockBuf, max_records, BF_BLOCK_SIZE, 0)) //-> Elegxei, ean meta apo tin diagrafi tis eggrafis if(BF_DisposeBlock(fileDesc, blockNum) != BFE_OK) // pou molis egine, to block den periexei kammia return (HF_errno = HFE_BFERROR); // eggrafi. Ean nai, kanei dispose to adeio block. if(BF_UnpinBlock(fileDesc, 0, full) != BFE_OK) //-> Kanei unpin to HF_HEADER me dirty iso me 'full', return (HF_errno = HFE_BFERROR); // i opoia exei timi '0' i '1' analoga me to ean // to block itan prin diagrafei oxi plirws gemato // i plirws gemato, antistoixa. return HFE_OK; }
int RMM_GetThisRec(int fileDesc, int recId, char *record, int recordSize) { int max_records, blockNum, recordNum; char *blockBuf; if (( blockBuf = malloc(BF_BLOCK_SIZE)) == NULL) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } max_records = (BF_BLOCK_SIZE*8) / (recordSize*8 + 1); //-> Ypologizei to megisto plithos eggrafwn // pou xwraei to kathe block. blockNum = recId / max_records + 1; //-> Vriskei poio einai to block sto opio vrisketai // i eggrafi pou zitithike na diavasei. recordNum = recId % max_records; //-> Vriskei ti thesi tis eggrafis mesa sto block. if (BF_GetThisBlock(fileDesc, blockNum, &blockBuf) != BFE_OK ) //-> Fernei sti mnimi to block sto opoio return (HF_errno = HFE_BFERROR); // vrisketai i eggrafi pou zitithike. if (!isBitActive(blockBuf, BF_BLOCK_SIZE*8-1 -recordNum)) { //-> Elegxei ean uparxei i eggrafi pou zitithike. if (BF_UnpinBlock(fileDesc, blockNum, 0) != BFE_OK) //-> Kanei unpin to block pou efere sti mnimi. return (HF_errno = HFE_BFERROR); // return (HF_errno = HFE_INVALIDREC); } memcpy(record, blockBuf+recordNum*recordSize, recordSize); //-> Adigrafei tin eggrafi sto 'record'. if(BF_UnpinBlock(fileDesc, blockNum, 0) != BFE_OK ) //-> Kanei unpin to block pou efere proigoumenws return (HF_errno = HFE_INVALIDREC); // sti mnimi. return HFE_OK; }
int RMM_GetNextRec(int fileDesc, int recId, char *record, int recordSize) { int ret, i, max_records, blockNum, startingRec; char *blockBuf; if (( blockBuf = malloc(BF_BLOCK_SIZE)) == NULL) { BF_Errno = BFE_NOMEM; return (HF_errno = HFE_BFERROR); } max_records = BF_BLOCK_SIZE*8 / (recordSize*8 + 1); //-> Ypologizei to megisto plithos eggrafwn // pou xwraei to kathe block. blockNum = recId / max_records + 1; //-> Ypologizei poio einai to block sto opoio // vrisketai i 'recId'-iosti eggrafi. startingRec = recId % max_records + 1; //-> Vriskei ti thesi tis epomenis eggrafis mesa // sto block. Ean ksepernaei to 'max_records' // den einai provlima. if (BF_GetThisBlock(fileDesc, blockNum, &blockBuf) != BFE_OK ) //-> Fernei stin mnimi to block sto opoio vrisketai return (HF_errno = HFE_BFERROR); // i eggrafi me anagnwristiko 'recId'. do { //-> Gia to block pou exei erthei sti mnimi, for(i = startingRec ; i < max_records; i++) //-> Gia kathe thesi eggrafis tou block if (isBitActive(blockBuf, BF_BLOCK_SIZE*8-1 -i)) { // ksekinontas apo tin 'startingRec', // elegxei ean uparxei eggrafi. memcpy(record, blockBuf+i*recordSize, recordSize); //-> Ean nai, adigrafei tin eggrafi sto // 'record'. if (BF_UnpinBlock(fileDesc, blockNum, 0) != BFE_OK) //-> Kanei unpin to block pou exei ferei return (HF_errno = HFE_BFERROR); // sti mnimi. return ((blockNum-1)*max_records + i); } if (BF_UnpinBlock(fileDesc, blockNum, 0) != BFE_OK) //-> Kanei unpin to block pou exei ferei return (HF_errno = HFE_BFERROR); // sti mnimi. startingRec = 0; //-> Thetei tin arxiki thesi anazitisis // eggrafis enos block se '0' (1i thesi). } while ((ret = BF_GetNextBlock(fileDesc, &blockNum , &blockBuf)) == BFE_OK ); //-> Den exei vrethei akomi i zitoumeni "epomeni // eggrafi", ki etsi psaxnei sto epomeno block. if (ret == BFE_EOF) return (HF_errno = HFE_EOF); else return (HF_errno = HFE_BFERROR); }
int BF_GetNextBlock(int fileDesc,int *blockNum,char **blockbuf){ int nobs,i,NumBlock=-1; if(of_table[fileDesc].isfree==0){ BF_errno=-14; return BF_errno;//Error -> Lathos fileDesc } nobs=of_table[fileDesc].header_ptr->ofhead->num_of_blocks; for(i=(*blockNum+1);i<nobs;i++){ if(is_valid(of_table[fileDesc].header_ptr->ofhead->bitmaptable,i)==1){ NumBlock=i+1; break;//Brhka to prwto valid block , meta to dosmeno block , sth thesh i+1 } } //Den yparxei valid block sto arxeio meta to dosmeno block if(NumBlock<0){ BF_errno=-11; return BF_errno;; } *blockNum=NumBlock-1; //Kalw thn BF_GetThisBlock me orisma to prwto valid block(an yparxei) , meta to dosmeno block , pou exw brei return BF_GetThisBlock(fileDesc,NumBlock-1,blockbuf); }