发送消息

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=''):