Apache 1.3モジュールの開発
以前購入したApacheモジュール プログラミングガイドを活用する日がやって来ました。C言語の初心者でも比較的取っ付きやすく書かれています。Apacheのモジュールは、あらかじめ提供されているap_*系の関数を使えばかなり安全なコードが書けるんですね。
さて、まともにCを使ってコードを書くのはこれが初めてですが、普段JavaやRubyで可変長のリストに頼りまくっているため、単純な配列のみであれこれやろうとするとすぐにハマります。Apacheが提供するtableやarray_headerはなかなか便利なんですが、メンバがchar *に限られるようで、「構造体を格納できるハッシュはどこかに無いんかー」と叫びたくなってきます。まあ、それでもなんとか三日ほどで動くモジュールが作れましたので(User-Agentの内容に応じてレスポンスヘッダを加工する程度のもの)、Apacheモジュール プログラミングガイドはいい本です。
それにしても、Apacheモジュールの処理性能はさすがですね。効率度外視で書いたのにオーバーヘッドをまったく感じさせない。

oyama, 12 月 17th, 2003 at 20:51 [Comment]
評価して頂けてとても感謝しています。ありがとうございます。
「構造体を格納できるハッシュ」についてですが、きちんとキャストしてあげればtable型に任意の型のポインタを保持させることができます。
typdef struct {
/* いろいろ */
} my_rec;
my_rec *src, *dist;
table *t;
t = ap_make_table(r->pool, 1);
src = ap_palloc(r->pool, sizeof(my_rec));
ap_table_setn(t, “KEY”, (const char *)src);
dist = (my_rec *)ap_table_get(t, “KEY”);
ap_table_set()ではなく、ap_table_setn()を使っているのがミソです。ap_table_set()は受け取った値を内部で文字列として複製(ap_pstrdup)した上でtableにセットしますが、ap_table_setn()では複製を行わずに直接ポインタをtableにセットします。
すんません、この辺はApacheモジュールプログラミングガイドでは書いていていませんね(汗) 私のWebサイトにCookbook的な話題を貯めていこうと考えてはいるのですが、あまり進んでいません。。。
juno, 12 月 18th, 2003 at 11:11 [Comment]
おー、コード例まで書いていただいて、わざわざありがとうございます。だいぶコーディングが楽になりそうです。
http://module.jp/ のほうもチェックさせて頂きます。