	おもちゃのモデル (データベースアクセスのモデル)


◯ fml からデータベースドライバへの呼び出し方

 fml は次のような呼び出し方をします。

  # try to probe server
  my (%mib, %result, %misc, $error);
  &DataBaseMIBPrepare(\%mib, アクション, オプション);
  &DataBaseCtl(\%Envelope, \%mib, \%result, \%misc); 
  if ($mib{'error'}) {
      エラーを記録する ( &Mesg() とか &Log() )
      もしくはエラーだったら何かをするコードを書く
  }

 典型的な例はこのようになります。

   &DataBaseMIBPrepare(\%mib, 'member_p', {'address' => $From_address});

 &DataBaseMIBPrepare() は $mib{'_action'} にデータベースドライバへ
 して欲しいアクションを指定します。
 エラーが発生した場合は $mib{'error'} にエラーが記述されています。


◯ ライブラリの関係 

             fml -> libdatabaes.pl -> 各ドライバ

  fml の中 
      ↓
    &DataBaseCtl() ( libdatabases.pl で定義されている)
         ↓
       利用するデータベースごと、スキーマごとのドライバへ
                  ↓
              例えば /usr/local/fml/databaes/ldap/toymodel.pl


toymodel.pl には実際に LDAP サーバと通信する泥くさい部分が全て記述され
ていなければならない。逆に libdatabases.pl にはそれらを書いてはいけな
い。



◯ データベースドライバがするべきこと

ldap/toymodel.pl を例にとります。各スキーマとプロトコルごとに同様の関
数群を定義して下さい。

$mib->{'_action'} には次のようなものがあります。
＊ 行は従来の fml では何に相当するのかを説明しています。 


	get_status
		$mib->{'_address'} のメールアドレスのモード
		例: まとめおくりか否か？

		$mib{'_result'} に値を入れて返すと、
		status コマンドはその値をそのままメールに入れて
		返します。

		＊ status コマンドが使います。

	num_active
		配送先メールアドレスの総数

		＊ wc /var/spool/ml/elena/actives に相当します。

	num_member
		投稿可能なメールアドレスの総数

		＊ wc /var/spool/ml/elena/members に相当します。


	get_active_list
	dump_active_list

		SQL/LDAP から配送リストのメールアドレス一覧を取りだし、	
		$mib->{'_cache_file'} で指定されたファイルに
		書きこんでください。

		* つまり actives ファイルを疑似的につくって下さい。

	get_member_list
	dump_member_list

		SQL/LDAP からメンバーリストのメールアドレス一覧を取りだし、
		$mib->{'_cache_file'} で指定されたファイルに
		書きこんでください。

		* つまり members ファイルを疑似的につくって下さい。

	active_p

		$mib->{'_address'} アドレスは配送先のリストに
		含まれてますか？
		$mib->{'_result'} に 1 (yes) か 0 (no) をいれてください。

		＊ actives ファイルにメールアドレスがありますか？

	member_p

		$mib->{'_address'} アドレスは投稿可能なアドレスですか？
		$mib->{'_result'} に 1 (yes) か 0 (no) をいれてください。

		＊ members ファイルにメールアドレスがありますか？

	admin_member_p

		$mib->{'_address'} アドレスはリモート管理者として
		登録されているか？
		$mib->{'_result'} に 1 (yes) か 0 (no) をいれてください。

		＊ members-admin ファイルにメールアドレスがありますか？


	add
	bye
	subscribe
	unsubscribe
	on
	off
	addadmin
	byeadmin

		$mib->{'_address'} アドレスについて
		データベースをいじってください。
		* makefml やコマンドメールで使っているコマンドと同じ意味です。

	add2actives
	addactives
	add2members
	addmembers

		どちらかのファイルにのみアドレスを加えます。
		* makefml やコマンドメールで使っているコマンドと同じ意味です。

	chaddr

		_old_address と _new_address が渡されます。
		データベース上の _old_address を _new-address に
		差し替えて下さい。

		* makefml やコマンドメールで使っているコマンドと同じ意味です。

	digest
	matome

		パラメータが $mib->{'_value'} で渡されます。
		この値で入れ換えて下さい。
		例えば $mib->{'_value'} の値は m=3u などとなっています。
		* makefml やコマンドメールで使っているコマンドと同じ意味です。

	store_article

		配送された記事を DB に入れたいならこのためのコードを
		書いて下さい。

		記事の配送直後に呼び出されます。
		Distribute() の最後で、$DISTRIBUTE_END_HOOK よりも後に
		呼び出されています。

		エラーにならないようにしてありますが、実体は一行もありません。
		記事を largeobject (PostgreSQL)にするなり、
		ファイルのPATHをDBに入れるなりはお好きなSCHEMAを
		書いて下さい。

		データベースの関数を呼び出す際に
		$e で %Envelope への reference が渡されているので
		$e->{'Body'} で中身が見えます。
		また $mib->{'_article_id'} で記事番号がわかります。

	store_subscribe_mail
		（うーん、このキーワードは変じゃないかい？？）

		自動登録の関数の最後で呼ばれます。
		自動登録のメールをDBにいれたいなら
		前述の store_article のようなものを書いて下さい。

		でも『confirm 数字』だけのメールの可能性が大です;-)


----------
$FML: TOY_MODEL.Japanese,v 1.7.2.1 2003/01/18 02:32:29 fukachan Exp $
