Ejabberd - 处理 SQL 查询时出错

Posted

技术标签:

【中文标题】Ejabberd - 处理 SQL 查询时出错【英文标题】:Ejabberd - Error while processing SQL Query 【发布时间】:2017-06-13 06:34:20 【问题描述】:

我正在使用钩子在 ejabberd 中编写一个模块。在其中,我触发如下 SQL 查询:-

?INFO_MSG("Packet Type:- `~p` ~n ~n ~n", [sql_queries:get_privacy_list_names_t("praful")]);

sql_queries 是 ejabberd 中的另一个模块,get_privacy_list_names_t 是其中的函数。

get_privacy_list_names_t(LUser) ->
    ejabberd_sql:sql_query_t(
      ?SQL("select @(name)s from privacy_list"
           " where username=%(LUser)s")).

它返回一个错误说:-

11:50:34.790 [error] Internal error while processing SQL query: error,badrecord,state,[ejabberd_sql,sql_query_internal,1,[file,"src/ejabberd_sql.erl",line,526],ejabberd_sql,sql_query_t,1,[file,"src/ejabberd_sql.erl",line,180],mod_sunshine,user_receive_packet,1,[file,"src/mod_sunshine.erl",line,27],ejabberd_hooks,safe_apply,4,[file,"src/ejabberd_hooks.erl",line,380],ejabberd_hooks,run_fold1,4,[file,"src/ejabberd_hooks.erl",line,364],ejabberd_c2s,process_info,2,[file,"src/ejabberd_c2s.erl",line,231],ejabberd_hooks,safe_apply,4,[file,"src/ejabberd_hooks.erl",line,380],ejabberd_hooks,run_fold1,4,[file,"src/ejabberd_hooks.erl",line,364]]

究竟是什么错误?

上面写着badrecord。这是什么?我在 erlang 中找不到这样的异常!

【问题讨论】:

ejabberd_sql.erl 的第526 行,代码尝试访问变量中的记录字段,但该变量实际上并不包含state 记录。 (错误消息没有说明它实际包含的内容。) 抱歉,没听懂。这是你指的吗? github.com/processone/ejabberd/blob/master/src/… 看起来不像完全相同的版本,所以行号是关闭的。我猜错误发生在像case State#state.db_type of 这样的行上——它试图访问变量State 中包含的state 记录中的db_type 字段,但是如果State 实际上不包含state记录,你会得到一个badrecord 错误。 (至于为什么 State 的值不对,我不知道,恐怕。) 看起来你应该调用sql_queries:get_privacy_list_names而不是sql_queries:get_privacy_list_names_t,因为带有_t后缀的函数只能在SQL事务中调用。 事务内是什么意思?没找到你? 【参考方案1】:

正如@legoscia 所提到的,sql_queries:get_privacy_list_names 而不是sql_queries:get_privacy_list_names_t,因为带有_t 后缀的函数只能在 SQL 事务中调用。

functionname(LServer, Param) ->
    ejabberd_sql:sql_query(
        LServer,
        ?SQL("select @(column)s from table "
             "where column=%(Param)s")).

【讨论】:

以上是关于Ejabberd - 处理 SQL 查询时出错的主要内容,如果未能解决你的问题,请参考以下文章

Ejabberd - 为自定义命令运行 SQL 查询

在 ejabberd 中编译新的自定义模块时出错

xmpp ejabberd - 查询用户存在

使用 strophe 和 ejabberd bosh 连接到 localhost 上的 jid 帐户时连接失败

为啥在ubuntu服务器的nod​​ejs中动态创建目录时出错?

尝试通过 express node.js 提供 ejs 文件时出错