# Plan: Remove SQLite Support — PostgreSQL Only ## Rationale The project is called `c-relay-pg` and should only support PostgreSQL. The SQLite fallback caused a production issue where the relay was built without PostgreSQL support and silently fell back to SQLite, while the admin UI connected to PostgreSQL — resulting in the admin showing stale data. ## Files to Modify ### 1. [`Makefile`](../Makefile) | Change | Detail | |--------|--------| | Remove `DB_BACKEND ?= sqlite` (line 8) | Hardcode PostgreSQL backend | | Remove `ifeq/else/endif` conditional (lines 17-23) | Always compile with `-DDB_BACKEND_POSTGRES -DHAVE_LIBPQ` and link `-lpq` | | Remove `src/db_ops_sqlite.c` from `DB_OPS_SRC` | Only compile `src/db_ops_postgres.c` | | Remove `-lsqlite3` from `LIBS` (line 6) | No longer needed | | Remove ARM64 sqlite3 dev references (lines 116, 119, 145, 191) | Replace with postgresql-dev equivalents | ### 2. [`Dockerfile.alpine-musl`](../Dockerfile.alpine-musl) | Change | Detail | |--------|--------| | Remove `ARG DB_BACKEND=sqlite` (line 5) | Hardcode PostgreSQL | | Remove `ARG DB_BACKEND=sqlite` in builder stage (line 11) | Hardcode PostgreSQL | | Remove `sqlite-dev` and `sqlite-static` from apk add (lines 29-30) | Keep `postgresql-dev` | | Remove `if [ "$DB_BACKEND" = "postgres" ]` conditional (lines 118-126) | Always use PostgreSQL flags | | Remove `DB_LIBS=""` else branch (line 123-125) | Always link `-lpq -lpgcommon -lpgport` | | Remove `-lsqlite3` from link line (line 139) | No longer needed | ### 3. [`build_static.sh`](../build_static.sh) | Change | Detail | |--------|--------| | Remove `DB_BACKEND="${DB_BACKEND:-postgres}"` (line 14) | Hardcode PostgreSQL | | Remove `--db-backend` argument parsing (lines 22-33) | No longer needed | | Remove `sqlite` validation (lines 42-45) | No longer needed | | Remove `echo "DB backend: $DB_BACKEND"` (line 59) | No longer needed | | Remove `--build-arg DB_BACKEND=$DB_BACKEND` (lines 158, 182) | No longer needed | | Update usage message (line 36) | Remove `--db-backend` reference | ### 4. [`make_and_restart_relay.sh`](../make_and_restart_relay.sh) | Change | Detail | |--------|--------| | Remove `DB_BACKEND="postgres"` (line 18) | Hardcode PostgreSQL | | Remove `--db-backend` argument parsing (lines 138-150) | No longer needed | | Remove `sqlite` validation (lines 262-266) | No longer needed | | Remove `if [ "$DB_BACKEND" = "postgres" ]` conditional (line 276) | Always use PostgreSQL path | | Remove `--db-backend` from help text (line 365) | No longer needed | | Remove `DB_BACKEND` from build call (line 429) | `./build_static.sh` without args | ### 5. [`src/db_ops.c`](../src/db_ops.c) | Change | Detail | |--------|--------| | Remove `#include "sqlite_db_ops.h"` (line 4) | No longer needed | | Remove `#ifdef DB_BACKEND_POSTGRES` / `#else` / `#endif` conditional | Always use PostgreSQL dispatch | | Remove the `#else` block (lines 207-376) that delegates to `sqlite_db_*` functions | Dead code | ### 6. [`src/main.c`](../src/main.c) | Change | Detail | |--------|--------| | Remove SQLite-specific config references (lines 916-931) | Remove `sqlite_mmap_size` and `sqlite_cache_size_kb` PRAGMA setup | | Remove `sqlite3_open()` comment (line 791) | No longer relevant | ### 7. [`src/config.c`](../src/config.c) | Change | Detail | |--------|--------| | Remove `sqlite_mmap_size` validation (lines 1118-1125) | PostgreSQL-only | | Remove `sqlite_cache_size_kb` validation (lines 1126-1130) | PostgreSQL-only | | Remove `sqlite_mmap_size` and `sqlite_cache_size_kb` from integer type list (lines 2178-2179) | PostgreSQL-only | | Remove `sqlite_mmap_size` and `sqlite_cache_size_kb` from restart-required list (lines 5341-5342) | PostgreSQL-only | ### 8. Source files to remove entirely | File | Reason | |------|--------| | [`src/db_ops_sqlite.c`](../src/db_ops_sqlite.c) | Entire SQLite database implementation | | [`src/sqlite_db_ops.h`](../src/sqlite_db_ops.h) | SQLite header | ### 9. Test scripts — update sqlite3 CLI references | File | Change | |------|--------| | [`tests/1_nip_test.sh`](../tests/1_nip_test.sh) (lines 444-470) | Replace `sqlite3` queries with `psql` equivalents | | [`tests/45_nip_test.sh`](../tests/45_nip_test.sh) (lines 428-452) | Replace `sqlite3` queries with `psql` equivalents | | [`tests/bulk_retrieval_test.sh`](../tests/bulk_retrieval_test.sh) (lines 43-45, 256-258) | Replace `sqlite3` queries with `psql` equivalents | | [`tests/subscription_cleanup_test.sh`](../tests/subscription_cleanup_test.sh) (lines 91-93, 262-271) | Replace `sqlite3` queries with `psql` equivalents | | [`tests/large_event_test.sh`](../tests/large_event_test.sh) (line 63) | Update comment | | [`tests/sql_injection_tests.sh`](../tests/sql_injection_tests.sh) (lines 111, 209-210) | Update SQLite-specific injection strings | ### 10. Example scripts — update sqlite3 references | File | Change | |------|--------| | [`examples/deployment/simple-vps/deploy.sh`](../examples/deployment/simple-vps/deploy.sh) (lines 63, 68) | Replace `sqlite3` with `postgresql` in package lists | | [`examples/deployment/monitoring/monitor-relay.sh`](../examples/deployment/monitoring/monitor-relay.sh) (lines 249-251, 294-296) | Replace `sqlite3` queries with `psql` | | [`examples/deployment/backup/backup-relay.sh`](../examples/deployment/backup/backup-relay.sh) (lines 112-115, 187-189, 205-207) | Replace `sqlite3` backup with `pg_dump` | ## Execution Order 1. Remove source files: `src/db_ops_sqlite.c`, `src/sqlite_db_ops.h` 2. Update `src/db_ops.c` — remove SQLite dispatch, always use PostgreSQL 3. Update `src/main.c` — remove SQLite PRAGMA config 4. Update `src/config.c` — remove SQLite config keys 5. Update `Makefile` — hardcode PostgreSQL backend 6. Update `Dockerfile.alpine-musl` — hardcode PostgreSQL backend 7. Update `build_static.sh` — remove `--db-backend` option 8. Update `make_and_restart_relay.sh` — remove `--db-backend` option 9. Update test scripts — replace `sqlite3` with `psql` 10. Update example scripts — replace `sqlite3` with `psql`/`pg_dump`