YeltsinDB/table_file.md

59 lines
1.8 KiB
Markdown

# Table file structure
## Table file version changelog
### v0.1
Initial version.
## Overall specification
1. `TBL!` file signature (4 bytes)
2. Table file version (2 bytes)
3. The offset to the first page in a table. (8 bytes)
4. The offset to the last page in a table. (8 bytes)
5. The offset to the last available *free* page (8 bytes)
6. Pages (64 KiB each)
1. Page flags (1 byte)
2. Next page offset (8 bytes) **could be 0 if last page**
3. Row count (2 bytes)
4. Rows
1. Row flags (1 byte)
2. Row data
## Table file version specification
In the further time, it's planned to rewrite the file structure, so it's useful to have a version marker.
| 7-4 | 3-0 |
|---------------|---------------|
| Major version | Minor version |
That means that the first byte defines major version, and the second one defines minor version.
If tables with different versions are binary-compatible with each other, their major version must be the same.
## Page flags specification
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|-----|-----|-----|-----|-----|-----|-----|-----|
| RSV | RSV | RSV | RSV | RSV | RSV | RSV | DEL |
- **RSV** -- reserved for further usage.
- **DEL** -- free page flag.
## Row flags specification
See "Page flags specification" above.
## Free pages
A page can be called *free* iff all its rows are deleted.
If there is a free page, there actions are being done:
1. Set `DEL` page flag ((6.3) |= FLAG_DEL)
2. If a page is **not** the last one, replace next page offset in the previous page with a value in current page
((previous 6.1) = (6.1))
3. Put last available free page as the next page ((6.1) = 5)
4. Set current page offset as the offset to the last available free page ((5) = current_page_offset)