Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
hide-k.net#blog: いつでもどこでも、すぐに Class::DBI を使いたい
[go: Go Back, main page]

« Six Apartの新サービスVox | Home | アーサー空白の15年間を語る »

[Perl]   いつでもどこでも、すぐに Class::DBI を使いたい

お仕事でレンタルサーバー上でCGIを書く羽目になったのですが、root権限はおろかシェルも使えない環境なのでCatalystにどっぷりつかっていたボクとしては面倒くさくて気が狂いそうです。

特にDB周り。

DBI直たたきなんて非人間的な作業をやっているとバグつぶしだけで頭がおかしくなりそうです。

で、なんとかClass::DBIだけでも使えないか調べて見ました。

CDBIが依存しているクラスでXSを使っているのはversionCloneだけです。
それならある程度環境が整っているレンタルサーバーならなんとかなるだろうってことで調べて見ると、都合のいいことに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-PP-Pack-0.01.zip

使用しているモジュールのバージョンは以下の通りです。

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で使わせていただいています。

Trackbacks:

このエントリーのトラックバックURL:

コメントを投稿