42.4. Formats de message

Cette section décrit le format détaille pour chaque message. Chaque message est marqué pour indiquer qu'il pourrait être envoyé par un client (F pour Frontend), un serveur (B pour Backend) ou les deux (F & B). Notez que bien que chaque message inclut un nombre d'octets au début, le format du message est défini de façon à ce que la fin du message peut se trouver sans référence au nombre d'octets. Ceci aide la vérification de la validité. (Le message CopyData est une exception car il forme une partie du flux de données ; le contenu de chaque message CopyData individuel pourrait ne pas être interprétable en eux-même.)

AuthenticationOk (B)

Byte1('R')

Identifie le message comme demande d'authentification.

Int32(8)

Longueur du contenu du message en octets, incluant lui-même.

Int32(0)

Spécifie que l'authentification a été réussie.

AuthenticationKerberosV4 (B)

Byte1('R')

Identifie le message comme une demande d'authentification.

Int32(8)

Longueur du contenu du message, incluant lui-même.

Int32(1)

Spécifie que l'authentification Kerberos V4 est requise.

AuthenticationKerberosV5 (B)

Byte1('R')

Identifie le message comme demande d'authentification.

Int32(8)

Longueur du contenu du message en octets, incluant lui-même.

Int32(2)

Spécifie que l'authentification Kerberos V5 est requise.

AuthenticationCleartextPassword (B)

Byte1('R')

Identifie le message comme demande d'authentification.

Int32(8)

Longueur du contenu des messages en octets, incluant lui-même.

Int32(3)

Spécifie qu'un mot de passe en clair est requis.

AuthenticationCryptPassword (B)

Byte1('R')

Identifie le message comme une demande d'authentification.

Int32(10)

Longueur du contenu du message en octets, incluant lui-même.

Int32(4)

Spécifie que le mot de passe crypté via crypt() est requis.

Byte2

Le composant (salt) pour utiliser lors du cryptage du mot de passe.

AuthenticationMD5Password (B)

Byte1('R')

Identifie le message comme une demande d'authentification.

Int32(12)

Longueur du contenu d'un message en octets, incluant lui-même.

Int32(5)

Spécifie qu'un mot de passe crypté MD5 est requis.

Byte4

Le composant (salt) à utiliser lors du cryptage du mot de passe.

AuthenticationSCMCredential (B)

Byte1('R')

Identifie le message comme demande d'authentification.

Int32(8)

Longueur du contenu du message en octets, incluant lui-même.

Int32(6)

Spécifie qu'un message crédentiel SCM est requis.

BackendKeyData (B)

Byte1('K')

Identifie le message comme une donnée clé d'annulation. Le client doit sauvegarder ces valeurs si il souhaite être capable de lancer des messages CancelRequest plus tard.

Int32(12)

Longueur du contenu du message en octets, incluant lui-même.

Int32

L'ID du processus de ce serveur.

Int32

La clé secrète de ce serveur.

Bind (F)

Byte1('B')

Identifie le message comme une commande Bind.

Int32

Longueur du contenu du message en octets, incluant lui-même.

String

Le nom du portail de destination (une chaîne vide sélectionne le portail sans nom).

String

Le nom de l'instruction source préparée (une chaîne vide sélectionne l'instruction préparée sans nom).

Int16

Le nombre de codes de format de paramètres qui suivent (dénotés C ci-dessous). Ceci peut être un 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 une, auquel cas le code de format spécifié est appliqué à tous les paramètres ; ou il peut être égal au nombre actuel des paramètres.

Int16[C]

Les codes de format du paramètre. Tous doivent être exactement de zéro (texte) ou un (binaire).

Int16

Le nombre de valeurs en paramètre qui suivent (zéro à priori). Ceci doit correspondre au nombre de paramètres nécessaires par la requête.

Ensuite, la paire de champs suivante apparaît dans chaque paramètre :

Int32

La longueur de la valeur du paramètre, en octets (ce nombre ne s'inclut pas lui-même). Peut valoir zéro. Dans un cas spécial, -1 indique une valeur de paramètre NULL. Aucun octet représentant une valeur suit le cas NULL.

Byten

La 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

Le nombre des codes de format des colonnes de résultat qui suivent (dénoté R ci-dessous). Ceci peut être zéro pour indiquer qu'il n'y a pas de colonnes de résultat ou que les colonnes de résultat devraient toujours utiliser le format par défaut (texte) ; ou une, auquel cas le code de format spécifié est appliqué à toutes les colonnes de résultat (si c'est le cas) ; ou il peut valoir le nombre actuel de colonnes de résultat de la requête.

Int16[R]

Les codes de format des colonnes de résultat. Tous doivent être soit zéro (texte) soit un (binaire).

BindComplete (B)

Byte1('2')

Identifie le message comme un indicateur Bind.

Int32(4)

Longueur du contenu des message en octets, incluant lui-même.

CancelRequest (F)

Int32(16)

Longueur du contenu du message en octets, incluant lui-même.

Int32(80877102)

Le code d'annulation de 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 la confusion, ce code ne doit pas être le même qu'un numéro de version du protocole.)

Int32

L'ID du processus du serveur cible.

Int32

La clé secrète pour le serveur cible.

Close (F)

Byte1('C')

Identifie le message en tant que commande Close.

Int32

Longueur du contenu du message en octets, incluant lui-même.

Byte1

'S' pour fermer une instruction préparée ; ou 'P' pour fermer un portail.

String

Le nom de l'instruction préparée ou du portail à fermer (une chaîne vide sélectionne l'instruction préparée sans nom ou le portail).

CloseComplete (B)

Byte1('3')

Identifie le message comme un indicateur de fin du Close.

Int32(4)

Longueur du contenu du message en octets, incluant lui-même.

CommandComplete (B)

Byte1('C')

Identifie le message comme une réponse de fin de commande.

Int32

Longueur du contenu du message en octets, incluant lui-même.

String

La balise de la commande. Ceci est un simple mot qui identifie quelle commande SQL est terminée.

Pour une commande INSERT, la balise est INSERT oid lignes où les lignes est le nombre de lignes insérées. oid est l'ID de l'objet d'une ligne insérée si lignes est 1 et que la table cible a des OIDs ; sinon oid vaut 0.

Pour une commande DELETE, la balise est DELETE ligneslignes est le nombre de lignes supprimées.

Pour une commande UPDATE, la balise est UPDATE ligneslignes est le nombre de lignes mises à jour.

Pour une commande MOVE, la balise est MOVE ligneslignes est le nombre de lignes où la position du curseur a été modifiée.

Pour une commande FETCH, la balise est FETCH ligneslignes est le nombre de lignes qui a été récupéré à partir du curseur.

CopyData (F & B)

Byte1('d')

Identifie le message comme données du COPY.

Int32

Longueur du contenu du message en octets, incluant lui-même.

Byten

Les données qui forment une partie d'un flux de données COPY. Les messages envoyées à partir du serveur correspondront toujours aux lignes de données mais les messages envoyés par les clients pourraient diviser le flux de données de façon arbitraire.

CopyDone (F & B)

Byte1('c')

Identifie le message comme un indicateur de fin de COPY.

Int32(4)

Longueur du contenu du message en octets, incluant lui-même.

CopyFail (F)

Byte1('f')

Identifie le message comme un indicateur en tant qu' échec de COPY.

Int32

Longueur du contenu du message en octets, incluant lui-même.

String

Un message d'erreur à rapporter comme cause d'un échec.

CopyInResponse (B)

Byte1('G')

Identifie le message comme une réponse de Start Copy In. Le client doit maintenant envoyer des données de copie (si non préparé pour faire cela, envoyez un message CopyFail).

Int32

Longueur du contenu du message en octets, incluant lui-même.

Int8

0 indique que le format de COPY complet est textuel (les lignes séparées par des retours chariot, des 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

Le nombre de colonnes dans les données à copier (dénotées N ci-dessous).

Int16[N]

Les codes de format à utiliser pour chaque colonne. Chacun doit être réellement zéro (texte) ou un (binaire). Tous doivent être zéro si le format de copie complet est de type texte.

CopyOutResponse (B)

Byte1('H')

Identifie le message comme une réponse Start Copy Out. Ce message sera suivi par des données copy-out.

Int32

La longueur du contenu du message en octets, incluant lui-même.

Int8

0 indique 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

Le nombre de colonnes de données à copier (dénotées N ci-dessous).

Int16[N]

Les codes de format à utiliser pour chaque colonne. Chacun doit être soit zéro (texte) ou un (binaire). Tous doivent être zéro si le format de copie complet est de type texte.

DataRow (B)

Byte1('D')

Identifie le message comme une ligne de données.

Int32

Longueur du message en octets, incluant lui-même.

Int16

Le nombre de valeurs de colonnes qui suivent (peut valoir zéro).

Ensuite, la paire de champs suivante apparaît pour chaque colonne :

Int32

La longueur de la valeur de la colonne, en octets (ce nombre ne s'inclut pas lui-même). Peut valoir zéro. Comme cas spécial, -A indique une valeur NULL dans la colonne. Aucun octet de valeur ne suit dans la cas d'un NULL.

Byten

La valeur de la colonne dans le format indiqué par le code de format associé. n est la longueur ci-dessus.

Describe (F)

Byte1('D')

Identifie le message comme une commande Describe.

Int32

Longueur du message en octets, incluant lui-même.

Byte1

'S' pour décrire une instruction préparée ; ou 'P' pour décrire un portail.

String

Le nom de l'instruction préparée ou du portail à décrire (une chaîne vide sélectionne l'instruction préparée sans nom ou le portail).

EmptyQueryResponse (B)

Byte1('I')

Identifie le message commme une réponse à une chaîne de requête vide string. (Ceci est un substitue à CommandComplete.)

Int32(4)

Longueur du message en octets, incluant lui-même.

ErrorResponse (B)

Byte1('E')

Identifie le message comme une erreur.

Int32

Longueur du message en octets, incluant lui-même.

Le corps du message consiste de un ou plus de champs identifiés, suivis par un octet zéro comme terminateur. Les champs pourraient apparaître dans n'importe quel ordre. Pour chaque champ, il y a ce qui suit :

Byte1

Un 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 42.5. Comme des types de champs pourraient être ajoutés dans le futur, les clients devraient ignorer silencieusement de type non reconnus.

String

La valeur du champ.

Execute (F)

Byte1('E')

Identifie le message comme une commande Execute.

Int32

Longueur du message en octets, incluant lui-même.

String

Le nom du portail à exécuter (une chaîne vide sélectionne le portail sans nom).

Int32

Nombre maximum de lignes à renvoyer, si le portail contient une requête qui renvoie des lignes (ignoré sinon). Zéro signifie << aucune limite >>.

Flush (F)

Byte1('H')

Identifie le message comme une commande Flush.

Int32(4)

Longueur du message en octets, incluant lui-même.

FunctionCall (F)

Byte1('F')

Identifie le message comme un appel de fonction.

Int32

Longueur du message en octets, incluant lui-même.

Int32

Spécifie l'ID de l'objet représentant la fonction à appeller.

Int16

Le nombre de codes de format de l'argument qui suivent (dénoté C ci-dessous). Cela peut être zéro pour indiquer qu'il n'y a pas d'arguments our que tous les arguments utilisent le format par défaut (texte) ; ou un, auquel cas le code de format est appliqué à tous les arguments ; ou il peut valoir le nombre réel d'arguments.

Int16[C]

Les codes de format d'argument. Chacun doit être soit zéro (texte) soit un (binaire).

Int16

Spécifie le nombre d'arguments fournis à la fonction.

Ensuite, la paire de champs suivante apparaît pour chaque argument :

Int32

La longueur de la valeur de l'argument en octets (ce nombre ne s'inclut pas lui-même). Peut valoir zéro. Comme cas spécial, -1 indique une valeur NULL de l'argument. Aucun octet de valeur ne suit dans le cas NULL.

Byten

La 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

Le code du format pour le résultat de la fonction. Doit être soit zéro (texte) soit un (binaire).

FunctionCallResponse (B)

Byte1('V')

Identifie le message comme le résultat d'un appel de fonction.

Int32

Longueur du message en octets, incluant lui-même.

Int32

La longueur de la valeur du résultat de la fonction, en octets (ce nombre ne s'inclut pas lui-même). Peut valoir zéro. Comme cas spécial, -1 indique NULL comme résultat d'une fonction. Aucun octet de valeur ne suit dans ce cas.

Byten

La 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')

Identifie le message comme un indicateur d'absence de données.

Int32(4)

Longueur du message en octets, incluant lui-même.

NoticeResponse (B)

Byte1('N')

Identifie le message comme un avertissement.

Int32

Longueur du message en octets, incluant lui-même.

Le corps du message consiste en un ou plusieurs champs identifiés, suivis par un octet zéro comme terminateur. Les champs pourraient apparaître dans n'importe quel ordre. Pour chaque champ, il existe ce qui suit :

Byte1

Un 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 42.5. Comme plus de types de champs pourraient être ajoutés dans le futur, les clients devraient ignorer silencieusement les champs de type non reconnus.

String

La valeur du champ.

NotificationResponse (B)

Byte1('A')

Identifie le message comme une réponse de notification.

Int32

Longueur du message en octets, incluant lui-même.

Int32

L'ID du processus serveur ayant lancé la notification.

String

Le nom de la condition qui a lancé la notification.

String

Une information supplémentaire à partir du processus de notification. (Actuellement, cette fonctionnalité n'est pas implémentée donc le champ est toujours une chaîne vide.)

ParameterDescription (B)

Byte1('t')

Identifie le message comme description du paramètre.

Int32

Longueur du message en octets, incluant lui-même.

Int16

Le nombre de paramètres utilisé par l'instruction (pourrait valoir zéro).

Ensuite, pour chaque paramètre, voici ce qui suit :

Int32

Spécifie l'ID de l'objet du type de données du paramètre.

ParameterStatus (B)

Byte1('S')

Identifie le message comme un rapport de statut du paramètre en exécution.

Int32

Longueur du message en octets, incluant lui-même.

String

Le nom du paramètre en exécution en cours de rapport.

String

La valeur actuelle du paramètre.

Parse (F)

Byte1('P')

Identifie le message comme une commande Parse.

Int32

Longueur du message en octets, incluant lui-même.

String

Le nom de l'instruction préparée de destination (une chaîne vide sélectionne l'instruction préparée sans nom).

String

La chaîne de requête à analyser.

Int16

Le nombre de types de données en paramètre spécifié (pourrait valoir zéro). Notez que ceci n'est pas une indication du nombre de paramètres qui pourrait apparaître dans la chaîne de requête, seulement le nombre que le client veut pour les types pré-spécifiés.

Ensuite, pour chaque paramètre, voici ce qui suit :

Int32

Spécifie l'ID de l'objet du type de données en paramètre. Placer un zéro ici est équivalent à laisser le type non spécifié.

ParseComplete (B)

Byte1('1')

Identifie le message comme un indicateur de fin de Parse.

Int32(4)

Longueur du message en octets, incluant lui-même.

PasswordMessage (F)

Byte1('p')

Identifie le message comme une réponse de mot de passe.

Int32

Longueur du message en octets, incluant lui-même.

String

Le mot de passe (crypté si nécessaire).

PortalSuspended (B)

Byte1('s')

Identifie le message comme une indicateur de suspension du portail. Notez que ceci apparaît seulement si la limite du nombre de lignes d'un message Execute a été atteint.

Int32(4)

Longueur du message en octets, incluant lui-même.

Query (F)

Byte1('Q')

Identifie le message comme une simple requête.

Int32

Longueur du message en octets, incluant lui-même.

String

La chaîne de requête lui-même.

ReadyForQuery (B)

Byte1('Z')

Identifie le type de message. ReadyForQuery est envoyé quand le serveur est prêt pour un nouveau cycle de requêtes.

Int32(5)

Longueur du message en octets, incluant lui-même.

Byte1

Indicateur de l'état actuel de la transaction du serveur. Les valeurs possibles sont 'I' si en pause (pas dans un bloc de transaction) ; 'T' si dans un bloc de transaction ; ou 'E' dans un bloc de transaction échouée (les requêtes seront réjetées une fois le bloc terminé).

RowDescription (B)

Byte1('T')

Identifie le message comme une description de ligne.

Int32

Longueur du message en octets, incluant lui-même.

Int16

Spécifie le nombre de champs dans une ligne (pourrait valoir zéro).

Ensuite, pour chaque champ, voici ce qui suit :

String

Le nom du champ.

Int32

Si le champ peut être identifié comme une colone d'une table spécifique, l'ID de l'objet de la table ; sinon zéro.

Int16

Si le champ peut être identifié comme une colonne d'une table spécifique, le numéro d'attribut de la colonne ; sinon zéro.

Int32

L'ID de l'objet du type de données du champ.

Int16

La taille du type de données (voir pg_type.typlen). Notez que les valeurs négatives dénotent des types de largeur variable.

Int32

Le modifieur de type (voir pg_attribute.atttypmod). La signification du modifieur est spécifique au type.

Int16

Le code de format en cours d'utilisation pour le champ. Actuellement, sera zéro (texte) ou un (binaire). Dans un RowDescription renvoyé à partir de la variante de l'instruction de Describe, le code du format n'est pas encore connu et sera toujours zéro.

SSLRequest (F)

Int32(8)

Longueur du message en octets, incluant lui-même.

Int32(80877103)

Le 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 la confusion, ce code ne doit pas être le même que celui du numéro de version du protocole.)

StartupMessage (F)

Int32

Longueur du message en octets, incluant lui-même.

Int32(196608)

Le numéro de version du protocole. Les 16 bits les plus significatifs sont le numéro de version majeure (3 pour le protocole décrit ici). Les 16 bits les moins significatifs sont le numéro de version mineure (0 pour le protocole décrit ici).

Le numéro de version du protocole est suivi par une ou plusieurs paires de nom de paramètre ou de chaînes de valeur. Un octet zéro est requis comme un terminateur après la dernière paire nom/valeur. Les paramètres peuvent apparaître dans n'importe quel ordre. user est requis, les autres sont en option. Chaque paramètre est spécifié comme :

String

Le nom du paramètre. Les noms actuellement reconnus sont :

user

Le nom de l'utilisateur de la base de données pour se connecter. Requis ; il n'y a pas de valeur par défaut.

database

La base de données où se connecter. Par défaut le nom de l'utilisateur.

options

Arguments en ligne de commande pour le serveur. (Ceci est obsolète en faveur des paramètres individuels en exécution.)

En plus de ce qui est au-dessus, tout paramètre en exécution qui peut être initialisé au lancement du serveur pourrait être listé. Ces paramètres seront appliqués lors du lancement du serveur (après analyse des options en ligne de commande s'il y en a). Les valeurs agiront comme valeurs par défaut de la session.

String

La valeur du paramètre.

Sync (F)

Byte1('S')

Identifie le message comme une commande Sync.

Int32(4)

Longueur du message en octets, incluant lui-même.

Terminate (F)

Byte1('X')

Identifie le message comme une fin.

Int32(4)

Longueur du message en octets, incluant lui-même.