Formatos de Mensajes

Esta seccion describe el formato detallado de cada mensaje. Cana uno puede ser enviado por un frontend (F), por un backend (B) o por ambos (F y B).

AsciiRow (B)

Byte1('D')

Identifica el mensaje como una fila de datos ASCII . (Un mensaje previo RowDescription define el número de campos en la fila y sus tipos de datos).

Byten

Un mapa de bits con un bit para cada campo en la fila. El primer campo corresponde al bit 7 (MSB) del primer byte, el segundo campo corresponde al bit 6 del primer byte, el octavo campo corresponde al bit 0 (LSB) del primer byte, el noveno campo corresponde al bit 7 del segundo byte, y así sucesivamente. Cada bit está activo si el valor del campo correspondiente no es NULL. Si el número de campos no es un múltiplo de 8, el resto del último byte en el mapa de bits no es utilizado.

Por lo tanto, para cada campo con un valor no NULL, tenemos lo siguiente:

Int32

Especifica el tamaño del valor del campo, incluyendo este tamaño.

Byten

Especifica el valor del campo mismo en caracteres ASCII. n es el anterior tamaño menos 4. No hay '\0' al final del campo de datos, el frontend debe añadirlo si quiere uno.

AuthenticationOk (B)

Byte1('R')

Identifica el mensaje como una petición de autentificación.

Int32(0)

Especifica que la autentificación tuvo éxito.

AuthenticationKerberosV4 (B)

Byte1('R')

Identifica el mensaje como una petición de autentificación.

Int32(1)

Especifica que se requiere autentificación Kerberos V4.

AuthenticationKerberosV5 (B)

Byte1('R')

Identifica el mensaje como una petición de autentificación.

Int32(2)

Especifica que se requiere autentificación Kerberos V5.

AuthenticationUnencryptedPassword (B)

Byte1('R')

Identifica el mensaje como una petición de autentificación.

Int32(3)

Especifica que se requiere una contraseña no encriptada.

AuthenticationEncryptedPassword (B)

Byte1('R')

Identifica el mensaje como una petición de autentificación.

Int32(4)

Especifica que se requiere una contraseña encriptada.

Byte2

El salto a utilizar al encriptar la contraseña.

BackendKeyData (B)

Byte1('K')

Identifica el mensaje como una clave de cancelación. El frontend debe guardar estos valore se desea poder enviar mensajes CancelRequest posteriormente.

Int32

El ID de proceso del backend.

Int32

La clave secreta de este backend.

BinaryRow (B)

Byte1('B')

Identifica el mensaje como una fila de datos binarios. (Un mensaje RowDescription previo define el número de campos en la fial y sus tipos de datos)

Byten

Un mapa de bits con un bit para cada campo en la fila. El primer campo corresponde al bit 7 (MSB) del primer byte, el segundo campo corresponde al bit 6 del primer byte, el octavo campo corresponde al bit 0 (LSB) del primer byte, el noveno campo corresponde al bit 7 del segundo byte, y así sucesivamente. Cada bit está activo si el valor del campo correspondiente no es NULL. Si el número de campos no es un múltiplo de 8, el resto del último byte en el mapa de bits no es utilizado.

Para cada campo con un valor distinto de NULL, tenemos lo siguiente:

Int32

Especifica el tamaño del valor del campo, excluyendo este tamaño. **************************************************************************** *************************** Comprobar esto, por que aquí dice _excluyendo_ y antes (línea 756) dice incluyendo??????????????***************** ****************************************************************************

Byten

Especifica el valor del campo mismo en formato binario. n es el tamaño previo.

CancelRequest (F)

Int32(16)

El tamaño del paquete en bytes.

Int32(80877102)

El código de cancelación de petición. El valor es elegido para que contenga "1234" el los 16 bits más significativos, y "5678" en los 16 bits menos significativos. Para evitar confisión, este código no debe ser el mismo que ningún número de versión del protocolo.

Int32

El ID de proceso del backend objetivo.

Int32

La clave secreta para el backend objectivo.

CompletedResponse (B)

Byte1('C')

Identifica este mensaje como una petición completada.

String

El comando. Normalmente (pero no siempre) una palabra simple que identifica que comando SQL se completó.

CopyDataRows (B y F)

Es un flujo de filas donde cada una está terminada por un Byte1('\n'). Se completa con una secuencia Byte1('\\'), Byte1('.'), Byte1('\n').

CopyInResponse (B)

Byte1('G')

Identifica el mensaje como una respuesta Start Copy In. El frontend debe enviar un mensaje CopyDataRows.

CopyOutResponse (B)

Byte1('H')

Identifica el mensaje como una respuesta Start Copy Out. Este mensaje será seguido por un mensaje CopyDataRows.

CursorResponse (B)

Byte1('P')

Identifica el mensaje como un cursor.

String

El nombre del cursor. Será "blanco" si el cursor es implícito.

EmptyQueryResponse (B)

Byte1('I')

Identifica este mensaje como una respuesta a una sentencia vacía.

String("")

Sin utilizar.

EncryptedPasswordPacket (F)

Int32

El tamaño del paquete en bytes.

String

La contraseña encriptada (mediante crypt()).

ErrorResponse (B)

Byte1('E')

Identifica el mensaje como un error.

String

El mensaje de error mismo.

FunctionCall (F)

Byte1('F')

Identifica el mensaje como una llamada a función.

String("")

Sin utilizar.

Int32

Especifica el ID de objeto de la función a llamar.

Int32

Especifica el número de argumentos que se suministran a la función.

Para cada argumento, se tiene lo siguiente:

Int32

Especifica el tamaño del valor del argumento, excluyendo este tamaño.

Byten

Especifica el valor del campo mismo en formato binario. n es el tamaño anterior.

FunctionResultResponse (B)

Byte1('V')

Identifica el mensaje como un resultado de llamada a función.

Byte1('G')

Especifica que se devolvió un resultado no vacío.

Int32

Especifica el tamaño del valor del resultado, excluyendo este tamaño.

Byten

Especifia el valor del resultado en formato binario. n Es el tamaño anterior.

Byte1('0')

Sin utilizar. (Hablando propiamente, FunctionResultResponse y FunctionVoidResponse son lo mismo pero con algunas partes opcionales en el mensaje).

FunctionVoidResponse (B)

Byte1('V')

Identifica el mensaje como un resultado de llamada a función.

Byte1('0')

Especifica que se devolvió un resultado vacío.

NoticeResponse (B)

Byte1('N')

Identifica el mensaje como una advertencia.

String

El mensaje de advertencia mismo.

NotificationResponse (B)

Byte1('A')

Identifica el mansaje como una repuesta de notificación.

Int32

El ID de proceso del proceso backend.

String

El nombre de la condición en la que se lanzó la notificación.

Query (F)

Byte1('Q')

Identifica el mensaje como una petición.

String

La petición misma.

ReadyForQuery (B)

Byte1('Z')

Identifica el tipo de mensaje. ReadyForQuery es enviado cuando el backend está listo para un nuevo ciclo de petición.

RowDescription (B)

Byte1('T')

Identifica el mensaje como una descripción de fila.

Int16

Especifica el número de campos en una fila (puede ser cero).

Para cada campo tenemos lo siguiente:

String

Especifica el nombre del campo.

Int32

Especifica el ID de objeto del tipo de campo.

Int16

Especifica el tamaño del tipo.

Int32

Especifica el modificador del tipo.

StartupPacket (F)

Int32(296)

El tamaño del paquete en bytes.

Int32

El número de versión del protocolo. Los 16 bits más significativos son el numero de versión mayor. Los 16 bits menos significativos son el número de versión menor.

LimString64

El nombre de la base de datos, por defecto el nombre del usuario si no se especifica.

LimString32

El nombre del usuario.

LimString64

Cualquier linea de argumentos para pasar al backend por el postmaster.

LimString64

Sin utilizar.

LimString64

La tty opcional que el backen debería utilizar para mensajes de depuración.

Terminate (F)

Byte1('X')

Identifica el mensaje como una terminación.

UnencryptedPasswordPacket (F)

Int32

El tamaño del paquete en bytes.

String

La contraseña sin encriptar.