PostgreSQL7.0手册-开发者手册 -64. 前端/后端协议
个欠优雅的的退出可能因为任何一端的软件失效(例如.内核倾倒)产生.如果前端或后端看到一个意外的联接关闭,它应该清理并退出.前端可以选择通过 postmaster 重新建立一个新的联接 -- 如果它不想终止自己的处理的话.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
消息数据类型
本节描述消息里用到的基本数据类型.
Intn(i)
一个网络字节序(译注:高位->高地址,底位->底地址)的 n 位整数.如果声明了 i ,它就是字面(literal )值.如..Int16,Int32(42).
LimStringn(s)
一个被当成一个 '\0' 结尾的字串的 n 字节的字符数组.如果空间不够,'\0' 被忽略.如果声明了 s ,那么它是字面值.例如.LimString32,LimString64("user").
String(s)
一个传统没有长度限制的的 C 的 '\0' 结尾的字符串。如果声明了 s ,那么它是字面值.例如 String,String("user")。
注意:后端返回的字串的可能长度没有预定义的限制。所以前端必须使用良好的编码策略,使用某种可扩展的缓冲区以便能接受任何能放进内存里的东西。如果那样做不可行,则读取全长的字串然后抛弃不能放进你的定长缓冲区的结尾字符。
Byten(c)
精确的 n 字节.如果声明了 c 它是字面值.例如.Byte,Byte1('\n').
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
消息格式
本节描述各种消息的详细格式.每种消息都可以由一个前端 (F),一个 posmaster/后端(B)或者两者(F & B)发送.
AsciiRow (B)
Byte1('D')
标识消息是一个 ASCII 数据行.(一个前面的 RowDescription 消息定义该行里面的字段数和它们的数据类型.)
Byten
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位 0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为 NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
然后,每个非空的字段值(non-NULL),有下面规则:
Int32
声明字段值的尺寸,包括尺寸本身.
Byten
声明以 ASCII 字符表示的字段值本身.n 是上面的尺寸减 4.在字段数据里面没有结尾的 '\0';如果前端希望有个结束符,它必须自己追加一个.
AuthenticationOk (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(0)
声明该认证是成功的.
AuthenticationKerberosV4 (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(1)
声明需要 Kerberos V4 认证.
AuthenticationKerberosV5 (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(2)
声明需要 Kerberos V5 认证.
AuthenticationUnencryptedPassword (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(3)
声明需要一个未加密的口令.
AuthenticationEncryptedPassword (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(4)
声明需要一个加密的口令.
Byte2
加密口令使用的'种子'(salt).
BackendKeyData (B)
Byte1('K')
标识该消息是一个取消键字数据.如果前端希望能够在稍后发出 CancelRequest 消息,那么它必须保存这个值.
Int32
后端的进程号(PID).
Int32
此后端的密钥(secret key ).
BinaryRow (B)
Byte1('B')
标识消息为为二进制(数据)行.(一个前面的 RowDescription 消息定义数据行里的字段数和它们的数据类型.)
Byten
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位 0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为 NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
然后,每个非空的字段值(non-NULL),有下面规则:
Int32
声明字段值的尺寸,包括尺寸本身.
Byten
以二进制格式声明字段本身的值.n 就是上面的尺寸.
CancelRequest (F)
Int32(16)
以字节计的包尺寸.
Int32(80877102)
取消请求代码.选这个值是为了在高16位包含 "1234",低16位包含 "5678".(要避免混乱,这个代码必须与协议版本号不同.)
Int32
目标后端的进程号(PID).
Int32
目标后端的密钥(secret key ).
CompletedResponse (B)
Byte1('C')
标识此消息是一个完成响应.
String
命令标记.它通常是(但并不总是)一个单字,标识完成了哪条 SQL 命令.
CopyDataRows (B & F)
这是一个行的流,这里每行都是一个 Byte1('\n') 结尾的.后面顺序跟着 Byte1('\\'),Byte1('.'),Byte1('\n').
CopyInResponse (B)
Byte1('G')
标识这条消息是一条 Start Copy In (开始拷贝进入)响应消息.前端现在必须发送一条 CopyDataRows.
CopyOutResponse (B)
Byte1('H')
标识这条消息是一条 Start Copy Out (开始拷贝进出)响应消息.这条消息后面将跟着一条 CopyDataRows 消息.
CursorResponse (B)
Byte1('P')
标识这条消息是一条游标响应消息.
String
游标的名称.如果游标是隐含的,这个地方会是"空白" ("blank").
EmptyQueryResponse (B)
Byte1('I')
标识这条消息是对一个空查询字串的响应.
String("")
没有用.
EncryptedPasswordPacket (F)
Int32
以字节记的包的尺寸.
String
加密了(使用 crypt())的口令.
ErrorResponse (B)
Byte1('E')
标识消息是一条错误.
String
错误消息本身.
FunctionCall (F)
Byte1('F')
标识消息是一个函数调用.
String("")
未使用.
Int32
声明待调用的函数的对象标识(OI
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
消息数据类型
本节描述消息里用到的基本数据类型.
Intn(i)
一个网络字节序(译注:高位->高地址,底位->底地址)的 n 位整数.如果声明了 i ,它就是字面(literal )值.如..Int16,Int32(42).
LimStringn(s)
一个被当成一个 '\0' 结尾的字串的 n 字节的字符数组.如果空间不够,'\0' 被忽略.如果声明了 s ,那么它是字面值.例如.LimString32,LimString64("user").
String(s)
一个传统没有长度限制的的 C 的 '\0' 结尾的字符串。如果声明了 s ,那么它是字面值.例如 String,String("user")。
注意:后端返回的字串的可能长度没有预定义的限制。所以前端必须使用良好的编码策略,使用某种可扩展的缓冲区以便能接受任何能放进内存里的东西。如果那样做不可行,则读取全长的字串然后抛弃不能放进你的定长缓冲区的结尾字符。
Byten(c)
精确的 n 字节.如果声明了 c 它是字面值.例如.Byte,Byte1('\n').
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
消息格式
本节描述各种消息的详细格式.每种消息都可以由一个前端 (F),一个 posmaster/后端(B)或者两者(F & B)发送.
AsciiRow (B)
Byte1('D')
标识消息是一个 ASCII 数据行.(一个前面的 RowDescription 消息定义该行里面的字段数和它们的数据类型.)
Byten
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位 0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为 NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
然后,每个非空的字段值(non-NULL),有下面规则:
Int32
声明字段值的尺寸,包括尺寸本身.
Byten
声明以 ASCII 字符表示的字段值本身.n 是上面的尺寸减 4.在字段数据里面没有结尾的 '\0';如果前端希望有个结束符,它必须自己追加一个.
AuthenticationOk (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(0)
声明该认证是成功的.
AuthenticationKerberosV4 (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(1)
声明需要 Kerberos V4 认证.
AuthenticationKerberosV5 (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(2)
声明需要 Kerberos V5 认证.
AuthenticationUnencryptedPassword (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(3)
声明需要一个未加密的口令.
AuthenticationEncryptedPassword (B)
Byte1('R')
标识该消息是一条认证请求.
Int32(4)
声明需要一个加密的口令.
Byte2
加密口令使用的'种子'(salt).
BackendKeyData (B)
Byte1('K')
标识该消息是一个取消键字数据.如果前端希望能够在稍后发出 CancelRequest 消息,那么它必须保存这个值.
Int32
后端的进程号(PID).
Int32
此后端的密钥(secret key ).
BinaryRow (B)
Byte1('B')
标识消息为为二进制(数据)行.(一个前面的 RowDescription 消息定义数据行里的字段数和它们的数据类型.)
Byten
一个每个位对应(数据)行里一个字段的位图.第一字段对应第一字节的位7 (MSB,最高位),第二字段对应第一字节位6,第八字段对应第一字节位 0 (LSB,最低位),第九字段对应第二字节的位7,等等.如果对应域的值不为 NULL,对应位设置为1,如果字段的个数不为8的倍数,位图最后一个字节余下的位就没有用.
然后,每个非空的字段值(non-NULL),有下面规则:
Int32
声明字段值的尺寸,包括尺寸本身.
Byten
以二进制格式声明字段本身的值.n 就是上面的尺寸.
CancelRequest (F)
Int32(16)
以字节计的包尺寸.
Int32(80877102)
取消请求代码.选这个值是为了在高16位包含 "1234",低16位包含 "5678".(要避免混乱,这个代码必须与协议版本号不同.)
Int32
目标后端的进程号(PID).
Int32
目标后端的密钥(secret key ).
CompletedResponse (B)
Byte1('C')
标识此消息是一个完成响应.
String
命令标记.它通常是(但并不总是)一个单字,标识完成了哪条 SQL 命令.
CopyDataRows (B & F)
这是一个行的流,这里每行都是一个 Byte1('\n') 结尾的.后面顺序跟着 Byte1('\\'),Byte1('.'),Byte1('\n').
CopyInResponse (B)
Byte1('G')
标识这条消息是一条 Start Copy In (开始拷贝进入)响应消息.前端现在必须发送一条 CopyDataRows.
CopyOutResponse (B)
Byte1('H')
标识这条消息是一条 Start Copy Out (开始拷贝进出)响应消息.这条消息后面将跟着一条 CopyDataRows 消息.
CursorResponse (B)
Byte1('P')
标识这条消息是一条游标响应消息.
String
游标的名称.如果游标是隐含的,这个地方会是"空白" ("blank").
EmptyQueryResponse (B)
Byte1('I')
标识这条消息是对一个空查询字串的响应.
String("")
没有用.
EncryptedPasswordPacket (F)
Int32
以字节记的包的尺寸.
String
加密了(使用 crypt())的口令.
ErrorResponse (B)
Byte1('E')
标识消息是一条错误.
String
错误消息本身.
FunctionCall (F)
Byte1('F')
标识消息是一个函数调用.
String("")
未使用.
Int32
声明待调用的函数的对象标识(OI

