2017-06-13 24 views
0

フックを使用してejabberdでモジュールを作成しています。その中で、私は次のようにSQLクエリ火災: -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はそれで機能です。

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}]}]} 

正確に誤りがある何を - :

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

それは言ってエラーを返しますか?

badrecordと書かれています。これは何ですか?私はerlangでそのような例外を見つけることができませんでした!

+0

'ejabberd_sql.erl'の526行で、コードは変数のレコードフィールドにアクセスしようとしますが、その変数には実際には' state'レコードが含まれていません。 (エラーメッセージは実際に何が含まれているかは分かりません) – legoscia

+0

申し訳ありませんが、あなたを取得しません。あなたはこれを参考にしていますか? https://github.com/processone/ejabberd/blob/master/src/ejabberd_sql.erl#L526 – PythonEnthusiast

+1

正確に同じバージョンではないので、行番号はオフです。エラーは 'case state#state.db_type of'のような行で発生します。変数' State'に含まれる 'state'レコードの' db_type'フィールドにアクセスしようとしますが、 'State'が実際に 'state'レコードが含まれていると、' badrecord'エラーが発生します。 (_why_ 'State'は間違った値を持っていますが、私は心配していません) – legoscia

答えて

1

sql_queries:get_privacy_list_names_tの代わりに@legoscia、sql_queries:get_privacy_list_namesのように、_tの関数はSQLトランザクション内からのみ呼び出す必要があります。

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