1+ #pragma description SQLite 3 database
2+ #pragma author WerWolv
3+ #pragma MIME application/vnd.sqlite3
4+
5+ import type.magic;
6+
7+ enum FileFormatVersion : u8 {
8+ Legacy = 1,
9+ WAL = 2
10+ };
11+
12+ enum TextEncoding : u32 {
13+ UTF8 = 1,
14+ UTF16LE = 2,
15+ UTF16BE = 3
16+ };
17+
18+ struct SQLiteVersion {
19+ u32 rawValue;
20+
21+ u8 major = (rawValue / 1000000) % 1000 [[export]];
22+ u8 minor = (rawValue / 1000) % 1000 [[export]];
23+ u8 patch = (rawValue / 1) % 1000 [[export]];
24+ } [[sealed, format("format_sqlite_version")]];
25+
26+ fn format_sqlite_version(ref auto version) {
27+ return std::format("v{}.{}.{} [{}]", version.major, version.minor, version.patch, version.rawValue);
28+ };
29+
30+ u16 globalPageSize = 0;
31+
32+ enum PageType : u8 {
33+ InteriorIndexBTreePage = 0x02,
34+ InteriorTableBTreePage = 0x05,
35+ LeafIndexBTreePage = 0x0A,
36+ LeafTableBTreePage = 0x0D
37+ };
38+
39+ struct Page {
40+ PageType pageType;
41+ u16 freeBlockStart;
42+ u16 numCells;
43+ u16 cellContentAreaStart;
44+ u8 fragmentedFreeBytesCount;
45+
46+ if (pageType == PageType::InteriorIndexBTreePage || pageType == PageType::InteriorTableBTreePage)
47+ u32 rightMostPointer;
48+ } [[fixed_size(le u16(globalPageSize))]];
49+
50+ struct DatabaseHeader {
51+ type::Magic<"SQLite format 3\x00"> magic;
52+ u16 pageSizeValue;
53+ u16 pageSize = pageSizeValue == 1 ? 65536 : le u16(pageSizeValue) [[export]];
54+ globalPageSize = pageSize;
55+
56+ FileFormatVersion readVersion, writeVersion;
57+ padding[1];
58+ u8 maxEmbeddedPayloadFraction;
59+ if (maxEmbeddedPayloadFraction != 64)
60+ std::warning("Unexpected Max Embedded Payload Fraction");
61+
62+ u8 minEmbeddedPayloadFraction;
63+ if (minEmbeddedPayloadFraction != 32)
64+ std::warning("Unexpected Min Embedded Payload Fraction");
65+
66+ u8 leafPayloadFraction;
67+ if (leafPayloadFraction != 32)
68+ std::warning("Unexpected Leaf Payload Fraction");
69+
70+ u32 fileChangeCounter;
71+ u32 totalPageCount;
72+
73+ u32 freelistTrunkPageNumber;
74+ u32 totalFreeListPageCount;
75+
76+ u32 schemaCookie;
77+ u32 schemaFormatNumber;
78+ u32 defaultPageCacheSize;
79+ u32 largestRootBTreePage;
80+ TextEncoding textEncoding;
81+ u32 userVersion;
82+ u32 incrementalVacuumMode;
83+ u32 applicationId;
84+ padding[20];
85+ u32 versionValidForNumber;
86+ SQLiteVersion sqliteVersionNumber;
87+ };
88+
89+ struct SQLite3 {
90+ be DatabaseHeader header;
91+
92+ be Page pages[le u16(header.totalPageCount) - 1] @ le u16(header.pageSize);
93+ };
94+
95+ SQLite3 sqlite3 @ 0x00;
0 commit comments