发送消息
UDx 可以通过报告错误并终止执行来处理问题,但在某些情况下,您可能希望发送警告并继续。例如,UDx 可能会忽略或使用意外输入的默认值,并报告它已经这样做了。C++ 和 Python 消息传递 API 支持报告不同严重性级别的消息。
Udx 对 ServerInterface
实例具有访问权限。此类具有以下按严重性顺序报告消息的方法:
-
reportError
(也会终止执行) -
reportWarning
-
reportNotice
-
reportInfo
每种方法都会生成包含以下组件的消息:
-
ID 代码:标识码,为任意整数。此代码不会与 Vertica 错误代码交互。
-
消息字符串:对问题的简要描述。
-
可选详细信息字符串:提供更多上下文信息。
-
可选提示字符串:提供其他指导。
如果重复的消息具有相同的代码和消息字符串,则即使详细信息和提示字符串不同,它们也会被压缩到一个报告中。
构造消息
UDx 通常应在进程调用期间立即报告错误。对于所有其他消息类型,请在处理期间记录信息并从 UDx 的 destroy
方法调用报告方法。如果在处理期间调用其他报告方法,则不会生成输出。
构造消息的过程特定于语言。
C++
每个 ServerInterface
报告方法均使用 ClientMessage
实参。ClientMessage
类具有以下用于设置代码和消息、详细信息及提示的方法:
-
makeMessage:
设置 ID 代码和消息字符串。 -
setDetail:
设置可选的详细信息字符串。 -
setHint:
设置可选的提示字符串。
这些方法调用可以链接起来以简化消息的创建和传递。
所有字符串都支持 printf
样式的实参和格式。
在以下示例中,函数在 processBlock
中记录问题并在 destroy
中报告它们:
class PositiveIdentity : public Vertica::ScalarFunction
{
public:
using ScalarFunction::destroy;
bool hitNotice = false;
virtual void processBlock(Vertica::ServerInterface &srvInterface,
Vertica::BlockReader &arg_reader,
Vertica::BlockWriter &res_writer)
{
do {
const Vertica::vint a = arg_reader.getIntRef(0);
if (a < 0 && a != vint_null) {
hitNotice = true;
res_writer.setInt(null);
} else {
res_writer.setInt(a);
}
res_writer.next();
} while (arg_reader.next());
}
virtual void destroy(ServerInterface &srvInterface,
const SizedColumnTypes &argTypes) override
{
if (hitNotice) {
ClientMessage msg = ClientMessage::makeMessage(100, "Passed negative argument")
.setDetail("Value set to null");
srvInterface.reportNotice(msg);
}
}
}
Python
每个 ServerInterface
报告方法都包含以下位置实参和关键字实参:
-
idCode:整数 ID 代码,为位置实参。
-
message:消息文本,为位置实参。
-
hint:可选提示文本,为关键字实参。
-
detail:可选的详细信息文本,为关键字实参。
所有实参都支持 str.format()
和 f-string
格式。
在以下示例中,函数在 processBlock
中记录问题并在 destroy
中报告它们:
class PositiveIdentity(vertica_sdk.ScalarFunction):
def __init__(self):
self.hitNotice = False
def processBlock(self, server_interface, arg_reader, res_writer):
while True:
arg = arg_reader.getInt(0)
if arg < 0 and arg is not None:
self.hitNotice = True
res_writer.setNull()
else:
res_writer.setInt(arg)
res_writer.next()
if not arg_reader.next():
break
def destroy(self, srv, argType):
if self.hitNotice:
srv.reportNotice(100, "Passed negative arguement", detail="Value set to null")
return
API
在调用 ServerInterface 报告方法之前,请使用 ClientMessage 类构造并填充消息。
ServerInterface API 会提供以下报告消息的方法:
// ClientMessage methods
template<typename... Argtypes>
static ClientMessage makeMessage(int errorcode, const char *fmt, Argtypes&&... args);
template <typename... Argtypes>
ClientMessage & setDetail(const char *fmt, Argtypes&&... args);
template <typename... Argtypes>
ClientMessage & setHint(const char *fmt, Argtypes&&... args);
// ServerInterface reporting methods
virtual void reportError(ClientMessage msg);
virtual void reportInfo(ClientMessage msg);
virtual void reportNotice(ClientMessage msg);
virtual void reportWarning(ClientMessage msg);
ServerInterface API 会提供以下报告消息的方法:
def reportError(self, code, text, hint='', detail=''):
def reportInfo(self, code, text, hint='', detail=''):
def reportNotice(self, code, text, hint='', detail=''):
def reportWarning(self, code, text, hint='', detail=''):