ハッシュをRDBのテーブルをラップしたDaoのように扱うモジュール

ハッシュをRDBのテーブルをラップしたDaoのように扱うモジュールHash::FakeDao.pmを作りました。
↓ここに置いてあります。
http://briefcase.yahoo.co.jp/gohannnotomo/
使用・改変は自由ですが、著作権は私に帰属します。(念のため)

使い方

ハッシュをDaoのように扱う(追加・更新・削除)

newメソッドにハッシュリファレンスを渡すとそのハッシュをDaoのように扱うことができます。

$sample = {
          '1' => {
                   'id' => '1',
                   'value1' => 'sample11',
                   'value2' => 'sample12',
                   'value3' => 'sample13'
                 },
          '2' => {
                   'id' => 2,
                   'value1' => 'sample21',
                   'value2' => 'sample22',
                   'value3' => 'sample23'
                 }
        };
my $fd = Hash::FakeDao->new($sample);

insertメソッドでレコードを追加します。このとき、自動的にidというカラムが作成され、ハッシュのキーと同じ値が格納されます。

$fd->insert({
    'value1' => "a1",
    'value2' => "a1",
    'value3' => "a1"
});

updateメソッドでレコードを更新します。引数にとして渡すハッシュに指定されていないカラムは更新されません。

$fd->update({
   'id' => '1',               #更新したいレコードのidを必ず指定してください。
   'value1' => 'up_sample11',
   'value3' => 'up_sample13'
});

deleteメソッドを使用すると引数に指定されたidを持つレコードが削除されます。

$fd->delete(2);

#実行結果

print Dumper($fd->hash);
#$VAR1 = {
#          '1' => {
#                   'id' => '1',
#                   'value1' => 'up_sample11',
#                   'value2' => 'sample12',
#                   'value3' => 'up_sample13'
#                 },
#          '3' => {
#                   'id' => 3,
#                   'value1' => 'a1',
#                   'value2' => 'a1',
#                   'value3' => 'a1'
#                 }
#        };
Hash::FakeDaoを使用してハッシュを作成する

newメソッドに何も渡さない場合でも、Hash::FakeDaoクラスのインスタンスは作成されます。insertメソッドでレコードを新規に作成できます。

my $fd = Hash::FakeDao->new();
$fd->insert({
    'value1' => "a1",
    'value2' => "a1",
    'value3' => "a1",
});
$fd->insert({
    'value1' => "b1",
    'value2' => "b1",
    'value3' => "b1",
});

#実行結果

print Dumper($fd->hash);
#$VAR1 = {
#          '1' => {
#                   'value1' => 'a1',
#                   'id' => '1',
#                   'value3' => 'a1',
#                   'value2' => 'a1'
#                 },
#          '2' => {
#                   'value1' => 'b1',
#                   'id' => 2,
#                   'value3' => 'b1',
#                   'value2' => 'b1'
#                 }
#        };
idを指定して1件のレコードを取得する

retrieveメソッドを使用すると引数にidを指定して1件のレコードを取得できます。

$sample = {
          '1' => {
                   'id' => '1',
                   'value1' => 'sample11',
                   'value2' => 'sample12',
                   'value3' => 'sample13'
                 },
          '2' => {
                   'id' => 2,
                   'value1' => 'sample21',
                   'value2' => 'sample22',
                   'value3' => 'sample23'
                 },
          '3' => {
                   'id' => 3,
                   'value1' => 'sample31',
                   'value2' => 'sample32',
                   'value3' => 'sample33'
                 }
        };
my $fd = Hash::FakeDao->new($sample);
my $record = $fd->retrieve(2);

#実行結果

print Dumper($record);
#$VAR1 = {
#          'id' => 2,
#          'value1' => 'sample21',
#          'value2' => 'sample22',
#          'value3' => 'sample23'
#        };
複数のレコードを配列として取得する

retrieve_allメソッドを使用すると引数に指定した条件に応じて複数のレコードを配列として取得できます。

$sample = {
          '1' => {
                   'id' => '1',
                   'value1' => 'sample11',
                   'value2' => '2',
                   'value3' => 'sample13'
                 },
          '2' => {
                   'id' => 2,
                   'value1' => 'sample21',
                   'value2' => '1',
                   'value3' => '2'
                 },
          '3' => {
                   'id' => 3,
                   'value1' => 'sample31',
                   'value2' => '1',
                   'value3' => '1'
                 },
          '4' => {
                   'id' => 4,
                   'value1' => 'sample31',
                   'value2' => '1',
                   'value3' => '0'
                 }
        };
my $fd = Hash::FakeDao->new($sample);
my @records = $fd->retrieve_all(
    {
        'where' => {'value2' => '1'},#検索条件:value2の値が1に等しい
        'order' => ['value3#desc'],  #ソート順:value3の値の逆順で
        'limit' => 2                 #取得件数:2件取得
    }
    );

#実行結果

print Dumper(\@records);
#$VAR1 = [
#          {
#            'id' => 2,
#            'value1' => 'sample21',
#            'value2' => 1,
#            'value3' => 2
#          },
#          {
#            'id' => 3,
#            'value1' => 'sample31',
#            'value2' => 1,
#            'value3' => 1
#          }
#        ];