Copyright and License
This document is Copyright © 2020 John P. Willis
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover texts, and with no Back-Cover Texts.
Global Handler
The database is organized in a B* tree structure in disk files, each file directly corresponding to a single M global.
On-disk, the arrangement is
/var/local/freem/<namespace-name>/<global-name>
, where <global-name>
would be something like ^DD
.
Percent globals (^%…
) conventionally reside in the SYSTEM
namespace.
Non-percent globals (^…
) reside in other namespaces, or the USER
namespace by default.
Blocks
Blocks are BLOCKLEN
bytes long (1024 in the current implementation).
Relevant Source Files
-
global.c (see especially the function
global()
)
Relevant Constants
Block Offsets
Each of the following constants describe a byte offset to a particular type of data within a single block.
| CONSTANT | DESCRIPTION | BLOCK TYPE | +----------+------------------------------------------------+------------------+ | LLPTR | Left-Link Pointer | DATA, PTR, BPTR | | RLPTR | Right-Link Pointer | DATA, PTR, BPTR | | NRBLK | Number of Blocks | ROOT | | COLLA | Collation (1: numeric, 2: alphabetical) | ROOT | | FREE | Free Block Count | ROOT | | BTYP | Block Type (2: PTR, 6: BPTR, 8: DATA) | ALL | | OFFS | Offset to Unused Portion of Data Area | ALL |
Other Constants
| CONSTANT | DESCRIPTION | +----------+------------------------------------------------+ | DATALIM | Length of block data area (offsets 0-1013) | | BLOCKLEN | Length of block (currently 1024) |
Root Block Format
| STARTING OFFSET | ENDING OFFSET | DESCRIPTION | +-------------------+------------------+-------------------------------------+ | 0 | 1013 (DATALIM) | Block Data Area | | 1014 (NRBLK) | 1016 | Number of Blocks | | 1017 (COLLA) | 1017 | Collation (0 numeric, 1 alpha) | | 1018 (FREE) | 1020 | Free Block Count | | 1021 (BTYP) | 1021 | Block Type (2 PTR 6 BPTR 8 DATA) | | 1022 (OFFS) | 1023 | Ptr to free part of block data area |
Data Block Format
| STARTING OFFSET | ENDING OFFSET | DESCRIPTION | +-------------------+------------------+--------------------------------------+ | 0 | 0 | Length of Key - Offset to Prev. Key | | 1 | 1 | Offset to Prev. Key | | 2 | < DATALIM | Compressed Key | | <VARIES> | < DATALIM | Length of Global Data (2 bytes) | | <VARIES> | < DATALIM | Global Data | | 1014 (LLPTR) | 1016 | Left-Link Pointer | | 1017 | 1017 | <RESERVED> | | 1018 (RLPTR) | 1020 | Right-Link Pointer | | 1021 (BTYP) | 1021 | Block Type (2: PTR, 6: BPTR, 8: DATA)| | 1022 (OFFS) | 1023 | Ptr to free part of block data area |
Pointer Block Format
| STARTING OFFSET | ENDING OFFSET | DESCRIPTION | +-------------------+------------------+--------------------------------------+ | 0 | 0 | Length of Key - Offset to Prev. Key | | 1 | 1 | Offset to Prev. Key | | 2 | < DATALIM | Compressed Key | | <VARIES> | (2 Bytes) | Forward Pointer (to ptr or data blk) | | 1017 | 1017 | <RESERVED> | | 1021 (BTYP) | 1021 | Block Type (2 or 6) | | 1022 (OFFS) | 1023 | Ptr to free part of block data area |