Advertisement
Guest User

Untitled

a guest
Jan 18th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.58 KB | None | 0 0
  1.  public void reorganization() throws ExitException, IOException {
  2.  
  3.         RandomAccessFile new_file = new RandomAccessFile("tmp.txt", "rw");
  4.         new_file.setLength(0);
  5.         int main_page_counter = 0;
  6.         byte[] overflow_page = new byte[PAGE_SIZE];
  7.         int overflow_off = 0;
  8.         byte[] new_page = new byte[PAGE_SIZE];
  9.         int new_off = 0;
  10.         int tmp;
  11.         ByteBuffer new_wrapper = ByteBuffer.wrap(new_page);
  12.         ByteBuffer wrapper = ByteBuffer.wrap(this.databaseFile.getBuffer());
  13.         ByteBuffer overflow_wrapper = ByteBuffer.wrap(overflow_page);
  14.         this.databaseFile.setBufferOffset(0);
  15.         this.databaseFile.seek(MAX_MAIN);
  16.  
  17.         try{
  18.             this.databaseFile.read(overflow_page);
  19.             this.read_counter++;
  20.             this.databaseFile.seek(0);
  21.             while(main_page_counter < pageAmount && this.databaseFile.read(this.databaseFile.getBuffer()) != -1) {
  22.                 main_page_counter++;
  23.                 this.read_counter++;
  24.                 while(this.databaseFile.getBuffer().length - this.databaseFile.getBufferOffset() >= RECORD_SIZE) {
  25.                     if(new_off == PAGE_SIZE - ALFA * RECORD_SIZE) {
  26.                         new_off = 0;
  27.                         new_file.write(new_page);
  28.                         write_counter++;
  29.                         new_page = new byte[PAGE_SIZE];
  30.                         new_wrapper = ByteBuffer.wrap(new_page);
  31.                     }
  32.                     if(overflow_off / RECORD_SIZE == this.overflow_counter || wrapper.getInt(this.databaseFile.getBufferOffset()) < overflow_wrapper.getInt(overflow_off)) {
  33.                         new_wrapper.putInt(new_off, wrapper.getInt(this.databaseFile.getBufferOffset()));
  34.                         new_wrapper.putFloat(new_off + 12, wrapper.getFloat(this.databaseFile.getBufferOffset() + 12));
  35.                         new_wrapper.putDouble(new_off + 4, wrapper.getDouble(this.databaseFile.getBufferOffset() + 4));
  36.                         new_wrapper.putInt(new_off + 16, wrapper.getInt(this.databaseFile.getBufferOffset() + 16));
  37.                         new_off += RECORD_SIZE;
  38.                         this.databaseFile.setBufferOffset(this.databaseFile.getBufferOffset() + RECORD_SIZE);
  39.                     } else {
  40.                         new_wrapper.putInt(new_off, overflow_wrapper.getInt(overflow_off));
  41.                         new_wrapper.putFloat(new_off + 12, overflow_wrapper.getFloat(overflow_off + 12));
  42.                         new_wrapper.putDouble(new_off + 4, overflow_wrapper.getDouble(overflow_off + 4));
  43.                         new_wrapper.putInt(new_off + 16, overflow_wrapper.getInt(overflow_off + 16));
  44.                         new_off += RECORD_SIZE;
  45.                         overflow_off += RECORD_SIZE;
  46.                     }
  47.                     tmp = new_wrapper.getInt(new_off - 4);      //latest pointer
  48.                         //if there's a list of elements
  49.                     while(tmp != 0 && overflow_off / RECORD_SIZE < this.overflow_counter) {
  50.                         new_wrapper.putInt(new_off - 4, 0);
  51.                         if(new_off == PAGE_SIZE - ALFA * RECORD_SIZE) {
  52.                             new_file.write(new_page);
  53.                             this.write_counter++;
  54.                             new_off = 0;
  55.                             new_page = new byte[PAGE_SIZE];
  56.                             new_wrapper = ByteBuffer.wrap(new_page);
  57.                         }
  58.                         while(overflow_wrapper.getInt(overflow_off) != tmp) {
  59.                             overflow_off += RECORD_SIZE;
  60.                         }
  61.                         new_wrapper.putInt(new_off, overflow_wrapper.getInt(overflow_off));
  62.                         new_wrapper.putFloat(new_off + 12, overflow_wrapper.getFloat(overflow_off + 12));
  63.                         new_wrapper.putDouble(new_off + 4, overflow_wrapper.getDouble(overflow_off + 4));
  64.                         new_wrapper.putInt(new_off + 16, overflow_wrapper.getInt(overflow_off + 16));
  65.                         new_off += RECORD_SIZE;
  66.                         overflow_off += RECORD_SIZE;
  67.                         tmp = new_wrapper.getInt(new_off - 4);
  68.                     }
  69.                 }
  70.                 this.databaseFile.setBufferOffset(0);
  71.             }
  72.         }
  73.         catch (Exception e) {
  74.             //End of file
  75.         }
  76.         new_file.write(new_page);
  77.         this.write_counter++;
  78.         new_page = new byte[PAGE_SIZE];
  79.         new_wrapper = ByteBuffer.wrap(new_page);
  80.  
  81.         //rewriting files and creating new index file
  82.         this.indexFile.seek(0);
  83.         new_file.seek(0);
  84.         this.databaseFile.seek(0);
  85.         int i = 1;
  86.         int index_off = 0;
  87.         this.indexFile.setBuffer(new byte[PAGE_SIZE]);
  88.         ByteBuffer index_wrapper = ByteBuffer.wrap(this.indexFile.getBuffer());
  89.         pageAmount = 0;
  90.         this.databaseFile.setLength(0);
  91.         while(new_file.read(new_page) != -1) {
  92.             pageAmount++;
  93.             this.read_counter++;
  94.             index_wrapper.putInt(index_off, new_wrapper.getInt(0));
  95.             index_wrapper.putInt(index_off + 4, i++);
  96.             index_off += INDEX_RECORD_SIZE;
  97.             this.databaseFile.write(new_page);
  98.             this.write_counter++;
  99.         }
  100.         this.indexFile.write(this.indexFile.getBuffer());
  101.         this.databaseFile.write(new byte[PAGE_SIZE]);
  102.         //overflow area
  103.         new_file.close();
  104.  
  105.         this.MAX_MAIN = PAGE_SIZE * pageAmount;
  106.         this.overflow_counter = 0;
  107.         this.OVERFLOW_SIZE = 2 * pageAmount * RECORD_SIZE;
  108.  
  109.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement