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
`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
`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)