早速SQLを考えていくこととしよう。まずは「ブログ一覧」。これは簡単かと思ったが、意外と面倒くさかった。
select blog_name, blog_site_url , author_name
from mt_blog B, mt_author A, mt_permission P
where B.blog_id=P.permission_blog_id and P.permission_author_id=A.author_id
and (author_id != 1 or (author_id=1 and blog_id=1));
MTの場合、一つのWebログに対して複数の投稿者を登録できるようにするため、「ユーザ一覧」「ブログ一覧」「ユーザとブログの権限関係」それぞれが別テーブルになっている。そこで一覧として取り出すには、まずこれら3つを結合してからでなくてはいけない。さらに、これは本来望ましくない状態だが、現在はユーザID1のユーザが全体の管理者を兼ねており、権限テーブルにおいて全てのブログに出現する。これを避けるための条件が最後の行である(単にauthor_id != 1では自身のブログが出力されなくなってしまうため、こういう形になっている)。
次に最新のエントリーN(ここでは15)件。
select entry_title, blog_name, date_format(entry_created_on, '%Y/%c/%e, %T') as created_on,
concat(blog_archive_url ,lpad(entry_id, 6, '0'), '.', blog_file_extension) as entry_url
from mt_blog B, mt_entry E
where B.blog_id=E.entry_blog_id and entry_status=2
order by entry_created_on desc limit 15;
エントリーへのURL生成部分がかなり苦しい。上記では日ごとのアーカイブ生成を前提としているわけだが、これは今後変わらない保証はない。「最新」エントリーなんだから、素直にトップのURL+アンカーとするべきか…要検討といったところか。
「コメントが付いたエントリー一覧」については、トラックバックとの絡みもあって色々とややこしい。だからそれはもう少し後で検討することにして、早々に実装作業に入ろうかな。他スタッフを急かす意味でも(笑。
せっかくRDBMSに移行したので、ここらでブログ関連コンテンツについて検討しようと思う。ファイルベースのBerkeley DBと違い、RDBMSではデータ構造の把握が容易である。ごく普通にSQLが書けて、ごく普通にプログラム中からDBにアクセスする手段があれば、基本的にはどのようなことも可能なはずである。
(無論、それが余り上手いやり方ではないことは心得ている。特定の環境、バージョンに依存したコードを書くのは出来る限り避けるべきだからだ。特にMTには専用のPerl APIが用意されている。普通はそれを使うべきだろう。敢えて私が直接DBからデータを引っ張ってくる方法を採るのは、単に興味の問題に過ぎない。というか、今後の気分次第で素直にPerl APIを使用することになるかも知れない)
具体的な話に入る。コンテンツとして必要そうなのは…
こんな感じだろうか。まあ初めからそうカチッと決めておく必要もないので、今後、少し手を動かしながら色々検討していきたい。
何もかも消して構わないとのことだったので、有無を言わさず再インストールしてみた。とりあえず自分の分だけ作ってみたが、一応はうまくいっている様子。データベースにも間違いなく反映されている。これでハックするのがかなり楽になったかな。