12月 052015
この記事はVarnish Cache Advent Calendar 2015の4日目の記事になります。
VCLには様々な変数の型がありまして、それぞれの型の間では暗黙的に変換されるものと、vmod_stdを使用して明示的に変換するものがあります。
型が結構多いのでいまいち何を使うか忘れることが多いので図にしてみました。
なお、ここでは特に変換にかかわらない型については取り上げていません(BLOB,ENUM,HTTP,PRIV_CALL,PRIV_VCL,PRIV_TASK,PRIV_TOP,PROBE,VOID)
ちなみに各型から暗黙的にSTRINGへ変換すると以下のようになります。
型 | 変換例 |
---|---|
BYTES | 2.000 |
DURATION | 2.000 |
REAL | 2.000 |
BOOL | false |
BACKEND | default |
INT | 1 |
IP | 192.168.1.1 |
TIME | Fri, 04 Dec 2015 18:31:12 GMT |
HEADER | example.net |
また、STRING_LISTですが基本的にはSTRINGと特に違いはないのですが、
これを引数として受け付ける関数の場合は型変換を意識しないとハマります。
例えばstd.logというログを出力する関数があるのですが、これは引数がSTRING_LISTです。
それを意識して以下のようなVCLを書くとエラーになります。
std.log(std.duration("10w",0s));
Command failed with error code 106 Message from VCC-compiler: Wrong argument type. Expected STRING_LIST. Got DURATION. ('input' Line 31 Pos 31) std.log(std.duration("10w",0s)); ------------------------------#- ('input' Line 31 Pos 1) -- ('input' Line 31 Pos 30) std.log(std.duration("10w",0s)); ##############################-- Running VCC-compiler failed, exited with 2
これはdurationから一気にSTRING_LISTに暗黙的に変換できないからです。
そこでどうやるかというと、一度STRINGを経由させてあげればよいので
std.log("" + std.duration("10w",0s));
このように空文字を結合すると良いです。
まとめ
変数がどのように型変換が出きるかを知っておくと、その型では出来ない演算を変換した先でやって戻すみたいなことが出来ます。
覚えておくと結構便利なので、頭の片隅に置いておくと良いかなと思います。