[Perl] いつでもどこでも、すぐに Class::DBI を使いたい
お仕事でレンタルサーバー上でCGIを書く羽目になったのですが、root権限はおろかシェルも使えない環境なのでCatalystにどっぷりつかっていたボクとしては面倒くさくて気が狂いそうです。
特にDB周り。
DBI直たたきなんて非人間的な作業をやっているとバグつぶしだけで頭がおかしくなりそうです。
で、なんとかClass::DBIだけでも使えないか調べて見ました。
CDBIが依存しているクラスでXSを使っているのはversionとCloneだけです。
それならある程度環境が整っているレンタルサーバーならなんとかなるだろうってことで調べて見ると、都合のいいことにversionは--perl_onlyオプション付きでMakefile.PLすればPure Perlなクラスを作成してくれるし、CloneはClone::PPなるPure PerlなCloneクラスがありました。
で、やってみました。
まずはversionのPP版作成。
$ perl Makefile.PL --perl_only Checking if your kit is complete... Looks good Writing Makefile for version $ make cp lib/version.pm blib/lib/version.pm cp vperl/vpp.pm blib/lib/version/vpp.pmこれでblib/lib/以下にPP版が配置されてるのでこれを使います。 で、次にClone::PPの作成。
$ perl Makefile.PL Checking if your kit is complete... Looks good Writing Makefile for Clone::PP $ make cp PP.pm blib/lib/Clone/PP.pm Manifying blib/man3/Clone::PP.3pmで、Clone::PPのラッパークラスとしてCloneを作成
package Clone; use strict; use base qw/Clone::PP/; 1;これだけでOKかと。
他のモジュールは特にXSを使っていないのでこれらをまとめれば出来上がりです。
versionは影響がないにしてもClone::PPにすることによってどのぐらいパフォーマンスが落ちるかはベンチを取っていないのでわかりません。
おまけ
で、石橋さんのDateTimeのPPに関する記事をパクってに感化されてパッケージ作ってみました。
使用しているモジュールのバージョンは以下の通りです。
Class::DBI 3.0.14 Class::Accessor 0.27 Class::Data::Inheritable 0.04 Class::Trigger 0.10 Clone::PP 1.02 UNIVERSAL::moniker 0.08 Ima::DBI 0.34 DBIx::ContextualFetch 1.03
lib/以下のディレクトリがモジュール群です。
※同梱のモジュールのライセンスは改変しているものも含めて全て元のライセンスに準じます。
といいつつ全てのライセンスを追いきれてないので再配布に関して問題があるようだったらご一報願えるとありがたいです。
さらにおまけでtest/以下のディレクトリにテストCGIを入れておきました。
- CGIが動く環境に
lib/ test/ test/lib test/db test/index.cgi
のディレクトリ構成で置きます。 - test/index.cgiに実行権限、dbディレクトリに書き込み権限を与えます。
- test/index.cgiをブラウザから呼んで問題なければオッケーです。
とりあえずロリポップでSQLiteとの組み合わせで動くことは確認しました。
ちなみにロリポップはCGI::Carpが使えなくてデバッグで死にそうになったのですが川崎さんのKCatchという便利なモジュールのおかげで大分助かりました。テストCGIで使わせていただいています。