あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Catalystでwrapするコアモジュールをつくる

前回「古いCGIをモダンにCatalystへ移植してみる」の続き。

catalyst.pl MyApp
..
cd MyApp
perl Makefile.PL
make && make test

ここまでやった後、古いCGIを読み解く必要があったのでしばらく放置。

判明したこと

  • 保存されているデータはテキストデータのみ。拡張子cgiの中にcsvが突っ込まれている。
  • エンコードにjcode.pl。共通処理が含まれているcgiが一つ。
  • HTMLはすべてヒアドキュメント。
  • CPANモジュールはいっさい使われていない。

データをDBI経由へと変更してみる

テキストデータの分量もそこそこありながら、特定のデータのみを参照する手段が存在しないため。検索機能の追加も見込んでの変更を行ってみる。

Catalystだとモジュールのテストが難しいため、コアのライブラリを作成してそれをテストすることに。

module-setup CoreApp
cd CoreApp

csvの定義をcgi内部にて見つけたので、それをもとにテーブル定義を作成する。

mkdir -p lib/CoreApp/DB/Result/
mkdir lib/CoreApp/DB/ResultSet/
  • CoreApp::DB
package CoreApp::DB;

use warnings;
use strict;
use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_namespaces();

1;
  • CoreApp::DB::Result::CSV.pm
package CoreApp::DB::Result::CSV;

use strict;
use warnings;
use base 'DBIx::Class';

__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('table_sample');
__PACKAGE__->add_unique_constraint( [qw/title/] );
__PACKAGE__->add_columns(
    "id",
    {
        data_type         => "INT",
        default_value     => undef,
        is_nullable       => 0,
        is_auto_increment => 1,
        size              => 11,
    },
    "title",
    {
        data_type     => "INT",
        default_value => 0,
    }
    "state",
    {
        data_type     => "INT",
        default_value => 0,
    }
}
__PACKAGE__->set_primary_key(qw/id title/);

1;

__END__
  • CoreApp::DB::ResultSet::CSV.pm
package CoreApp::DB::ResultSet::CSV;

use strict;
use warnings;
use base qw/DBIx::Class::ResultSet/;

1;

Makefile.PLへの追記

requires 'DBIx::Class' => '0.08112';

t/00_compile.tへの追記

BEGIN { use_ok 'CoreApp::DB' }
BEGIN { use_ok 'CoreApp::DB::Result::CSV' }
BEGIN { use_ok 'CoreApp::DB::ResultSet::CSV' }