# Changelog All notable changes to this project will be documented in this file. ## [Unreleased] --- ## [1.0.0] - 2026-06-03 ### Changed - `pyproject.toml` — bumped version to `1.0.0` --- ## [0.4.0] - 2026-06-03 ### Added - `add_sink(sink, *, level, **kwargs)` — public API for routing sqlmem log records to any loguru-compatible sink (stream, file, callable); supports all loguru `logger.add()` kwargs including `rotation`, `retention`, etc. ### Changed - `pyproject.toml` — bumped version to `0.4.0` - `config.py` — replaced destructive `logger.remove()` + forced default sink with `logger.disable("sqlmem")`; sqlmem is now silent by default and does not interfere with the host application's logging setup --- ## [0.3.0] - 2026-06-03 ### Added - `README.md` — full project documentation: architecture overview, quick start, cache behaviour, persistence, configuration, exceptions, logging, and limitations ### Changed - `pyproject.toml` — bumped version to `0.3.0` - `parser.py` — `_extract_columns` now deduplicates column names while preserving order - `.gitignore` — added `.env` and `.env.*` to prevent accidental commit of environment files ### Security - Removed `.env` from git tracking (`git rm --cached`) --- ## [0.2.0] - 2026-06-01 ### Added - Project specification in `project.md` — architecture, API design, cache backend, metadata schema, logging strategy, and TODO for future features (JOIN, SELECT * support) - `.gitignore` for Python/Poetry project - `pyproject.toml` dependencies: `sqlglot`, `sqlalchemy`, `loguru`, `python-dotenv`; dev dependencies: `pytest`, `ruff`, `mypy` - `src/sqlmem/` package structure with src layout - `src/sqlmem/exceptions.py` — `ReadOnlyError` (blocks INSERT/UPDATE/DELETE), `UnsupportedQueryError` (blocks JOIN and SELECT *) - `src/sqlmem/config.py` — loads `.env`, configures `loguru` with DEBUG/INFO level based on `SQLMEM_DEBUG` - `src/sqlmem/_meta.py` — package version constant - `src/sqlmem/parser.py` — SQL Parser using `sqlglot`; extracts table and columns from SELECT, raises on writes/JOIN/wildcard - `src/sqlmem/registry.py` — Column Registry; accumulates requested columns per table, detects missing columns requiring re-fetch - `src/sqlmem/cache.py` — Cache Manager; SQLite in-memory storage, load from `cache.db` on startup (with schema version check), hourly backup thread, `atexit`/SIGTERM flush, metadata tables (`_sqlmem_meta`, `_sqlmem_tables`, `_sqlmem_columns`) - `src/sqlmem/executor.py` — Query Executor; cache hit/miss logic, re-fetch on new columns with WARNING log - `src/sqlmem/engine.py` — `CachingEngine` wrapper; public API compatible with SQLAlchemy, `invalidate(table)` for manual cache clearing - `src/sqlmem/__init__.py` — public exports: `CachingEngine`, `ReadOnlyError`, `UnsupportedQueryError` - `tests/test_parser.py` — parser tests: SELECT parsing, ReadOnlyError, UnsupportedQueryError - `tests/test_cache.py` — cache tests: load, data correctness, metadata, disk backup/reload - `tests/test_registry.py` — registry tests: accumulation, needs_refetch, table isolation