44.6. Résumé des modifications depuis le protocole 2.0
Cette section fournit une liste rapide des modifications à
l'attention des développeurs essayant d'adapter au protocole 3.0 des
bibliothèques clientes existantes.
Le paquet de démarrage initial utilise un format flexible de liste de
chaînes au lieu d'un format fixe. Les valeurs de session par défaut
des paramètres d'exécution peuvent même être spécifiées directement
dans le paquet de démarrage (en fait, cela était déjà possible en
utilisant le champ options ; mais étant
donné la largeur limitée d'options et
l'impossibilité de mettre entre guillemets les espaces fines dans les
valeurs, ce n'était pas une technique très sûre).
Tous les messages possèdent désormais une indication de longueur qui
suit immédiatement l'octet du type de message (sauf pour les paquets
de démarrage qui n'ont pas d'octet de type). PasswordMessage possède
à présent un octet de type.
Les messages ErrorResponse et NoticeResponse ('e' et 'n') contiennent
maintenant plusieurs champs, à partir desquels le code client peut
assembler un message d'erreur fonction du niveau de verbiage désiré.
Des champs individuels ne se termineront plus par un retour chariot
alors que la chaîne seule envoyée dans l'ancien protocole le faisait
systématiquement.
Le message ReadyForQuery ('z') inclut un
indicateur d'état de la transaction.
La distinction entre les types de messages BinaryRow et DataRow est
supprimée ; le type de message DataRow seul sert à retourner les
données dans tous les formats. La disposition de DataRow a changé
pour faciliter son analyse. La représentation des valeurs binaires a
également été modifiée : elle n'est plus liée directement à la
représentation interne du serveur.
Il existe un nouveau sous-protocole pour les « requêtes étendues » qui ajoute les types de
messages client Parse, Bind, Execute, Describe, Close, Flush et Sync
et les types de messages serveur ParseComplete, BindComplete,
PortalSuspended, ParameterDescription, NoData et CloseComplete. Les
clients existants ne sont pas directement concernés par ce
sous-protocole, mais son utilisation apportera des améliorations en
terme de performances et de fonctionnalités.
Les données de
copy
sont désormais encapsulées dans des messages CopyData et CopyDone. Il
y a une façon bien définie de réparer les erreurs lors du
copy
. la dernière ligne
spéciale «
\.
» n'est plus nécessaire et n'est pas
envoyée lors de
copy
out
(elle est toujours reconnue comme un indicateur
de fin lors du
copy in
mais son utilisation est obsolète. Elle sera éventuellement
supprimée). Le
copy
binaire est supporté. les messages copyinresponse et CopyOutResponse
incluent les champs indiquant le nombre de colonnes et le format de
chaque colonne.
La disposition des messages FunctionCall et FunctionCallResponse a
changé. FunctionCall supporte à présent le passage aux fonctions
d'arguments NULL. Il peut aussi gérer le passage de paramètres et la
récupération de résultats aux formats texte et binaire. Il n'y a plus
aucune raison de considérer FunctionCall comme une faille potentielle
de sécurité car il n'offre plus d'accès direct aux représentations
internes des données du serveur.
Le serveur envoie des messages ParameterStatus ('s') lors de l'initialisation de la connexion pour tous
les paramètres qu'il considère intéressants pour la bibliothèque
client. En conséquence, un message ParameterStatus est envoyé à
chaque fois que la valeur active d'un de ces paramètres change.
Le message RowDescription ('t') contient les
nouveaux champs oid de table et de numéro de colonne pour chaque
colonne de la ligne décrite. Il affiche aussi le code de format pour
chaque colonne.
Le message CursorResponse ('p') n'est plus
engendré par le serveur.
Le message NotificationResponse ('a') a un
champ de type chaîne supplémentaire, actuellement vide mais qui
pourrait à terme transporter des données supplémentaires engendrées
par l'émetteur de l'événement
notify
.
Le message EmptyQueryResponse ('i')
nécessitait un paramètre chaîne vide ; ce n'est plus le cas.