MySQLでatomfeedsデータベースを作成する
MySQLデータベースの作成操作は、MySQL Command Line Clientを通じて行います。今回はサンプルとして、MySQLのパラメータのuserは「root」、passwordは「password」となっていますので、適宜変更してください。具体的には次のような手順となります。
- [スタート]→[すべてのプログラム]→[MySQL]→[MySQL Server 5.0]→[MySQL Command Line Client]をクリックして起動します。
- 「Enter password:」に続いて、「password」と入力します。
- 「mysql>」に続いて、「CREATE DATABASE atomfeeds;」と入力して改行します。これでデータベースが作成されます。
- 続けて、「SHOW DATABASES;」と入力して改行してみましょう。Databaseカラムの表が表示されました。データベースのリストの中に「atomfeeds」があれば成功です。
- MySQL Command Line Clientを「\q」改行で終了します。
次の図が実行画面です。
atom2msrdb_init.cgiでatomfeedsデータベースのテーブルを作成する
Atomフィードは、第1回および第2回の記事で詳細に見たように、
- フィードのついての情報(feedコンテナ要素)
- エントリ(記事)の情報(entryコンテナ要素)
の2つからなります。従って、Atomフィードのデータベースにはfeedとentryのそれぞれの要素について、テーブルが必要になります。また、2つのテーブルの共通のキーとなるカラムatomを用意し、値として「AtomフィードのURL」を持たせます。
「atom2msrdb_init.cgi」は、各feedコンテナの内容を格納する「feeds」テーブル、各entryコンテナの内容を格納する「entries」テーブルを作成します。スクリプトを置いているディレクトリで、コマンドプロンプトから「perl atom2msrdb_init.cgi」と入力し、改行して実行してください。テーブルがない場合にはエラーが出ますが、すぐさまテーブルが作成されます。テーブルが存在している場合には、現行のテーブルが破棄され、新しくテーブルが作成されます。そのため実行には注意が必要です。通常は最初の1回だけ使うということになるでしょう。最初の実行は次のようになります。
テーブルのカラム項目として、Atomのfeedコンテナ要素やentryコンテナ要素すべてを取り扱うようにはしておらず、「atom2html.cgi」で取り扱っている実用的な内容の範囲に合わせてあります。それに加えて、uqidはデータが入力される度に増える数値を格納するので入力順序を反映した項目であり、tsはタイムスタンプで、データが入力された日時を残すことにしています。memoの項目は、各フィードやエントリにメモを残せるように今後の展開の仕掛けとして加えています。
スクリプトは次のとおりです。短く簡単なので説明はしません。CREATEコマンドでテーブルを作成します。DBD::mysqlやMySQLのマニュアルを参考にしてください。
#!/Perl5.8/bin/perl.exe use strict; use warnings; use DBI; # atomfeedsデータベースに接続して、feedsテーブルを作成する。 my $dbh = DBI->connect( "DBI:mysql:database=atomfeeds;host=localhost;port=3306", "root", "password", {'RaiseError' => 1}); eval { $dbh->do("DROP TABLE feeds") }; print "Dropping feeds failed: $@\n" if $@; $dbh->do( "CREATE TABLE feeds ( uqid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ts TIMESTAMP, atom TEXT, link TEXT, ver TEXT, titl TEXT, tagli TEXT, modified TEXT, info TEXT, logo TEXT, icon TEXT, subtitle TEXT, updated TEXT, memo TEXT )" ); $dbh->disconnect(); # atomfeedsデータベースに接続して、entriesテーブルを作成する。 $dbh = DBI->connect( "DBI:mysql:database=atomfeeds;host=localhost;port=3306", "root", "password", {'RaiseError' => 1}); eval { $dbh->do("DROP TABLE entries") }; print "Dropping entries failed: $@\n" if $@; $dbh->do( "CREATE TABLE entries ( uqid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ts TIMESTAMP, atom TEXT, issued TEXT, published TEXT, link TEXT, title TEXT, content TEXT, name TEXT, modified TEXT, created TEXT, id TEXT, updated TEXT, summary TEXT, category TEXT, memo TEXT )" ); $dbh->disconnect(); exit(0);
atom2msrdb.cgiでAtom購読と同時にAtomデータベースへ入力する
「atom2msrdb.cgi」は、第1回で作成した「atom2html.cgi」に手を加えたものです。MySQLデータベースに接続して、Atomフィードから読み出した各要素を、「atom2msrdb_init.cgi」で定義した「atomfeeds」データベースのテーブルに読み込む手続きを埋め込んでいます。
本稿第1回で作成した「feeds.cgi」から、「atom2html.cgi」の代わりに「atom2msrdb.cgi」を起動するように変更すれば、HTMLでAtomフィードを変換表示すると共に、「atomfeeds」データベースにその内容を記録することができるようになります(次回、「feeds.cgi」の改訂版を示しますが、現行の「feeds.cgi」の改造を考えてみてください)。
「atom2msrdb.cgi」の全ソースコードは添付ファイルにありますので、ダウンロードして確認してください。なお、データベースにかかわるスクリプト部分の前後を#####の行でマークしています。その部分に注目して読んでください。以下、最初の部分だけ説明します。
my $dbh = DBI->connect( "DBI:mysql:database=atomfeeds;host=localhost;port=3306", "root", "password", {'RaiseError' => 1}); my $sth = $dbh->prepare(qq{SELECT * FROM feeds WHERE atom = ?}); my $c = $sth->execute($atomurl);# print "<p>*** $c ***</p>\n"; if($c eq "0E0"){ $sth = $dbh->prepare( qq{INSERT INTO feeds( atom,link,ver,title,tagline,modified, info,logo,icon,subtitle,updated) VALUES(?,?,?,?,?,?,?,?,?,?,?)}); }else{ $sth = $dbh->do( qq{UPDATE feeds SET link = ?, ver = ?, title = ?, tagline = ?, modified = ?, info = ?, logo = ?, icon = ?, subtitle = ?, updated = ? WHERE atom = ?}, undef, $feed{'link'}, $feed{'ver'}, $feed{'title'}, $feed{'tagline'}, $feed{'modified'}, $feed{'info'}, $feed{'logo'}, $feed{'icon'}, $feed{'subtitle'}, $feed{'updated'}, $atomurl); }
上記に引用した最初の行で、データベース、ホスト、ポート番号、ユーザー、パスワードを指定して、MySQLデータベースに接続します。次のprepareメソッドは、「feeds」テーブルから、atomカラムの値が一致する行の各カラムの値を取得するためのSELECTコマンドを準備します。その次のexecuteメソッドでatomカラムの値を与えてSELECT文を実行しています。
このメソッドの実行時の戻り値は、atomカラムがないような場合のエラー(0あるいはFalse)を返すか、カラム値が一致するものの数を返すか、何も起こらない場合はエラーと区別するために「0E0」を返します。「0E0」が戻る場合は、INSERTコマンドでテーブルに加えます。そうでない場合、つまり、atomカラム値が同一の行がある場合には、UPDATEコマンドを実行します。
「entries」テーブルへの追加・更新は次のように動作します。同一のlinkカラム値がない場合は、INSERTコマンドで追加、データが更新されている場合、すなわち、linkカラムの値が同じでupdatedカラムの値が違う場合は、UPDATEコマンドですべての内容を更新します。


