おもちゃのモデル (データベースアクセスのモデル) ◯ 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$