[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .

MySQL マップ

運用部隊としては 「保守性をあげるためには、一箇所に設定をまとめておきたい」 つまり 「一つの cf ファイルにいろいろ書けるようにしておきたい」 と考えます(あとで diff を取るとか考えると、このほうが便利です)。 そこで、 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 ...

		...
config.cf の中に別の名前空間を定義していると考えてもらってかまいません。 ここは Unix より MS-DOS の config.ini 形式風ですが、 Unix では該当するものが見つからないので .ini 風となりました。

RDBMS や LDAP に対し $config の情報が必要なため、 IO::Adapter は

new IO::Adapter "mysql:members", $config;
のように呼び出す必要があります。 よって、各ソフトウエアでは、つねに
new IO::Adapter $map, $config; 
と書いておく必要があります。 この $config は、 次のようなハッシュ・リファレンスになっていることが期待されています。 通常 $config は FML::Config オブジェクトそのものです。
$config => {
	[mysql:members] => {
		sql_sever => localhost
			...	
	}
}
FML::Config は .cf から上のようなハッシュ・リファレンスを構成します。 よって IO::Adapter で new() を呼び出す際には、 つねに FML::Config オブジェクトを引数で渡すようにしてください。

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

関数が呼ばれた際に、 初めて決まる変数もあるので config.cf で定義は完結しません。 lexical scope で取り扱われる変数の表現が必要になります。 現在は、この目的のために &varname 記法(下記)を使っています。

ただ、どこで呼ばれるか?を考えないと分からないので、 利用可能なローカルスコープの変数一覧表を作るのは困難です。 どうしたものかというところですが…

例: 以下は、 受信者リストとメンバーリストが食い違う例です。 メールアドレスの登録をする際に、fml_address という値が異なります。 この場合、 member と recipient は少し異なる 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'

off/on 命令を無視するとか、 fml が SQL からデータを読むだけで書き込むことはしないのであれば、 話は簡単になるわけですが… 避けるのは難しいですね。

[HOME] [github] [twitter] [blog] [fml4] [fml8] [北海道] Powered by NetBSD and [nuinui.net] .
Copyright (C) 1993-2022 Ken'ichi Fukamachi mail:< fukachan at fml.org >