2011-10-12 107 views
0

我創建了一個記錄模塊,其將消息記錄到一個MySQL數據庫,當前的代碼位於: https://github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erlEjabberd模塊與子進程

與當前代碼的問題是,有時該連接被關閉,如結果,模塊不再工作。 正如你在代碼中看到的那樣,我將DBRef存儲在ets表中,這不是真正的好方法。

我向erlang郵件列表詢問了這個問題,他們建議我將DB Connection作爲模塊自己的子進程。這將使模塊在關閉連接時正常重啓連接。

現在我的問題是:我如何用gen_server和/或gen_mod實現這個子進程?

我是否需要創建兩個文件,或者我可以在同一個文件中完成嗎?

有沒有什麼地方可以實現這個目標的例子?

編輯:正如你可以看到在鏈接的github回購,我更新了代碼,它現在的作品,weeha! 看着mod_Archive代碼幫了我很多,雖然我沒有決定升級我的ejabberd版本。

我遇到了另一個,但現在相關的問題。在代碼中,您會看到我使用「SET NAMES UTF8」執行初始查詢以防止消息被篡改。看來,如果gen_server重新連接,這不會再次完成。有沒有我可以調用重新連接的鉤子,以便UTF8查詢每次完成?

編輯#2: 現在我切換到Emysql(https://github.com/Eonblast/Emysql),它通過直接在連接指定編碼開箱的。代碼在github上。

感謝您的幫助, 邁克爾

回答

1

在源代碼中你只應用gen_mod行爲,如果你希望有一個gen_server可以做它在同一模塊中,如果你定義的gen_server行爲很好。

一個很好的例子是ejabberd模塊mod_archive,它實現了兩種行爲。


編輯:我從來沒有真正與erlang一起「直接」使用mysql。但通過ejabberd方法,我發現它非常「容易」(你將不得不做一些設置,但相當容易)。你有方法

ejabberd_odbc:sql_query_t(Query) 

,並讓您可以找到它的模塊mod_archive_odbc上的例子。

要使用該方法(和最後一個模塊),我已經下載了mysql本地驅動程序,並將從驅動程序創建的梁放入ejabberd ebin dir中(您可以將它放在任何位置,在erlang路徑上)。 一個軟鏈接到ejabberd EBIN是我最喜歡的:

ln -s <diryouhavethedriver>/ebin/*.beam /usr/lib/ejabberd/ebin/ 

和你ejabberd.cfg做一些配置。該過程在this page on process one中描述。請注意,完整的步驟是使mysql成爲ejabberd的完整數據庫。你可能不希望這樣,所以你必須跳幾步。 希望得到這個幫助。

+0

感謝您的回答。用gen_server我會啓動數據庫連接?我怎樣才能獲得數據庫引用? –

+0

編輯答案包括一點關於MySQL,希望它有幫助 –

+0

謝謝Nuno。 關於erlang_odbc:這裏的問題是,我在服務器端使用apt的ejabberd deb來使用Debian。據我所知,deb並沒有在其中編譯odbc支持。 你知道我是否自己編譯MySQL模塊,我還可以使用erlang_odbc模塊嗎?我從來沒有嘗試過,但我不認爲它的作用:( –

2

我建議你看看一般的Erlang/OTP原則(gen_server,supervisor等)。 ejabberd依靠這種標準的Erlang架構模式。

關於您對數據庫的評論,ejabberd在管理數據庫和將查詢傳遞給MySQL方面有其自己的方式。你也應該看看它。

+0

關於Erlang/OTP:我目前正在這樣做使用o'reilly的Erlang書籍,但如果我理解正確,我還不是很有信心;) 關於db的自己的方式:請參閱我的評論 –

+0

實際上,我們不推薦使用Debian軟件包:我們的二進制包或從源代碼構建。 –