Changelog

# Changelog

## 0.3.3

### 新增

- 新增 `esp_sqlite3_set_progress_handler()`:业务 progress handler 通过内部
  trampoline 链接,`VACUUM` / `VACUUM INTO` / 在线备份等长操作复用业务步长,
  并在回调中喂任务看门狗、周期性让出 CPU;长操作结束后恢复业务 handler。
- 新增 `test_apps/stress` 压力工程:掉电重启、磁盘写满、只读 VFS 挂载、
  只读 WAL、mmap 关闭、VACUUM progress 保活。
- 自测新增只读 WAL、mmap=0、VACUUM progress handler 三项,共 26 项。

### 修复

- 只读连接打开活动 WAL 数据库时,若同进程已有写连接,
  `xShmMap()` 直接附着到已有 WAL shm,不再误返回 `SQLITE_READONLY_CANTINIT`
  导致 `disk I/O error`。

### 验证

- ESP-IDF 6.1 / ESP32-C5:`test_apps/stress` 全部 PASS:8 次掉电复位、
  磁盘写满、只读挂载读写拒绝、只读 WAL、mmap=0、VACUUM progress。
- ESP-IDF 6.1 / ESP32-C5:FULL/MINIMAL/STANDARD/MAX/CRUD 全部
  `SELFTEST RESULT: PASS`(每次擦除 flash)。
- ESP-IDF 5.5.4 / ESP32-C5:FULL `SELFTEST RESULT: PASS`;压力工程构建通过。

## 0.3.1

### 修复

- `esp_sqlite3_query()` / `query_int64()` / `query_double()` / `query_text()`
  对纯空白/注释 SQL 的 `stmt == NULL` 增加检查,避免对 NULL 语句调用
  `sqlite3_step()` 导致崩溃。
- VFS 锁状态机:`PENDING` 也要拒绝其他连接的 `EXCLUSIVE`;`EXCLUSIVE` 也要
  拒绝其他连接的 `PENDING`;`xCheckReservedLock()` 现在把
  RESERVED/PENDING/EXCLUSIVE 任一状态都计为写者。
- `esp_sqlite3_state_mutex` 改为静态创建,避免在 `portENTER_CRITICAL` 内做
  可能走堆分配的动态信号量创建。

### 验证

- ESP-IDF 6.1 / ESP32-C5 FULL:`SELFTEST RESULT: PASS`(含空 SQL 查询与
  双任务并发写回归)。

## 0.3.0

### 修复

- VFS 路径按目录项真实大小写归一化:FATFS 上 `App.db` / `app.db` 共用同一把
  文件锁和同一份 WAL shm;SPIFFS/LittleFS 上不同大小写仍是不同文件。
- `PERSIST_WAL` 从固定 4 项数组改为动态表,超过 4 个数据库不再误删 `-wal`。
- `xClose` 在 SQLite 未调用 `xShmUnmap` 时也释放本文件持有的 WAL shm 锁,避免
  残留锁导致其他连接 `SQLITE_BUSY`。
- 外部先调用 `sqlite3_initialize()` 时,`esp_sqlite3_init()` 会 shutdown 后重新
  安装分配器/FreeRTOS 互斥量;有外部连接时安全返回 BUSY。
- 运行时 `temp_store=FILE` 始终使用 `CONFIG_ESP_SQLITE3_TEMP_DIR`,不依赖编译
  默认是否为 `SQLITE_TEMP_STORE=3`。
- VACUUM / VACUUM INTO / 在线备份周期性让出 CPU 并喂任务看门狗;备份每步喂狗。
- shox96 直接 API 遇到不可编码字节返回错误,不再静默丢数据。
- `esp_sqlite3_query()` 增加 NOMEM 重试;`table_exists()` 检查绑定错误。
- 迁移步骤在执行前统一校验版本单调性和 SQL 非空,避免执行到一半才发现配置错误。
- 内存分配器 `xRoundup` 处理整数溢出;互斥量未初始化时 `xMutexAlloc` 返回 NULL。
- 损坏数据库在打开或 `integrity_check` 时明确返回错误。

### 自测新增

- 外部 `sqlite3_initialize()` 恢复。
- VFS 稀疏写、越过 EOF 短读、补零、`path=NULL` 临时文件、`xTruncate`。
- 大小写不同文件名的独立性。
- 运行时 `temp_store=FILE` 与临时目录。
- 损坏数据库拒绝。
- 双任务并发写同一数据库。
- `PERSIST_WAL` 连续 6 个数据库。
- FULL 创建 WAL 库,MINIMAL 打开时拒绝(WAL downgrade guard)。
- `deinit` 后重新 `init/open`。

### 验证

- ESP-IDF 6.1 / ESP32-C5:MAX、FULL、STANDARD、MINIMAL、CRUD 全部
  `SELFTEST RESULT: PASS`。
- ESP-IDF 5.5.4 / ESP32-C5:FULL、MINIMAL 硬件运行
  `SELFTEST RESULT: PASS`。
- 主机 shox96:5 万组随机 ASCII 往返、20 万组随机损坏输入、非 ASCII 拒绝、
  输出容量不足拒绝,全部通过。

## 0.2.2

- 组件清单支持全部 ESP-IDF 目标。
- 修正 README 安装版本与默认档位说明。

## 0.2.1

- 修正 registry README 安装版本。

## 0.2.0

- 修复 SPIFFS lseek/EOF 短读、稀疏写、临时文件名长度、只读写语义、WAL 只读
  映射、VFS 注册竞态、deinit 残留 VFS 状态。
- 修复 shox96 未初始化读、非 ASCII 静默丢数据、输出容量不足、70KB 以上编码
  边界、`SHX_ERR` 冲突。
- 修复 close BUSY、`clear_bindings(NULL)`、列文本 NULL/OOM、迁移顺序、备份
  同路径/错误传播、CRUD/WAL 能力返回值、URI/secure-delete 配置。

## 0.1.0

- 首次发布:SQLite 3.54.1 amalgamation、ESP-IDF VFS、WAL、PSRAM 分配器、
  FTS5/RTREE/STAT4/DBSTAT、shox96、五个功能档位。