@Gustav: Thanks for your hints, very appreciated<br><br>@Garett,<br>Thanks for your help. I'm currently trying to implement it that way :)<br><br>- Michael<br><br><div class="gmail_quote">2011/10/5 Garrett Smith <span dir="ltr"><<a href="mailto:g@rre.tt">g@rre.tt</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi Michael,<br>
<div class="im"><br>
On Wed, Oct 5, 2011 at 8:36 AM, Michael Weibel - Amiado Group<br>
<<a href="mailto:michael.weibel@amiadogroup.com">michael.weibel@amiadogroup.com</a>> wrote:<br>
> Hi all,<br>
><br>
> I'm new to erlang, new to this list and I hope here's the right place to ask this question.<br>
<br>
</div>Welcome!<br>
<div class="im"><br>
><br>
> I'm currently implementing a module for ejabberd where I need to log certain packets to a MySQL DB and I'm using the MySQL Native Driver for it.<br>
><br>
> My current implementation is on github:<br>
> <a href="https://github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erl" target="_blank">https://github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erl</a><br>


><br>
> In this file you see that I'm opening the MySQL Connection in the function "open_mysql_connection" and assign it to a ETS Table because I didn't find another way to store the DB Reference (I tried something with records but didn't succeed).<br>


><br>
> This worked pretty well but I ran into the problem that after some days/weeks the ets table didn't have the DB Reference anymore.<br>
> To prevent this, I want to create functions which setup the DB Connection again, if it doesn't have it anymore.<br>
<br>
</div>You typically don't want to do this. There's a much, much better way...<br>
<div class="im"><br>
> As I'm trying to do this I run into the problem that the informations about how to connect to the db is only in the init-function available and I don't really want to store this information also in the ets table.<br>


<br>
</div>The "go to" pattern in Erlang for what you're trying to do is a<br>
supervised process. Using standard OTP facilities, you get this:<br>
<br>
- Registration of process IDs using atoms (analogous to you storing a<br>
connection PID in ets)<br>
- Well defined "init" logic that's automatically applied when a<br>
process needs to be restarted<br>
- Encapsulation of the messy details of handling service provisioning<br>
<br>
Fortunately, the MySQL driver (at the more recent ones - there are<br>
several lineages out there) provides an OTP compliant connection<br>
process, so you can do something as simple as this:<br>
<br>
-module(my_db).<br>
<br>
-export([start_link/0, fetch/1]).<br>
<br>
start_link() -><br>
    Host = "localhost",<br>
    Port = 3306,<br>
    Db = "`my-db`",<br>
    User = "root",<br>
    Password = "password",<br>
    mysql:start_link(?MODULE, Host, Port, User, Password, Db, fun mysql_log/4).<br>
<br>
fetch(Sql) -><br>
    mysql:fetch(?MODULE, Sql).<br>
<br>
mysql_log(_Module, _Line, _Level, _FormatFun) -><br>
    ok.<br>
<br>
This is a registered process (i.e. there's one of them at runtime)<br>
that provides access to your database.<br>
<br>
The connection config in start_link/0 would typically come from an<br>
application config, which you can read using application:get_env/2.<br>
You can also create a start_link that takes the params.<br>
<br>
To use this module as a service, you need to plug it into your<br>
supervisory hierarchy. Here's what your top-level supervisor might<br>
look like:<br>
<br>
-module(my_app_sup).<br>
<br>
-behaviour(supervisor).<br>
<br>
-export([start_link/0]).<br>
<br>
-export([init/1]).<br>
<br>
-define(SERVER, ?MODULE).<br>
<br>
start_link() -><br>
    supervisor:start_link({local, ?SERVER}, ?MODULE, []).<br>
<br>
init([]) -><br>
    {ok, {{one_for_one, 5, 5},<br>
          [{my_db, {my_db, start_link, []},<br>
            permanent, 5000, worker, [my_db]}]}}.<br>
<br>
If your my_db service crashes, the supervisor will restart it. The<br>
"config" that you'd use for that restart would come from either the<br>
OTP app config. (You *could* provide it in the supervisor child spec,<br>
but I wouldn't go that way.)<br>
<br>
Erlang gives you very nice facilities to create a mini "service<br>
oriented architecture" -- you want to look for ways to create very<br>
opaque services that have drop-dead simple start/restart semantics<br>
(i.e. simple as pushing a button) and let supervisors monitor and<br>
recover failed services as needed.<br>
<br>
If for some reason you needed to dynamically configure your MySQL<br>
connection params, you could store the config in a database, external<br>
file, etc. and force a restart of your my_db process to re-read that<br>
config on init.<br>
<font color="#888888"><br>
Garrett<br>
</font></blockquote></div><br><br clear="all"><br>-- <br><div style="word-wrap:break-word">Michael Weibel<br>Entwickler<br></div><div style="word-wrap:break-word"> </div>Amiado Group AG (Axel Springer Schweiz)<br>Förrlibuckstrasse 110<br>

CH-8005 Zürich<br> <br>Zentrale<span style="white-space:pre-wrap">        </span>+41 (0)44 508 23 23<br>Direkt<span style="white-space:pre-wrap">     </span>+41 44 508 23 18<br>eMail<span style="white-space:pre-wrap"> michael.weibel</span>@<a href="http://amiadogroup.com/" target="_blank">amiadogroup.com</a><br>

<br><br><a href="http://www.amiadogroup.com/" target="_blank">www.amiadogroup.com</a> | <a href="http://www.students.ch/" target="_blank">www.students.ch</a> | <a href="http://www.usgang.ch/" target="_blank">www.usgang.ch</a> | <a href="http://www.partyguide.ch/" target="_blank">www.partyguide.ch</a> | <a href="http://www.playbay.ch/" target="_blank">www.playbay.ch</a><br>

<br>