MySQL マップ

保守性をあげるためには、一箇所に設定をまとめておきたい。つまり、一つの 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 は FML::Config オブジェクトそのものです。
$config => {
	[mysql:members] => {
		sql_sever => localhost
			...	
	}
}
FML::Config は .cf から上のようなハッシュを構成します。 よって IO::Adapter の new() の際には、 FML::Config のオブジェクトを引数で渡せば OK です。

議論: SQL 構文を config.cf に書くには? (参照: fml-devel 204)

関数が呼ばれた時に始めて決まる変数もあるので 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 '&regexp'



[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 '&regexp'

fml 8.0 (fml-devel) project homepage is www.fml.org/software/fml8/.
fml 4.0 project homepage is www.fml.org/fml/menu.ja.html.
about one floppy bsd routers, see www.bsdrouter.org/.
other free softwares are found at www.fml.org/software/.

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>.