Plagger::Plugin::Store::DBIC #2

DB Schema 外部におく必要ねーよなー、よく考えたらw

DBIx::Class::Schema のメリットは Plugin::Store::DBIC::Schema::SQLite とかで作って、それを外部から普通に使えるっていうことで、反対だよ。

by typester / at 2006-02-28T18:06:00 / plagger / Comment

どこにおこうか迷って、svk のローカルreposのみで作業していた plaggerer(何 をとりあえず僕のpublic reposにマージ。

Plagger::Plugin::Store::DBIC から使っている Schema を公開したかったので。

svk はこういうのが簡単に出来るから素敵ですねー。

昨日書いた Plugin::Store::DBIC の schema_class で指定しているクラスがこれで、その階層以下にテーブル定義があります。

sql はこんな感じ

by typester / at 2006-02-28T12:37:00 / life · plagger / Comment

Plagger::Plugin::Store::DBIC

作ってみたけどびみょーー。Schema をこっちの指定通りに作ってないとだめなんだよな。せっかく外部におけるのに。

package Plagger::Plugin::Store::DBIC;
use strict;
use warnings;
use base qw/Plagger::Plugin Class::Accessor::Fast/;

use UNIVERSAL::require;

our $VERSION = '0.01';

__PACKAGE__->mk_accessors(qw/schema/);

sub register {
    my ( $self, $c ) = @_;

    unless ( $self->conf->{schema_class} and $self->conf->{connect_info} ) {
        $c->error('schema_class and connect_info are required');
    }

    $self->conf->{schema_class}->require
        or $c->error(
        qq/Can't load schema class "@{[ $self->conf->{schema_class} ]}", $!/);

    $self->schema( $self->conf->{schema_class}
            ->connect( @{ $self->conf->{connect_info} } ) );

    $c->register_hook( $self, 'publish.feed' => \&store, );
}

sub store {
    my ( $self, $c, $args ) = @_;

    # feed
    my $feed = $self->schema->resultset('Feed')
        ->find_or_new(
        { link => $args->{feed}->link, type => $args->{feed}->type } );

    $feed->$_( $args->{feed}->$_ )
        for (qw/url image description language author updated/);

    $feed->insert_or_update;

    # feed meta
    $feed->meta->delete_all;
    for my $k ( keys %{ $args->{feed}->meta } ) {
        $feed->add_to_meta( { key => $k, value => $args->{feed}->meta->{$k}, } );
    }

    # entry
    for my $feed_entry ( @{ $args->{feed}->entries } ) {
        my $entry = $self->schema->resultset('Entry')->find_or_new(
            {   feed => $feed->id,
                link => $feed_entry->link,
            }
        );
        $entry->$_( $feed_entry->$_ )
            for qw/title author date summary body rate icon/;
        $entry->insert_or_update;

        # meta
        $entry->meta->delete_all;
        for my $k ( keys %{ $feed_entry->meta } ) {
            $entry->add_to_meta( { key => $k, value => $feed_entry->meta->{$k}, } );
        }

        # tag
        $entry->tag_mappings->delete_all;
        for my $entry_tag ( @{ $feed_entry->tags } ) {
            my $tag = $self->schema->resultset('Tag')
                ->find_or_create( { name => $entry_tag } );
            $entry->add_to_tag_mappings(
                { entry => $entry->id, tag => $tag->id } );
        }
    }
}

1;

config.yaml は

 - module: Store::DBIC
   config:
     schema_class: 'Plaggerer::Schema'
     connect_info: [ 'dbi:SQLite:/home/murase/plaggerer/db/plaggerer.db' ]

Schema ファイルを置く場所もまた問題。

この場合はPlugin指定のSchemaしか扱えないから普通にこのプラグイン以下に置けばいいのかも知れんけどなぁ。

by typester / at 2006-02-27T23:35:00 / perl · plagger / Comment

やりたかったことリスト

  • Plugin::Store::DBIC
  • Plugin::Publish::SVN
  • plagger_backtick.pl

1個目は Publish のほうがいいんかな、よくわからん。けどとりあえず DBIC で保存する。独自ビューワ作りたい時用。

2個目はそのまま。permalink 別になんか個別ファイル名作ってそれをコミット。更新されたフィードの diff が取れるようになるというメリット。古いエントリーが新着であがってきたとき何が更新されたんだYO! ってのがあるので欲しい。

3個目はあれです、screen のやつです。

by typester / at 2006-02-26T21:48:00 / plagger / Comment

1 2 3 Next »

(Page 3 of 3)