文本 I/O
Informix GLS 库提供这样的函数,它们使用当前正在处理的语言环境中的信息来扫描和格式化多字节字符串、日期、数字和货币。使用这些函数来解析输入字符串或格式化输出字符串。它们在以下文档中有描述:
Informix Guide to GLS Functionality
Informix GLS Programmer's Manual
在何处将这一点应用到 UDR 的示例是对 opaque 类型外部(基于字符)格式的处理。
DBDK 为 opaque 类型输入/输出支持函数生成代码,该代码在 GLS 文本与 opaque 类型内部二进制表示法之间进行转换。
mi_get_string() 和 mi_put_string() DataBlade API 函数自动对字符串/文本数据执行代码集转换。
(对于数值数据的二进制传送,mi_put_* 和 mi_get_* 函数 — 用于 opaque 类型发送/接收支持函数 — 也会自动执行代码集转换)。
错误消息
syserrors 系统目录表存储 DataBlade 异常消息,这些消息可以通过向 mi_db_error_raise() 传递 MT_SQL 消息类型来产生。每个错误消息项都有与之相关的语言环境。当错误被产生时,服务器会设法将 CLIENT_LOCALE 与 syserrors 中的一个错误匹配。它首先进行显式匹配,如果找不到匹配的对象,则以下列 次序进行搜索,尝试部分匹配:
确切的客户机语言环境
例如:es_es.8859-1
客户机语言环境的语言 + 地域
例如:es_es
仅客户机语言环境的语言
例如:es
缺省(en_us)语言环境
UNIX 上的 en_us.8859-1,以及 NT 上的 en_us.1252。
解析出最终缺省 en_us 语言环境的方法取决于用户是否设置了 CLIENT_LOCALE:
如果未设置 CLIENT_LOCALE,则根据语言环境的部分匹配得出缺省语言环境。
如果 en_us.1252(NT)错误位于 UNIX 服务器上的 syserrors 表中,则根据 en_us 部分匹配查找消息。
如果设置了 CLIENT_LOCALE,则根据对该平台的完全匹配解析出缺省语言环境。
如果 en_us.1252(NT)错误位于 UNIX 服务器上的 syserrors 表中,则将根据 en_us.8859-1 的完全匹配查找语言环境,从而产生 "Message cannot be found" 错误。
服 务器的 9.2 发行版都将执行 en_us 语言环境的部分匹配,而不管是否设置了 CLIENT_LOCALE。同时,要意识到 BladeSmith 缺省时生成语言环境为 en_us.1252 的消息。如果您的目标是 UNIX 系统,请将语言环境更改为 en_us.8859- 1。如果您计划支持 NT 和 UNIX,请同时向两个语言环境注册同一错误消息。
您还可以将 DataBlade 异常消息翻译成您打算支持的各种特定语言,并将这些消息存储在 syserrors 系统目录 表。(顺便说一下,如果您希望使用 UDR 插入本地化的消息,请参阅下面的“从 UDR 将本地化错误消息插入到 syserrors 中”一节)。
请参阅 Informix DataBlade API Programmer's Manual 中“Exception Raising”一节和下面的示例。
跟踪消息
systracemsgs 系统目录存储可以用 gl_tprintf() 输出的 DataBlade 跟踪消息。除了翻译所有要显示给最终用户的跟踪消息以外,请务必提供 en_us 缺省消息。
请参阅 Informix DataBlade API Programmer's Manual 中的“DataBlade API Support for an Internationalized UDR”一节。
查询处理
Informix 支持用于数据库对象的名称(如表和列)的多字节字符。当然,表可以在 NCHAR 和 NVARCHAR 列中存储包含多字节字符的值。
检 查使用 mi_exec() 或 mi_exec_prepared_statement() 执行 SQL 查询的任何 UDR。如果查询可以访问用户定义的数据库对象或获取用户提供的数据,则 UDR 应该在 创建 SQL 语句和获取查询结果时准备好处理非 ASCII 字符。
示例
错误消息
RGBA DataBlade 模块实现管理计算机颜色的 opaque 类型。
用 于 RGBA 的输入函数将外部(文本)表示法转换成内部的 C 数据结构。当填充了 C 结构后, DataBlade 代码会检查每个元素是否在 0-255 内。如果用户输入 256,则根据用户的语言环境会产生与 下面相似的错误:
语言环境 错误消息
en_us.1252 (URGB1) - RGBAInput: R value 256 is not within the valid range of 0-255.
es_es.8859-1 (URGB1) - RGBAInput: el valor R 256 no calza entre los limites de 0-255.
本节描述源代码需要做什么、要将什么消息存储在 syserrors 表中,以及数据库服务器如何决定输出哪个错误。
下面的代码演示输入函数如何检查 RGBA 的红色部分以及如何产生错误。
if(Gen_RetVal->red < 0 || Gen_RetVal->red > 255)
mi_db_error_raise
(
Gen_Con, /* Connection handle */
MI_SQL, /* Message type */
"URGB1", /* SQLSTATE in syserrors */
"FUNCNAME%s", /* token takes string */
"RGBAInput", /* value for FUNCNAME */
"value%d", /* token takes an integer */
(mi_integer) Gen_RetVal->red, /* value for value token */
NULL /* No more tokens */
);
mi_db_error_raise () 调用中的 MI_SQL 消息类型表明应该根据第三个参数中的 SQLSTATE 值在 syserrors 系统目录表中查找错误。如果我们从 syserrors 系统目录进行选择,我们会看到有两个不同的 “URGB1”错误:
> select * from syserrors where sqlstate='URGB1';
sqlstate URGB1
locale en_us.1252
level 0
seqno 1
message %FUNCNAME%: R value %value% is not within the valid range of 0-255.
sqlstate URGB1
locale es_es.8859-1
level 0
seqno 1
message %FUNCNAME%: el valor R %value% no calza entre los limites de 0-255.
用以下 SQL 插入(insert)语句将这些异常消息插入到 syserrors 系统目录表中:
insert into informix.syserrors (level, seqno, sqlstate, locale, message)
values
(
0,
1,
"URGB1",
"en_us.1252",
"%FUNCNAME%: R value %value% is not within the valid range of 0-255."
);
insert into informix.syserrors (level, seqno, sqlstate, locale, message)
values
(
0,
1,
"URGB1",
"es_es.8859-1",
"%FUNCNAME%: el valor R %value% no calza entre los limites de 0-255."
);
RGBA
收起