SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PerlでデスクトップCGI

デスクトップCGIでWebとデスクトップを融合する 第4回

MySQLでAtomフィードをデータベース化 - 前編


ダウンロード ソースコード (11.0 KB)

MySQLでatomfeedsデータベースを作成する

 MySQLデータベースの作成操作は、MySQL Command Line Clientを通じて行います。今回はサンプルとして、MySQLのパラメータのuserは「root」、passwordは「password」となっていますので、適宜変更してください。具体的には次のような手順となります。

  1. [スタート]→[すべてのプログラム]→[MySQL]→[MySQL Server 5.0]→[MySQL Command Line Client]をクリックして起動します。
  2. 「Enter password:」に続いて、「password」と入力します。
  3. 「mysql>」に続いて、「CREATE DATABASE atomfeeds;」と入力して改行します。これでデータベースが作成されます。
  4. 続けて、「SHOW DATABASES;」と入力して改行してみましょう。Databaseカラムの表が表示されました。データベースのリストの中に「atomfeeds」があれば成功です。
  5. MySQL Command Line Clientを「\q」改行で終了します。

 次の図が実行画面です。

MySQL Command Line Clientでデータベースを作成
MySQL Command Line Clientでデータベースを作成

atom2msrdb_init.cgiでatomfeedsデータベースのテーブルを作成する

 Atomフィードは、第1回および第2回の記事で詳細に見たように、

  • フィードのついての情報(feedコンテナ要素)
  • エントリ(記事)の情報(entryコンテナ要素)

 の2つからなります。従って、Atomフィードのデータベースにはfeedentryのそれぞれの要素について、テーブルが必要になります。また、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のマニュアルを参考にしてください。

atom2msrdb_init.cgi
#!/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」の全ソースコードは添付ファイルにありますので、ダウンロードして確認してください。なお、データベースにかかわるスクリプト部分の前後を#####の行でマークしています。その部分に注目して読んでください。以下、最初の部分だけ説明します。

atom2msrdb.cgiのfeedsテーブルへの問い合わせ部分
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コマンドですべての内容を更新します。

次のページ
実行画面

この記事は参考になりましたか?

PerlでデスクトップCGI連載記事一覧

もっと読む

この記事の著者

jscripter(ジェイスクリプター)

NIFTY SERVEのFGALEL(エントリーラボ)、FGALTS(テキスト&スクリプト)に参画し、FGALTSでシスオペを務める。現在、TSNETメンバー。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/976 2007/03/01 10:29

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー