Files
2026-08-29 19:33:43 +02:00

136 lines
4.2 KiB
Markdown

<!-- file: deltas/0.3.2/pre.005.md -->
<!-- version: 1 -->
# Delta `0.3.2-pre.005` — PostgreSQL connection + pool + TLS
## 1. Base
Base exacte : `0.3.2-pre.004-fix.001`, incluant l'ajustement opérateur de `.env.example` version `13`.
Le gate opérateur du 29 août 2026 est entièrement vert : audits Rust/Markdown, workspace check/Clippy, 126 tests Config, ownership, Store avec et sans feature PostgreSQL, compilation `--no-default-features` et Config Desk passent.
## 2. Objet
Matérialiser la première ouverture PostgreSQL physique sans ouvrir encore les migrations ou le SQL métier :
```text
tokio-postgres 0.7.18+
deadpool-postgres 0.14.x
tokio-postgres-rustls 0.14.x
rustls 0.23.x / AWS-LC
roots système
pool borné
Store::open physique
Store::close borné
```
## 3. Frontière façade/backend
`ksp-store-lib` reste l'unique surface consumer et ne dépend directement d'aucun driver/pool/TLS. Il convertit ses settings vers un bridge `ksp-store-postgres-lib`, puis mappe les erreurs backend vers des `ErrorCode` Store stables.
`ksp-store-postgres-lib` possède seul :
```text
parse/normalisation tokio_postgres::Config
Deadpool Manager/Pool
connector Rustls
roots système
première acquisition physique
fermeture/drain physique
```
Les types physiques `Pool`, `Client`, `Row` et `Statement` ne sont jamais réexportés par la façade.
## 4. Normalisation de l'URI
Le backend consomme uniquement l'URI déjà résolue par Config. Après parsing, KSP impose :
```text
application_name = ksp-store
connect_timeout = settings typés
sslnegotiation = postgres
Disabled -> sslmode=disable
VerifyFull -> sslmode=require
```
`options=` est rejeté dans cette fondation. `VerifyFull` exige un host TCP afin de disposer d'une identité serveur à vérifier : `hostaddr` seul et les sockets Unix sont rejetés. Les erreurs de parsing ne conservent jamais le texte de l'URI.
## 5. Pool et lifecycle
Le pool applique les limites validées en `pre.003` : taille maximale et deadlines `wait/create/recycle`. Le manager utilise `RecyclingMethod::Verified`; la requête de vérification éventuelle reste interne à Deadpool et aucun SQL KSP n'est ajouté.
La création du pool est lazy, donc `Store::open` exécute explicitement une première `pool.get().await`. Le succès signifie ainsi qu'une connexion physique/auth/TLS a réellement été établie.
`Store::close(self)` appelle `Pool::close()` puis attend un drain `size == 0` sous `shutdown_timeout`. `Drop` ne fait qu'un close best-effort.
## 6. TLS
Modes exacts :
```text
Disabled
VerifyFull
```
`VerifyFull` charge les roots système dans `rustls::RootCertStore`, utilise explicitement le provider AWS-LC et conserve la vérification standard de certificat + identité serveur. Aucun mode `Prefer`, aucun verifier permissif et aucun fallback plaintext ne sont introduits.
## 7. Erreurs sûres
Le backend retourne uniquement une classification et une phase statique :
```text
ConfigInvalid
ConnectFailed
PoolTimeout
ShutdownTimeout
TlsFailed
```
La façade mappe vers :
```text
store.postgres_config_invalid
store.postgres_connect_failed
store.postgres_pool_timeout
store.postgres_tls_failed
store.shutdown_timeout
```
Aucune erreur `tokio-postgres`, Deadpool, Rustls ou native-certs n'est attachée comme source publique.
## 8. Hors scope
```text
migrations/bootstrap SQL
ksp_store_schema_migrations
health snapshot public
RAW transaction/account persistence
routing multi-target/multi-réseau dans Store
live PostgreSQL integration test
```
Ces éléments restent respectivement aux tranches `pre.006`, `pre.007`, `0.3.3/0.3.4` et `pre.008`.
## 9. Version
```text
workspace.package.version = 0.3.2-pre.5
```
## 10. Gate opérateur requis
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.3.2
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-store-postgres-lib
cargo test -p ksp-store-lib
cargo test -p ksp-store-lib --no-default-features
cargo check -p ksp-store-lib --no-default-features
cargo tree -p ksp-store-postgres-lib --edges normal
cargo tree -p ksp-store-lib --edges normal
cargo tree --duplicates
```