net.metanotion.io.block

## Class BlockFile

- java.lang.Object
- - net.metanotion.io.block.BlockFile

-     public class BlockFile
      extends Object

  On-disk format: Magic number (6 bytes) Version major/minor (2 bytes) file length (long) free list start (unsigned int) is mounted (unsigned short) 0 = no, 1 = yes span size (unsigned short) Metaindex skiplist is on page 2 Pages are 1 KB and are numbered starting from 1. e.g. the Metaindex skiplist is at offset 1024 bytes

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `RandomAccessInterface` | `file`
    `static Log` | `log`
    `static int` | `MAGIC_CONT`
    `static int` | `METAINDEX_PAGE`
    `static long` | `OFFSET_MOUNTED`
    `static int` | `PAGESIZE`
    `int` | `spanSize`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `BlockFile(File f, boolean init)`
    `BlockFile(RandomAccessFile raf)`
    `BlockFile(RandomAccessFile raf, boolean init)`
    `BlockFile(RandomAccessInterface rai)`
    `BlockFile(RandomAccessInterface rai, boolean init)`

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `int` | `allocPage()`
    `void` | `bfck(boolean fix)`
    `void` | `close()` Note (I2P) Does NOT close the RAF / RAI.
    `void` | `closeIndex(String name)` Added I2P
    `void` | `delIndex(String name)`
    `void` | `freePage(int page)` Add the page to the free list.
    `BSkipList` | `getIndex(String name, Serializer key, Serializer val)`
    `static void` | `main(String[] args)`
    `BSkipList` | `makeIndex(String name, Serializer key, Serializer val)`
    `static void` | `pageSeek(RandomAccessInterface file, int page)` Go to any page but the superblock.
    `int` | `readMultiPageData(byte[] arr, int page, int[] curPageOff, int[] nextPage)` Read bytes
    `int` | `skipMultiPageBytes(int length, int page, int[] curPageOff, int[] nextPage)` Skip length bytes The same as readMultiPageData() without returning a result
    `int` | `writeMultiPageData(byte[] data, int page, int[] curPageOff, int[] nextPage)` Write bytes This will allocate additional continuation pages as necessary.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### PAGESIZE

          public static final int PAGESIZE

      See Also:
        Constant Field Values

    - #### OFFSET_MOUNTED

          public static final long OFFSET_MOUNTED

      See Also:
        Constant Field Values

    - #### log

          public static final Log log

    - #### file

          public final RandomAccessInterface file

    - #### MAGIC_CONT

          public static final int MAGIC_CONT

      See Also:
        Constant Field Values

    - #### METAINDEX_PAGE

          public static final int METAINDEX_PAGE

      See Also:
        Constant Field Values

    - #### spanSize

          public int spanSize

  - ### Constructor Detail

    - #### BlockFile

          public BlockFile(RandomAccessInterface rai)
                    throws IOException

      Throws:
        `IOException`

    - #### BlockFile

          public BlockFile(RandomAccessFile raf)
                    throws IOException

      Throws:
        `IOException`

    - #### BlockFile

          public BlockFile(RandomAccessFile raf,
                   boolean init)
                    throws IOException

      Throws:
        `IOException`

    - #### BlockFile

          public BlockFile(File f,
                   boolean init)
                    throws IOException

      Throws:
        `IOException`

    - #### BlockFile

          public BlockFile(RandomAccessInterface rai,
                   boolean init)
                    throws IOException

      Throws:
        `IOException`

  - ### Method Detail

    - #### main

          public static void main(String[] args)

    - #### writeMultiPageData

          public int writeMultiPageData(byte[] data,
                               int page,
                               int[] curPageOff,
                               int[] nextPage)
                                 throws IOException

      Write bytes This will allocate additional continuation pages as necessary.
      Parameters:
        `data` - data to write
        `page` - current page
        `curPageOff` - in (current) and out (new) parameter at index 0
        `nextPage` - in (current) and out (new) parameter at index 0
      Returns:
        current page
      Throws:
        `IOException`

    - #### readMultiPageData

          public int readMultiPageData(byte[] arr,
                              int page,
                              int[] curPageOff,
                              int[] nextPage)
                                throws IOException

      Read bytes
      Parameters:
        `arr` - fill this array fully with data
        `page` - current page
        `curPageOff` - in (current) and out (new) parameter at index 0
        `nextPage` - in (current) and out (new) parameter at index 0
      Returns:
        current page
      Throws:
        `IOException`

    - #### skipMultiPageBytes

          public int skipMultiPageBytes(int length,
                               int page,
                               int[] curPageOff,
                               int[] nextPage)
                                 throws IOException

      Skip length bytes The same as readMultiPageData() without returning a result
      Parameters:
        `length` - number of bytes to skip
        `page` - current page
        `curPageOff` - in (current) and out (new) parameter at index 0
        `nextPage` - in (current) and out (new) parameter at index 0
      Returns:
        current page
      Throws:
        `IOException`

    - #### pageSeek

          public static void pageSeek(RandomAccessInterface file,
                      int page)
                               throws IOException

      Go to any page but the superblock. Page 1 is the superblock, must use file.seek(0) to get there.
      Parameters:
        `page` - >= 2
      Throws:
        `IOException`

    - #### allocPage

          public int allocPage()
                        throws IOException

      Throws:
        `IOException`

    - #### freePage

          public void freePage(int page)

      Add the page to the free list. The file is never shrunk. TODO: Reclaim free pages at end of file, or even do a full compaction. Does not throw exceptions; logs on failure.

    - #### getIndex

          public BSkipList getIndex(String name,
                           Serializer key,
                           Serializer val)
                             throws IOException

      Throws:
        `IOException`

    - #### makeIndex

          public BSkipList makeIndex(String name,
                            Serializer key,
                            Serializer val)
                              throws IOException

      Throws:
        `IOException`

    - #### delIndex

          public void delIndex(String name)
                        throws IOException

      Throws:
        `IOException`

    - #### closeIndex

          public void closeIndex(String name)

      Added I2P

    - #### close

          public void close()
                     throws IOException

      Note (I2P) Does NOT close the RAF / RAI.
      Throws:
        `IOException`

    - #### bfck

          public void bfck(boolean fix)