「 2009年10月27日 」一覧

v10 の class

v10 から class が変更されたみたいなのでちょっと試してみた。
参考はこれ。
v10 new class
要素が {name}{value} のように分かれたみたい。
v9 までのように lindex だと要素を全部持ってきちゃうから参照できない。
というわけで “class” コマンドが追加されました。
例えば
class element -value 0 “class名”
とやると index 0 の value だけ持ってこれる。
そこそこ便利な気がしたので上の URL にある例を試してみた。

/var/class/app_class.dat:
"/trxdef/" := "trx_pool",
"/aaa/" := "aaa_pool",
"/abscon/" := "abs_pool",
class app_class {
type string
filename app_class.dat
}
rule app_director {
when CLIENT_ACCEPTED {
set default_pool [LB::server pool]
}
when HTTP_REQUEST {
set app_pool [class match -value [HTTP::uri] starts_with app_class]
if {$app_pool ne ""} {
pool $app_pool
} else {
pool $default_pool
}
}
}

external file の app_class.dat を参照して URI に応じて使用する pool を分ける。
結構よくある例だと思います。
class match だと index を返すだけなんじゃないのと思ったけど、-value を指定することで value を返してくれるらしい。
if とか switch を使うよりは私は分かりやすいと思います。
ただこれは external file を使った時だけ。
普通に class 使ってみたけど動かなくて悩んでたら書いてあった。

The new class command, implemented in v10.0.0, allows for the use of extended functionality built into external data groups. These commands work for both internal and external (file-based) data groups, but internal data groups are not able to make use of the name/value pairing with the := separator.

最初に読むべきでした。
これが使えるかわかんないけど、選択肢が増えたかも。