保守性をあげるためには、一箇所に設定をまとめておきたい。つまり、一つの cf ファイルにいろいろ書けるようにしておきたい。たとえば fml8 の 場合、config.cf の中だけに SQL の設定を書いておきたいわけです。
そこで、[mysql:members] (から終りまで、もしくは次の =head 文まで)の ブロックで、マップのタイプと識別子を表現しています。
config.cf の記述例 member_maps = mysql:members recipient_maps = mysql:recipients [mysql:members] sql_server = localhost sql_user = fml sql_password = uja sql_database = fml sql_table = ml sql_find = select * from ... ...
IO::Adapter は
new IO::Adapter "mysql:members", $config;のように呼び出します。 この $config は次のようなハッシュ・リファレンスになっていることが 期待されています。
$config => { [mysql:members] => { sql_sever => localhost ... } }FML::Config は .cf から上のようなハッシュを構成します。 よって IO::Adapter の new() の際には、 FML::Config のオブジェクトを引数で渡せば OK です。
関数が呼ばれた時に始めて決まる変数もあるので cf で全部定義することはできない。 そこで、lexical scope で取り扱われる変数の表現があれば解決だろうか? 現在では &varname 記法(下記)を使っている。
例: 以下は、受信者リストとメンバーリストが食い違う例なので、 アドレスの登録をする際に、fml_recepient という値が異なる。 その場合、member と recipient は少し異なる SQL 命令になるので 別々に定義する。 off/on 命令を無視するとか、 fml は sql からデータを読むだけで、 書き込むことはしないなら、 話は簡単になる。
member_maps = mysql:members recipient_maps = mysql:recipients [mysql:members] sql_server = localhost sql_user = fml sql_password = uja sql_database = fml sql_table = ml sql_get_next_key = select fml_address from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' sql_getline = select * from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' sql_add = insert into $sql_table values ('$ml_name', '$ml_domain', '&address', 1, 1) sql_delete = delete from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_address = '&address' sql_find = select * from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_address like '®exp' [mysql:recipients] sql_server = localhost sql_user = fml sql_password = uja sql_database = fml sql_table = ml sql_get_next_key = select fml_address from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_recipient = '1' sql_getline = select * from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_recipient = '1' sql_add = update ml set recipient = 1 where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_address = '&address' sql_delete = update ml set recipient = 0 where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_address = '&address' sql_find = select * from $sql_table where fml_ml = '$ml_name' and fml_domain = '$ml_domain' and fml_recipient = '1' and fml_address like '®exp'
author's homepage is www.fml.org/home/fukachan/.
Also, visit nuinui's world :) at www.nuinui.net.
For questions about FML, e-mail <fml-bugs@fml.org>.