20#ifndef DETERMINISTICESPASYNCWEBSERVER_SQLITE_FORMAT_H
21#define DETERMINISTICESPASYNCWEBSERVER_SQLITE_FORMAT_H
27#if DETWS_ENABLE_SQLITE
34size_t sqlite_varint_decode(
const uint8_t *buf,
size_t len, uint64_t *out);
42uint64_t sqlite_serial_type_size(uint64_t serial_type);
48 uint8_t write_version;
50 uint8_t reserved_per_page;
51 uint32_t file_change_counter;
53 uint32_t freelist_first;
54 uint32_t freelist_count;
55 uint32_t schema_cookie;
56 uint32_t schema_format;
57 uint32_t text_encoding;
58 uint32_t user_version;
59 uint32_t application_id;
60 uint32_t sqlite_version;
67bool sqlite_parse_db_header(
const uint8_t *buf,
size_t len, SqliteDbHeader *out);
74 static constexpr uint8_t SQLITE_BTREE_INTERIOR_INDEX = 2;
75 static constexpr uint8_t SQLITE_BTREE_INTERIOR_TABLE = 5;
76 static constexpr uint8_t SQLITE_BTREE_LEAF_INDEX = 10;
77 static constexpr uint8_t SQLITE_BTREE_LEAF_TABLE = 13;
81struct SqliteBtreeHeader
84 uint16_t first_freeblock;
86 uint32_t cell_content_start;
87 uint8_t frag_free_bytes;
88 uint32_t right_most_page;
97bool sqlite_parse_btree_header(
const uint8_t *page,
size_t page_len,
size_t offset, SqliteBtreeHeader *out);
103uint32_t sqlite_cell_pointer(
const uint8_t *page,
size_t page_len,
const SqliteBtreeHeader *bh,
size_t page_offset,
107struct SqliteTableLeafCell
110 uint32_t payload_len;
123bool sqlite_parse_table_leaf_cell(
const uint8_t *page,
size_t page_len, uint32_t page_size, uint8_t reserved,
124 uint32_t cell_off, SqliteTableLeafCell *out);
127struct SqliteRecordCursor
137bool sqlite_record_begin(SqliteRecordCursor *c,
const uint8_t *rec, uint32_t rec_len);
143bool sqlite_record_next(SqliteRecordCursor *c, uint64_t *serial_type,
const uint8_t **val, uint32_t *val_len);
146int64_t sqlite_column_int(uint64_t serial_type,
const uint8_t *val, uint32_t val_len);
149double sqlite_column_float(
const uint8_t *val, uint32_t val_len);
152#define SQLITE_BTREE_MAX_DEPTH 20
158using SqlitePageReader = bool (*)(
void *ctx, uint32_t pgno, uint8_t *page, uint32_t page_size);
178bool sqlite_read_payload(SqlitePageReader read,
void *ctx, uint32_t page_size, uint8_t reserved,
179 const uint8_t *leaf_page,
const SqliteTableLeafCell *cell, uint8_t *out, uint32_t out_cap,
193struct SqliteTableCursor
195 SqlitePageReader read;
203 uint32_t stack_pg[SQLITE_BTREE_MAX_DEPTH];
204 uint16_t stack_idx[SQLITE_BTREE_MAX_DEPTH];
206 SqliteBtreeHeader leaf_hdr;
219void sqlite_table_cursor_set_overflow_buf(SqliteTableCursor *c, uint8_t *buf, uint32_t cap);
225bool sqlite_table_cursor_begin(SqliteTableCursor *c, SqlitePageReader read,
void *ctx, uint32_t page_size,
226 uint8_t reserved, uint32_t rootpage, uint8_t *leaf_buf, uint8_t *work_buf);
232bool sqlite_table_cursor_next(SqliteTableCursor *c, uint64_t *rowid, SqliteRecordCursor *row);
245size_t sqlite_varint_encode(uint64_t v, uint8_t *out,
size_t cap);
248enum class SqliteColType : uint8_t
273uint32_t sqlite_encode_record(
const SqliteValue *cols, uint32_t n, uint8_t *out, uint32_t out_cap);
279 const SqliteValue *cols;
295uint32_t sqlite_build_table_db(uint32_t page_size,
const char *table_name,
const char *create_sql,
296 const SqliteRow *rows, uint32_t nrows, uint8_t *out, uint32_t out_cap);
User-facing configuration for DeterministicESPAsyncWebServer.