atom2msrdb_read_ajax3.cgiのentry要素出力用CGI(atom2entry.cgi)
動作の概要
「atom2msrdb_read_ajax3.cgi」が出力するJavaScriptのAjax関数に埋め込まれて起動するCGIです。AtomフィードのURLと記事を特定するデータから、Atomフィードデータベースに問い合わせます。そして、記事のカテゴリ、タイトルと更新日時をtext型のHTMLフォームの形式で出力すると共に、記事の内容あるいは要約を取り出し、HTMLとして出力します。
スクリプト
#!/Perl5.8/bin/perl.exe use strict; use warnings; use DBI; use CGI qw(:cgi); use URI::Escape; # CGI 最初の部分の出力 print "Content-type: text/html; charset=UTF-8\n\n"; #print "<script language=\"Javascript\">\n<!--\n"; my $atom = param('atom'); my $id = param('id'); my $dbh = DBI->connect( "DBI:mysql:database=atomfeeds;host=localhost;port=3306", "root", "password", {'RaiseError' => 1}); my $sth = $dbh->prepare(qq{ SELECT atom, issued, published, link, title, content, name, modified, created, id, updated, summary, category FROM entries WHERE atom = \"$atom\" AND (updated = \"$id\" OR modified = \"$id\" OR title = \"$id\") }); $sth->execute(); my $updated; my $content; my $summary; while(my $row = $sth->fetchrow_hashref()){ if($row->{updated}){ $updated = $row->{updated}; }elsif($row->{modified}){ $updated = $row->{modified}; } print qq(<p><input type="text" size="30" value="$row->{category}"> <input type="text" size="80" value="$row->{title}"></p>\n); print qq(<p><input type="text" size="40" value="$updated"></p>\n); if($row->{content}){ if($row->{content} =~ /(&[a-z0-9]{2};|&#\d+;)/i && $row->{content} !~ /<pre>/i){ $content = &entities_decode($row->{content}); if($content =~ /(&[a-z0-9]{2};|&#\d+;)/i && $content !~ /<pre>/i){ print &entities_decode($content); }else{ print $content; } }else{ print $row->{content}; } }elsif($row->{summary}){ if($row->{summary} =~ /(&[a-z0-9]{2};|&#\d+;)/i && $row->{summary} !~ /<pre>/i){ $summary = &entities_decode($row->{summary}); if($summary =~ /(&[a-z0-9]{2};|&#\d+;)/i && $summary !~ /<pre>/i){ print &entities_decode($summary); }else{ print $summary; } }else{ print $row->{summary}; } } } $sth->finish(); $dbh->disconnect(); #print "//-->\n</script>\n"; exit(0); # マークアップ記号の実体参照デコード # 文字実体参照と数値文字参照の両方に対応 sub entities_decode{ my($str) = @_; $str =~ s/(<|<|<)/</g; $str =~ s/(>|>|>)/>/g; $str =~ s/('|'|')/'/g; $str =~ s/("|"|")/"/g; $str =~ s/(&|&|&)/&/g; return $str; }
デスクトップCGIの変更
Atomフィードリスト出力(feeds2.cgi)
「atom2msrdb_feeds.cgi」はAtomフィードデータベース(atomfeeds)に問い合わせて、フィードのリストを得、AtomリーダーにURLをパラメータとして与えるリンクを生成することができます。しかし、「feeds.cgi」のように新しいAtomフィードを読み取ったり、FirefoxのブックマークによるAtomフィードの管理に対応できません。
そこで「feeds.cgi」を改造して、Atomフィードを読み取り、各要素をAtomフィードデータベースに入力する「atom2msrdb.cgi」のリンクに加え、Atomフィードデータベースを読むためのリーダーCGIへのリンクを設定できるようにしました。
今のところ、「feeds2.cgi」はフレームワーク開発用の間に合わせの積み木細工ですが、いずれは、「atom2msrdb_feeds.cgi」の機能も取り込み、RSS/Atomリーダーのインターフェイスとしてまとめていく予定です。
まとめ
さて、innerHTML/Ajax版のデスクトップCGIフレームワークはいかがでしたでしょうか。本稿のAjax版とiframe版はどのように違うのか、デスクトップCGIフレームワークにおいてAjaxにはメリットはあったでしょうか。
結論から言うと、現在の使い方ではパフォーマンス的にはほとんどメリットはありません。デザイン的にはiframe版の方が良いかもしれませんが、さまざまな方法を試していくことはもっと進んだ局面で役に立つこともあるかと思います。
デスクトップCGIフレームワークにおいてはCGIからCGIを呼び出すようなスクリプトを書くことが多く、連鎖的にCGIが起動されます。その度に新たなプロセスを生成していては、パフォーマンス的には不利です。このような場合には、PerlのCGIにおいてはmod_perlを使うとよいはずです。次回は、Windowsでmod_perlを使う方法を取り上げる予定です。
ほぼ要素技術は出揃ったので、その次のステップではRSS/Atomリーダーのアプリケーションをまとめていきましょう。
