20#ifndef PROTOCORE_SQLITE_FORMAT_H
21#define PROTOCORE_SQLITE_FORMAT_H
34size_t pc_sqlite_varint_decode(
const uint8_t *buf,
size_t len, uint64_t *out);
42uint64_t pc_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 pc_sqlite_version;
67bool pc_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 pc_sqlite_parse_btree_header(
const uint8_t *page,
size_t page_len,
size_t offset, SqliteBtreeHeader *out);
103uint32_t pc_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 pc_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 pc_sqlite_record_begin(SqliteRecordCursor *c,
const uint8_t *rec, uint32_t rec_len);
143bool pc_sqlite_record_next(SqliteRecordCursor *c, uint64_t *serial_type,
const uint8_t **val, uint32_t *val_len);
146int64_t pc_sqlite_column_int(uint64_t serial_type,
const uint8_t *val, uint32_t val_len);
149double pc_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 pc_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 pc_sqlite_table_cursor_set_overflow_buf(SqliteTableCursor *c, uint8_t *buf, uint32_t cap);
225bool pc_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 pc_sqlite_table_cursor_next(SqliteTableCursor *c, uint64_t *rowid, SqliteRecordCursor *row);
245size_t pc_sqlite_varint_encode(uint64_t v, uint8_t *out,
size_t cap);
248enum class SqliteColType : uint8_t
273uint32_t pc_sqlite_encode_record(
const SqliteValue *cols, uint32_t n, uint8_t *out, uint32_t out_cap);
279 const SqliteValue *cols;
295uint32_t pc_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 ProtoCore.