【发布时间】: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事务中调用。 -
事务内是什么意思?没找到你?