fix(linkwarden): convert SQL_ASCII database to UTF8 for und-x-icu migration (#3073) (#3075)

* fix(linkwarden): convert SQL_ASCII database to UTF8 for und-x-icu migration (#3073)

Linkwarden 2.16.3 adds a migration using the ICU collation "und-x-icu",
which does not exist for SQL_ASCII databases. Databases created by older
add-on versions under the POSIX locale are SQL_ASCII, so startup fails
with Prisma P3018/P3009.

New databases are now created explicitly as UTF8. An existing SQL_ASCII
database is copied once into a UTF8 database, the failed migration is
marked rolled back so Prisma re-applies it, and the original is kept as
linkwarden_sql_ascii_backup. Installs already on UTF8 only pay one
encoding lookup.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* fix(linkwarden): validate UTF-8 and swap databases atomically during conversion

Addresses Codex review: pipe the dump through iconv so bytes that are not
valid UTF-8 abort the conversion instead of being copied silently, rename
both databases in one transaction, and log how to drop the backup.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Alexandre
2026-09-19 08:49:26 +02:00
committed by GitHub
parent a6303bd7a0
commit cec8b3cf68
3 changed files with 23 additions and 3 deletions

View File

@@ -1,4 +1,7 @@
## 2.16.3.1 (19-09-2026)
- Fix startup failure (Prisma P3018/P3009, collation "und-x-icu" for encoding "SQL_ASCII" does not exist) after the 2.16.3 update (#3073): a local database created as SQL_ASCII by older versions is converted once to UTF8 at startup, the original is kept as `linkwarden_sql_ascii_backup`. New databases are created as UTF8.
## 2.16.3 (2026-09-12)
- Update to latest version from linkwarden/linkwarden (changelog : https://github.com/linkwarden/linkwarden/releases)
- Migrate legacy add-on configuration map names to current app configuration terminology.

View File

@@ -45,5 +45,5 @@ schema:
STORAGE_FOLDER: str?
slug: linkwarden
url: https://github.com/alexbelgium/hassio-addons/tree/master/linkwarden
version: "2.16.3"
version: "2.16.3.1"
webui: "[PROTO:ssl]://[HOST]:[PORT:3000]"

View File

@@ -75,10 +75,27 @@ if [[ "$DATABASE_URL" == *"localhost"* ]]; then
# Set password
sudo -u postgres psql -c "ALTER USER postgres WITH PASSWORD 'homeassistant';"
# Create database if does not exist
echo "CREATE DATABASE linkwarden; GRANT ALL PRIVILEGES ON DATABASE linkwarden to postgres;
# Create database if does not exist (UTF8 is required for the ICU collations used by Linkwarden migrations)
echo "CREATE DATABASE linkwarden TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C'; GRANT ALL PRIVILEGES ON DATABASE linkwarden to postgres;
\q" > setup_postgres.sql
sudo -u postgres bash -c 'cat setup_postgres.sql | psql "postgres://postgres:homeassistant@localhost:5432"' || true
# Databases created by older versions are SQL_ASCII, where the "und-x-icu" collation fails (Prisma P3018/P3009)
# One-time conversion: copy into a new UTF8 database, keep the original as linkwarden_sql_ascii_backup
if [ "$(sudo -u postgres psql -tAc "SELECT pg_encoding_to_char(encoding) FROM pg_database WHERE datname='linkwarden'")" = "SQL_ASCII" ]; then
bashio::log.warning "Database linkwarden uses SQL_ASCII encoding, converting it to UTF8"
sudo -u postgres psql -v ON_ERROR_STOP=1 -c "DROP DATABASE IF EXISTS linkwarden_utf8;" \
-c "CREATE DATABASE linkwarden_utf8 TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'C';"
if sudo -u postgres bash -o pipefail -c 'pg_dump -d linkwarden | iconv -f UTF-8 -t UTF-8 | psql -q -v ON_ERROR_STOP=1 -d linkwarden_utf8 >/dev/null'; then
# Let Prisma re-apply the migration that failed on SQL_ASCII
sudo -u postgres psql -v ON_ERROR_STOP=1 -d linkwarden_utf8 -c "UPDATE \"_prisma_migrations\" SET rolled_back_at=NOW() WHERE migration_name='20260818000000_case_insensitive_name_sorting' AND finished_at IS NULL AND rolled_back_at IS NULL;"
sudo -u postgres psql -v ON_ERROR_STOP=1 -c "ALTER DATABASE linkwarden RENAME TO linkwarden_sql_ascii_backup; ALTER DATABASE linkwarden_utf8 RENAME TO linkwarden;"
bashio::log.info "Database converted to UTF8, original kept as linkwarden_sql_ascii_backup (once everything works, free the space with: sudo -u postgres psql -c 'DROP DATABASE linkwarden_sql_ascii_backup;')"
else
sudo -u postgres psql -c "DROP DATABASE IF EXISTS linkwarden_utf8;"
bashio::log.error "Conversion to UTF8 failed, the original database was left untouched"
fi
fi
fi
########################