# Data and database compatibility

ushort stores data in SQLite. The database can be mounted directly across
upgrades; no export or import is required.

```sql
CREATE TABLE urls (
    short_code     TEXT    PRIMARY KEY,
    original_url   TEXT    NOT NULL,
    created_at     INTEGER NOT NULL,
    visit_count    INTEGER NOT NULL DEFAULT 0,
    retention_days INTEGER NOT NULL DEFAULT 0
);
```

Older databases missing `retention_days` are upgraded in place with a default
of zero. Expired records are removed on startup and before each GET, POST, or
DELETE request, using a strict expiry boundary.

## Backups

Take a consistent backup before every production update. SQLite's online
backup command avoids copying a database while a WAL transaction is active:

```bash
sqlite3 data/urlshort.db ".backup data/urlshort.db.pre-update"
sqlite3 data/urlshort.db.pre-update "PRAGMA integrity_check;"
```

Retain the backup until the updated release has passed health, redirect,
write, and database-integrity checks.
