Skip to content

Commit 559faeb

Browse files
authored
patterns: Added simple SQLite3 database pattern
1 parent cde46e1 commit 559faeb

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
140140
| SPIRV | | [`patterns/spirv.hexpat`](patterns/spirv.hexpat) | SPIR-V header and instructions |
141141
| STL | `model/stl` | [`patterns/stl.hexpat`](patterns/stl.hexpat) | STL 3D Model format |
142142
| StuffItV5 | `application/x-stuffit` | [`patterns/sit5.hexpat`](patterns/sit5.hexpat) | StuffIt V5 archive |
143+
| SQLite3 | `application/vnd.sqlite3` | [`patterns/sqlite3.hexpat`](patterns/sqlite3.hexpat) | SQLite3 Database |
143144
| SWF | |[`patterns/swf.hexpat`](patterns/swf.hexpat) | Shockwave Flash file format |
144145
| TAR | `application/x-tar` | [`patterns/tar.hexpat`](patterns/tar.hexpat) | Tar file format |
145146
| TES | | [`patterns/wintec_tes.hexpat`](patterns/wintec_tes.hexpat) | Wintec TES GPS log |

patterns/sqlite3.hexpat

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
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;
16 KB
Binary file not shown.

0 commit comments

Comments
 (0)