API SQL Utilisateurs
Une API REST minimale reposant sur SQLite (ou PostgreSQL). Le pool de connexions à la base de données et le serveur HTTP sont tous deux déclarés comme modèles, initialisés une seule fois et partagés entre toutes les tracks de requêtes concurrentes.
Exécution
melodium run 03_sql_user_api/Compo.toml
# ou avec PostgreSQL :
melodium run 03_sql_user_api/Compo.toml --db_url postgres://user:pass@localhost/mydb$ curl http://127.0.0.1:8080/users
OK
$ curl -X POST http://127.0.0.1:8080/users -d '{"name":"Alice","email":"alice@example.com"}'
{"name":"Alice","email":"alice@example.com"}Fonctionnement
Deux modèles sont déclarés en tête de main :
model db: AppDb(db_url=db_url)
model server: HttpServer(host=|from_ipv4(|localhost_ipv4()), port=port)AppDb encapsule SqlPool avec un nombre de connexions min/max configurable. HttpServer accepte toutes les requêtes entrantes et les dispatch vers le sous-traitement ayant enregistré la route correspondante.
Séquence de démarrage
Les connexions dans main imposent un ordre de démarrage strict :
connect ouvre le pool. La source connected se déclenche dès que le pool est prêt, déclenchant createTable. Ce n’est qu’après createTable.done que le serveur HTTP démarre — garantissant que le schéma existe avant qu’une requête n’arrive.
Gestionnaires de routes
listUsers et echoCreate appellent chacun connection[http_server=server](method=…, route=…) pour enregistrer leur route. Ils s’exécutent de manière concurrente et indépendante — Mélodium crée automatiquement une nouvelle track pour chaque connexion entrante.
Le pattern bodyTrigger: trigger<byte>() convertit le flux Stream<byte> du corps entrant en un événement Block<void> de démarrage. Le statut, les en-têtes et le traitement du corps sont tous pilotés depuis ce signal unique en parallèle :
connection.data -> bodyTrigger.stream,start --> status.trigger,emit -> connection.status
bodyTrigger.start --------> headers.trigger,emit -> connection.headersLa --> (double flèche) est le fan-out : une sortie alimente deux entrées simultanément.
Dépendances
[dependencies]
std = "0.10.1" # flux de base, journalisation, structures de données
http = "0.10.1" # serveur et client HTTP
net = "0.10.1" # utilitaires d'adresses IP
json = "0.10.1" # parsing et sérialisation JSON
sql = "0.10.1" # pool de connexions SQL et requêtes
encoding = "0.10.1" # encodage / décodage UTF-8