Plagger::Plugin::Store::DBIC #2
DB Schema 外部におく必要ねーよなー、よく考えたらw
DBIx::Class::Schema のメリットは Plugin::Store::DBIC::Schema::SQLite とかで作って、それを外部から普通に使えるっていうことで、反対だよ。
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しか扱えないから普通にこのプラグイン以下に置けばいいのかも知れんけどなぁ。
やりたかったことリスト
- Plugin::Store::DBIC
- Plugin::Publish::SVN
- plagger_backtick.pl
1個目は Publish のほうがいいんかな、よくわからん。けどとりあえず DBIC で保存する。独自ビューワ作りたい時用。
2個目はそのまま。permalink 別になんか個別ファイル名作ってそれをコミット。更新されたフィードの diff が取れるようになるというメリット。古いエントリーが新着であがってきたとき何が更新されたんだYO! ってのがあるので欲しい。
3個目はあれです、screen のやつです。