44.4. Formats de message
Cette section décrit le format détaillé de chaque message. Chaque
message est marqué pour indiquer s'il peut être envoyé par un client
(F pour
frontend
), un serveur (B pour
backend
) ou les deux (F & B). bien
que chaque message commence par son nombre d'octets, le format du
message est défini de telle sorte que la fin du message puisse être
trouvée sans ce nombre. Cela contribue à la vérification de la
validité. Le message CopyData est une exception car il constitue une
partie du flux de données ; le contenu d'un message CopyData
individuel n'est, en soi, pas interprétable.
-
AuthenticationOk (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(8)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(0)
-
L'authentification a réussi.
-
AuthenticationKerberosV5 (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(8)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(2)
-
Une authentification Kerberos V5 est requise.
-
AuthenticationCleartextPassword (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(8)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(3)
-
Un mot de passe en clair est requis.
-
AuthenticationCryptPassword (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(10)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(4)
-
Un mot de passe chiffré à l'aide de crypt() est requis.
-
Byte2
-
Composant (salt) à utiliser lors du chiffrement du mot de
passe.
-
AuthenticationMD5Password (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(12)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(5)
-
Un mot de passe chiffré par MD5 est requis.
-
Byte4
-
Composant (salt) à utiliser lors du chiffrement du mot de
passe.
-
AuthenticationSCMCredential (B)
-
-
Byte1('R')
-
Marqueur de demande d'authentification.
-
Int32(8)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(6)
-
Un message d'accréditation SCM est requis.
-
BackendKeyData (B)
-
-
Byte1('K')
-
Marqueur de clé d'annulation. Le client doit sauvegarder
ces valeurs s'il souhaite initier des messages
CancelRequest par la suite.
-
Int32(12)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32
-
ID du processus du serveur concerné.
-
Int32
-
Clé secrète du serveur concerné.
-
Bind (F)
-
-
Byte1('B')
-
Marqueur de commande Bind.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Nom du portail de destination (une chaîne vide
sélectionne le portail non-nommé).
-
String
-
Nom de l'instruction source préparée (une chaîne vide
sélectionne l'instruction préparée non-nommée).
-
Int16
-
Nombre de codes de format de paramètres qui suivent
(notés
c
ci-dessous). peut valoir zéro pour indiquer qu'il n'y a
aucun paramètre ou que tous les paramètres utilisent le
format par défaut (texte) ; ou un, auquel cas le code de
format spécifié est appliqué à tous les paramètres ; il
peut aussi être égal au nombre courant de paramètres.
-
Int16[
c
]
-
Codes de format des paramètres. Tous doivent valoir zéro
(texte) ou un (binaire).
-
Int16
-
Nombre de valeurs de paramètres qui suivent (peut valoir
zéro). Cela doit correspondre au nombre de paramètres
nécessaires à la requête.
Puis, le couple de champs suivant apparaît pour chaque
paramètre : paramètre :
-
Int32
-
Taille de la valeur du paramètre, en octets (ce nombre
n'inclut pas la longueur elle-même). Peut valoir zéro.
Traité comme un cas spécial, -1 indique une valeur de
paramètre NULL. Aucun octet de valeur ne suit le cas
NULL.
-
Byte
n
-
Valeur du paramètre, dans le format indiqué par le code
de format associé.
n
est la longueur ci-dessus.
Après le dernier paramètre, les champs suivants apparaissent :
-
Int16
-
Nombre de codes de format des colonnes de résultat qui
suivent (noté
r
ci-dessous). peut valoir zéro pour indiquer qu'il n'y a
pas de colonnes de résultat ou que les colonnes de
résultat utilisent le format par défaut (texte) ; ou une,
auquel cas le code de format spécifié est appliqué à
toutes les colonnes de résultat (s'il y en a) ; il peut
aussi être égal au nombre de colonnes de résultat de la
requête.
-
Int16[
r
]
-
Codes de format des colonnes de résultat. Tous doivent
valoir zéro (texte) ou un (binaire).
-
BindComplete (B)
-
-
Byte1('2')
-
Indicateur de Bind complet.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
CancelRequest (F)
-
-
Int32(16)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(80877102)
-
Code d'annulation de la requête. La valeur est choisie
pour contenir 1234 dans les 16
bits les plus significatifs et 5678 dans les 16 bits les moins
significatifs (pour éviter toute confusion, ce code ne
doit pas être le même qu'un numéro de version de
protocole).
-
Int32
-
ID du processus du serveur cible.
-
Int32
-
Clé secrète du serveur cible.
-
Close (F)
-
-
Byte1('C')
-
Marqueur de commande Close.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Byte1
-
's' pour fermer une instruction
préparée ; ou 'p' pour fermer un
portail.
-
String
-
Nom de l'instruction préparée ou du portail à fermer (une
chaîne vide sélectionne l'instruction préparée ou le
portail non-nommé(e)).
-
CloseComplete (B)
-
-
Byte1('3')
-
Indicateur de complétude de Close.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
CommandComplete (B)
-
-
Byte1('C')
-
Marqueur de réponse de complétude de commande.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Balise de la commande. Mot simple identifiant la commande
SQL terminée.
Pour une commande
insert
, la balise est
insert
oid
lignes
où
lignes
est le nombre de
lignes insérées.
oid
est l'id de l'objet de la
ligne insérée si
lignes
vaut 1 et que la table
cible a des OID ; sinon
oid
vaut 0.
Pour une commande
delete
, la balise est
delete
lignes
où
lignes
est le nombre de
lignes supprimées.
Pour une commande
update
, la balise est
update
lignes
où
lignes
est le nombre de
lignes mises à jour.
Pour une commande
move
, la balise est
move
lignes
où
lignes
est le nombre de
lignes de déplacement du curseur.
Pour une commande
fetch
, la balise est
fetch
lignes
où
lignes
est le nombre de
lignes récupérées à partir du curseur.
-
CopyData (F & B)
-
-
Byte1('d')
-
Marqueur de données de COPY.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Byte
n
-
Données formant une partie d'un flux de données
copy
. les
messages envoyés depuis le serveur correspondront
toujours à des lignes uniques de données, mais les
messages envoyés par les clients peuvent diviser le flux
de données de façon arbitraire.
-
CopyDone (F & B)
-
-
Byte1('c')
-
Indicateur de fin de COPY.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
CopyFail (F)
-
-
Byte1('f')
-
Indicateur d'échec de COPY.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Message d'erreur rapportant la cause d'un échec.
-
CopyInResponse (B)
-
-
Byte1('G')
-
Marqueur de réponse de Start Copy In. Le client doit
alors envoyer des données de copie (s'il n'est pas à
cela, il enverra un message CopyFail).
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int8
-
0 indique que le format de copie complet est textuel
(lignes séparées par des retours chariot, colonnes
séparées par des caractères de séparation, etc). 1
indique que le format de copie complet est binaire
(similaire au format DataRow). Voir COPY pour plus
d'informations.
-
Int16
-
Nombre de colonnes dans les données à copier (noté
n
ci-dessous).
-
Int16[
n
]
-
Codes de format à utiliser pour chaque colonne. Chacun
doit valoir zéro (texte) ou un (binaire). Tous doivent
valoir zéro si le format de copie complet est de type
texte.
-
CopyOutResponse (B)
-
-
Byte1('H')
-
Marqueur de réponse Start Copy Out. Ce message sera suivi
de données copy-out.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int8
-
0 indique que le format de copie complet est textuel
(lignes séparées par des retours chariots, colonnes
séparées par des caractères séparateur, etc). 1 indique
que le format de copie complet est binaire (similaire au
format DataRow). Voir COPY pour plus
d'informations.
-
Int16
-
Nombre de colonnes de données à copier (noté
n
ci-dessous).
-
Int16[
n
]
-
Codes de format à utiliser pour chaque colonne. Chaque
code doit valoir zéro (texte) ou un (binaire). Tous
doivent valoir zéro si le format de copie complet est de
type texte.
-
DataRow (B)
-
-
Byte1('D')
-
Marqueur de ligne de données.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int16
-
Nombre de valeurs de colonnes qui suivent (peut valoir
zéro).
Apparaît ensuite le couple de champs suivant, pour chaque
colonne :
-
Int32
-
Longueur de la valeur de la colonne, en octets (ce nombre
n'inclut pas la longueur elle-même). Peut valoir zéro.
Traité comme un cas spécial, -1 indique une valeur NULL
de colonne. Aucun octet de valeur ne suit le cas NULL.
-
Byte
n
-
Valeur de la colonne dans le format indiqué par le code
de format associé.
n
est la longueur ci-dessus.
-
Describe (F)
-
-
Byte1('D')
-
Marqueur de commande Describe.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Byte1
-
's' pour décrire une instruction
préparée ; ou 'p' pour décrire
un portail.
-
String
-
Nom de l'instruction préparée ou du portail à décrire
(une chaîne vide sélectionne l'instruction préparée ou le
portail non-nommé(e)).
-
EmptyQueryResponse (B)
-
-
Byte1('I')
-
Marqueur de réponse à une chaîne de requête vide (c'est
un substitut de CommandComplete).
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
ErrorResponse (B)
-
-
Byte1('E')
-
Marqueur d'erreur.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
Le corps du message est constitué d'un ou plusieurs champs
identifié(s), suivi(s) d'un octet nul comme terminateur.
L'ordre des champs n'est pas fixé. Pour chaque champ, on trouve
les informations suivantes :
-
Byte1
-
Code identifiant le type de champ ; s'il vaut zéro, c'est
la fin du message et aucune chaîne ne suit. Les types de
champs définis sont listés dans
Section 44.5, « Champs des messages d'erreur et
d'avertissement ». de nouveaux types de champs
pourraient être ajoutés dans le futur, les clients
doivent donc ignorer silencieusement les types non
reconnus.
-
String
-
Valeur du champ.
-
Execute (F)
-
-
Byte1('E')
-
Marqueur de commande Execute.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Nom du portail à exécuter (une chaîne vide sélectionne le
portail non-nommé).
-
Int32
-
Nombre maximum de lignes à retourner si le portail
contient une requête retournant des lignes (ignoré
sinon). Zéro signifie « aucune
limite ».
-
Flush (F)
-
-
Byte1('H')
-
Marqueur de commande Flush.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
FunctionCall (F)
-
-
Byte1('F')
-
Marqueur d'appel de fonction.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32
-
Spécifie l'ID de l'objet représentant la fonction à
appeler.
-
Int16
-
Nombre de codes de format de l'argument qui suivent (noté
c
ci-dessous). cela
peut être zéro pour indiquer qu'il n'y a pas d'arguments
ou que tous les arguments utilisent le format par défaut
(texte) ; un, auquel cas le code de format est appliqué à
tous les arguments ; il peut aussi être égal au nombre
réel d'arguments.
-
Int16[
c
]
-
Les codes de format d'argument. Chacun doit valoir zéro
(texte) ou un (binaire).
-
Int16
-
Nombre d'arguments fournis à la fonction.
Apparaît ensuite, pour chaque argument, le couple de champs
suivant :
-
Int32
-
Longueur de la valeur de l'argument, en octets (ce nombre
n'inclut pas la longueur elle-même). Peut valoir zéro.
Traité comme un cas spécial, -1 indique une valeur NULL
de l'argument. Aucun octet de valeur ne suit le cas NULL.
-
Byte
n
-
Valeur de l'argument dans le format indiqué par le code
de format associé.
n
est la longueur ci-dessus.
Après le dernier argument, le champ suivant apparaît :
-
Int16
-
Code du format du résultat de la fonction. Doit valoir
zéro (texte) ou un (binaire).
-
FunctionCallResponse (B)
-
-
Byte1('V')
-
Marqueur de résultat d'un appel de fonction.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32
-
Longueur de la valeur du résultat de la fonction, en
octets (ce nombre n'inclut pas la longueur elle-même).
Peut valoir zéro. Traité comme un cas spécial, -1 indique
un résultat de fonction NULL. Aucun octet de valeur ne
suit le cas NULL.
-
Byte
n
-
Valeur du résultat de la fonction, dans le format indiqué
par le code de format associé.
n
est la longueur ci-dessus.
-
NoData (B)
-
-
Byte1('n')
-
Indicateur d'absence de données.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
NoticeResponse (B)
-
-
Byte1('N')
-
Marqueur d'avertissement.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
Le corps du message est constitué d'un ou plusieurs champs
identifié(s), suivi(s) d'un octet zéro comme terminateur.
L'ordre des champs n'est pas fixé. Pour chaque champ, on trouve
les informations suivantes :
-
Byte1
-
Code identifiant le type de champ ; s'il vaut zéro, c'est
la fin du message et aucune chaîne ne suit. Les types de
champs déjà définis sont listés dans
Section 44.5, « Champs des messages d'erreur et
d'avertissement ». de nouveaux types de champs
pourraient être ajoutés dans le futur, les clients
doivent donc ignorer silencieusement les champs de type
non reconnu.
-
String
-
Valeur du champ.
-
NotificationResponse (B)
-
-
Byte1('A')
-
Marqueur de réponse de notification.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32
-
ID du processus serveur ayant procédé à la notification.
-
String
-
Nom de la condition à l'origine de la notification.
-
String
-
Information supplémentaire provenant du processus à
l'origine de la notification (cette fonctionnalité n'est,
à ce jour, pas implantée, le champ est donc toujours
constitué d'une chaîne vide).
-
ParameterDescription (B)
-
-
Byte1('t')
-
Marqueur de description de paramètre.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int16
-
Nombre de paramètres utilisé par l'instruction (peut
valoir zéro).
Pour chaque paramètre, suivent :
-
Int32
-
ID de l'objet du type de données du paramètre.
-
ParameterStatus (B)
-
-
Byte1('S')
-
Marqueur de rapport d'état de paramètre d'exécution.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Nom du paramètre d'exécution dont le rapport est en
cours.
-
String
-
Valeur actuelle du paramètre.
-
Parse (F)
-
-
Byte1('P')
-
Marqueur de commande Parse.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Nom de l'instruction préparée de destination (une chaîne
vide sélectionne l'instruction préparée non-nommée).
-
String
-
Chaîne de requête à analyser.
-
Int16
-
Nombre de types de données de paramètre spécifiés (peut
valoir zéro). Ce n'est pas une indication du nombre de
paramètres pouvant apparaître dans la chaîne de requête,
mais simplement le nombre de paramètres pour lesquels le
client veut pré-spécifier les types.
Pour chaque paramètre, on trouve ensuite :
-
Int32
-
ID de l'objet du type de données du paramètre. la valeur
zéro équivaut à ne pas spécifier le type.
-
ParseComplete (B)
-
-
Byte1('1')
-
Indicateur de fin de Parse.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
PasswordMessage (F)
-
-
Byte1('p')
-
Marqueur de réponse de mot de passe.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
Mot de passe (chiffré à la demande).
-
PortalSuspended (B)
-
-
Byte1('s')
-
Indicateur de suspension du portail. Apparaît seulement
si la limite du nombre de lignes d'un message Execute a
été atteint.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
Query (F)
-
-
Byte1('Q')
-
Marqueur de requête simple.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
String
-
La chaîne de requête elle-même.
-
ReadyForQuery (B)
-
-
Byte1('Z')
-
Identifie le type du message. ReadyForQuery est envoyé à
chaque fois que le serveur est prêt pour un nouveau cycle
de requêtes.
-
Int32(5)
-
Taille du message en octets, y compris la taille
elle-même.
-
Byte1
-
Indicateur de l'état transactionnel du serveur. Les
valeurs possibles sont 'i' s'il
est en pause (en dehors d'un bloc de transaction) ;
't' s'il est dans un bloc de
transaction ; ou 'e' s'il est
dans un bloc de transaction échouée (les requêtes seront
réjetées jusqu'à la fin du bloc).
-
RowDescription (B)
-
-
Byte1('T')
-
Marqueur de description de ligne.
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int16
-
Nombre de champs dans une ligne (peut valoir zéro).
On trouve, ensuite, pour chaque champ :
-
String
-
Nom du champ.
-
Int32
-
Si le champ peut être identifié comme colonne d'une table
spécifique, l'ID de l'objet de la table ; sinon zéro.
-
Int16
-
Si le champ peut être identifié comme colonne d'une table
spécifique, le numéro d'attribut de la colonne ; sinon
zéro.
-
Int32
-
ID de l'objet du type de données du champ.
-
Int16
-
Taille du type de données (voir pg_type.typlen). Les valeurs négatives
indiquent des types de largeur variable.
-
Int32
-
Modificateur de type (voir pg_attribute.atttypmod). La signification
du modificateur est spécifique au type.
-
Int16
-
Code de format utilisé pour le champ. Zéro (texte) ou un
(binaire), à l'heure actuelle. Dans un RowDescription
retourné par la variante de l'instruction de Describe, le
code du format n'est pas encore connu et vaudra toujours
zéro.
-
SSLRequest (F)
-
-
Int32(8)
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(80877103)
-
Code de requête ssl.
la valeur est choisie pour contenir 1234 dans les 16 bits les plus
significatifs, et 5679 dans les
16 bits les moins significatifs (pour éviter toute
confusion, ce code ne doit pas être le même que celui
d'un numéro de version de protocole).
-
StartupMessage (F)
-
-
Int32
-
Taille du message en octets, y compris la taille
elle-même.
-
Int32(196608)
-
Numéro de version du protocole. Les 16 bits les plus
significatifs représentent le numéro de version majeure
(3 pour le protocole décrit ici). Les 16 bits les moins
significatifs représentent le numéro de version mineure
(0 pour le protocole décrit ici).
Le numéro de version du protocole est suivi par un ou plusieurs
couple(s) nom de paramètre et chaîne de valeur. Un octet zéro
est requis comme terminateur après le dernier couple
nom/valeur. L'ordre des paramètres n'est pas fixé. Le paramètre
user est requis, les autres sont
optionnels. Chaque paramètre est spécifié de la façon suivante
:
-
String
-
Nom du paramètre. Les noms actuellement reconnus sont :
-
user
-
Nom de l'utilisateur de base de données sous lequel
se connecter. Requis ; il n'y a pas de valeur par
défaut.
-
database
-
Base de données à laquelle se connecter. Par défaut
le nom de l'utilisateur.
-
options
-
Arguments en ligne de commande pour le serveur
(rendu obsolète par l'utilisation de paramètres
individuels d'exécution).
En plus de ce qui précède, tout paramètre d'exécution
pouvant être initialisé au démarrage du serveur peut être
listé. Ces paramètres seront appliqués au démarrage du
serveur (après analyse des options en ligne de commande,
s'il y en a). Leurs valeurs agiront comme valeurs de
session par défaut.
-
String
-
Valeur du paramètre.
-
Sync (F)
-
-
Byte1('S')
-
Marqueur de commande Sync.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
-
Terminate (F)
-
-
Byte1('X')
-
Marqueur de fin.
-
Int32(4)
-
Taille du message en octets, y compris la taille
elle-même.
|