51.7. 自协议2.0以来的变化总结
本节提供一个快速的改变检查列表,以便于那些试图将现有的客户端库更新到3.0协议的开发人员。
初始化的启动包用了一个灵活的字符串列表格式取代了固定的格式。请注意,运行时参数的会话缺省值现在可以直接在启动包中指定(实际上,你可以在使用options域之前干这件事情,但是因为options的宽度限制以及缺乏引用值中空白的方法,这并不是很安全的技巧)。
现在所有的消息在消息类型字节后面都有一个长度计数(除了启动包之外,它没有类型字节)。同时还要注意现在PasswordMessage有一个类型字节。
ErrorResponse和NoticeResponse('E' 和 'N')消息现在包含多个域, 从这些域里客户端代码可以组合出自己所希望的详细程度的错误消息。请注意个体的域通常不是用新行终止的,虽然在老的协议里发送的单个字符串总是会用新行终止。
ReadyForQuery('Z')消息包括一个事务状态指示符。
BinaryRow和DataRow消息类型之间的区别不再存在了;单个DataRow消息类型用于返回所有格式的数据。请注意DataRow的布局已经被变得更容易分析。同样,二进制值的表现形式已经改变了:它不再直接和服务器的内部表现形式绑定。
有了一种新的"扩展查询"的子协议,它增加了前端消息类型Parse、Bind、Execute、Describe、Close、Flush和Sync,以及后端消息类型ParseComplete、 BindComplete、PortalSuspended、ParameterDescription、NoData和CloseComplete。现有的客户端不用关心这个子协议,但是利用这个子协议将令我们可能提升性能或者功能。
COPY数据现在封装到了CopyData和CopyDone消息里。现在有种很好的方法从正在进行的COPY动作中的错误恢复。 最后一行的特殊的"\."不再需要了,并且在COPY OUT的过程中不再发送(在COPY IN的时候它仍然被认为是一个终止符,但是它的使用已经废弃了并且最终将被删除)。 现在支持二进制COPY。CopyInResponse和CopyOutResponse消息包括指示列数目和每个列格式的域。
FunctionCall和FunctionCallResponse消息的布局变化了。FunctionCall现在支持给函数传递NULL参数。它同样可以处理以文本或者二进制格式传递参数和检索结果。我们不用再认为FunctionCall有潜在的安全性漏洞,因为它并不提供对内部服务器数据表现形式的直接访问。
在连接启动期间,后端会为它认为客户端库感兴趣的所有参数发送ParameterStatus('S')消息。随后,如果这些参数的任何活跃值发生变化,那么将发送一条ParameterStatus消息。
RowDescription('T')消息为所描述的行的每个列运载新表的OID和列编号域。它同样还表示每个列的格式代码。
后端不再生成 CursorResponse('P')消息。
NotificationResponse('A')消息有一个附加的字符串域,它能携带来自NOTIFY事件发送者的一个"载荷"字符串。
EmptyQueryResponse('I')以前包含一个空字符串参数;现在已经被删除。